给定一个T-SQL类型为字符串,将其求值为.Net类型的最简单方法是什么
本文关键字:类型 Net 是什么 方法 最简单 字符串 T-SQL 一个 | 更新日期: 2023-09-27 18:27:28
如果给定一个包含SQLServer/T-SQL数据类型的字符串,将该字符串求值为.Net类型的最简单方法是什么?
例如,如果您有一个包含"nvarchar"的字符串,则转换方法返回的结果应该是System.String
类型。如果我有一个包含"int"的字符串,那么结果应该是System.Int32
类型对象。
我可以很容易地编写一个函数,该函数接受SQL数据类型字符串,并通过返回.Net Type对象的switch/case语句发送该字符串。然而,我不确定.Net框架中是否有一个我忽略的函数已经实现了这一点。
将SQL Server数据类型解析为.Net数据类型的最简单/正确方法是什么?
附加上下文
在我的例子中,我实际上有一个存储过程,它返回一些关于数据的元信息。具体来说,返回一个字符串字段,其中包含一个sql类型值,该值可以是SQLServer2005中可用的任何sql类型。
我的存储过程有可能返回任何sql类型——int
、smallint
、datetime
、binary
等。我需要获取此数据类型并将其转换为.Net Type
对象。
Matthew在下面的评论直接从微软的文档中提供了所有必要的映射信息,但我想知道System.Data
或System.Data.SqlClient
命名空间中是否集成了一些东西。
据我所知,没有任何公开的信息。在System.Data.SqlClient代码的深处,有一个函数用于确定类型映射:
internal Type GetTypeFromStorageType(bool isSqlType)
{
if (isSqlType)
{
switch (this._type)
{
case StorageType.Empty:
return null;
case StorageType.Boolean:
return typeof(SqlBoolean);
case StorageType.Byte:
return typeof(SqlByte);
case StorageType.DateTime:
return typeof(SqlDateTime);
case StorageType.Decimal:
return typeof(SqlDecimal);
case StorageType.Double:
return typeof(SqlDouble);
case StorageType.Int16:
return typeof(SqlInt16);
case StorageType.Int32:
return typeof(SqlInt32);
case StorageType.Int64:
return typeof(SqlInt64);
case StorageType.Money:
return typeof(SqlMoney);
case StorageType.Single:
return typeof(SqlSingle);
case StorageType.String:
return typeof(SqlString);
case StorageType.SqlBinary:
return typeof(object);
case StorageType.SqlCachedBuffer:
return typeof(SqlString);
case StorageType.SqlGuid:
return typeof(object);
case StorageType.SqlXml:
return typeof(SqlXml);
}
}
else
{
switch (this._type)
{
case StorageType.Empty:
return null;
case StorageType.Boolean:
return typeof(bool);
case StorageType.Byte:
return typeof(byte);
case StorageType.DateTime:
return typeof(DateTime);
case StorageType.Decimal:
return typeof(decimal);
case StorageType.Double:
return typeof(double);
case StorageType.Int16:
return typeof(short);
case StorageType.Int32:
return typeof(int);
case StorageType.Int64:
return typeof(long);
case StorageType.Money:
return typeof(decimal);
case StorageType.Single:
return typeof(float);
case StorageType.String:
return typeof(string);
case StorageType.SqlBinary:
return typeof(byte[]);
case StorageType.SqlCachedBuffer:
return typeof(string);
case StorageType.SqlGuid:
return typeof(Guid);
case StorageType.SqlXml:
return typeof(string);
}
}
return null;
}
尝试下面的函数。我相信你可以根据自己的需要进行调整。如果遗漏了什么,您将获得异常:
public static Type SqlTypeToType(string type)
{
string[] tokens = type.Split(new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
string typeFamily = tokens[0].ToLowerInvariant();
string size = tokens.Length > 1 ? tokens[1] : string.Empty;
switch (typeFamily)
{
case "bigint":
return typeof(long);
case "binary":
return size == "1" ? typeof(byte) : typeof(byte[]);
case "bit":
return typeof(bool);
case "char":
return size == "1" ? typeof(char) : typeof(string);
case "datetime":
return typeof(DateTime);
case "datetime2":
return typeof(DateTime);
case "decimal":
return typeof(decimal);
case "float":
return typeof(double);
case "image":
return typeof(byte[]);
case "int":
return typeof(int);
case "money":
return typeof(decimal);
case "nchar":
return size == "1" ? typeof(char) : typeof(string);
case "ntext":
return typeof(string);
case "nvarchar":
return typeof(string);
case "real":
return typeof(float);
case "uniqueidentifier":
return typeof(Guid);
case "smalldatetime":
return typeof(DateTime);
case "smallint":
return typeof(short);
case "smallmoney":
return typeof(decimal);
case "sql_variant":
return typeof(object);
case "text":
return typeof(string);
case "time":
return typeof(TimeSpan);
case "tinyint":
return typeof(byte);
case "varbinary":
return typeof(byte[]);
case "varchar":
return typeof(string);
case "variant":
return typeof(string);
case "xml":
return typeof(string);
default:
throw new ArgumentException(string.Format("There is no .Net type specified for mapping T-SQL type '{0}'.", type));
}
}