C#数据类型为SQL Server数据类型

如何将C#数据类型“转换”为SQL Server数据类型(已知SqlDbType

即:

 C# -> "String" SQL Server -> N'String' 

试试这个:它是一个Extension类,所以在你要使用这些方法的文件上添加:

 using Utility; 

这是代码:

 using System; using System.Data; using Microsoft.SqlServer.Server; namespace Utility { public static class TypeExtension { public static SqlDbType ToSqlDbType(this Type clrType) { var s = new SqlMetaData("", SqlDbType.NVarChar, clrType); return s.SqlDbType; } public static Type ToClrType(SqlDbType sqlType) { switch (sqlType) { case SqlDbType.BigInt: return typeof (long?); case SqlDbType.Binary: case SqlDbType.Image: case SqlDbType.Timestamp: case SqlDbType.VarBinary: return typeof (byte[]); case SqlDbType.Bit: return typeof (bool?); case SqlDbType.Char: case SqlDbType.NChar: case SqlDbType.NText: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.VarChar: case SqlDbType.Xml: return typeof (string); case SqlDbType.DateTime: case SqlDbType.SmallDateTime: case SqlDbType.Date: case SqlDbType.Time: case SqlDbType.DateTime2: return typeof (DateTime?); case SqlDbType.Decimal: case SqlDbType.Money: case SqlDbType.SmallMoney: return typeof (decimal?); case SqlDbType.Float: return typeof (double?); case SqlDbType.Int: return typeof (int?); case SqlDbType.Real: return typeof (float?); case SqlDbType.UniqueIdentifier: return typeof (Guid?); case SqlDbType.SmallInt: return typeof (short?); case SqlDbType.TinyInt: return typeof (byte?); case SqlDbType.Variant: case SqlDbType.Udt: return typeof (object); case SqlDbType.Structured: return typeof (DataTable); case SqlDbType.DateTimeOffset: return typeof (DateTimeOffset?); default: throw new ArgumentOutOfRangeException("sqlType"); } } } } 

首先,您可以从MSDN获取映射列表。 他们可以在这里找到。

然后,只需创建一个哈希表(HashTable)来查找一个类型并将其转换为相关的SqlDbType。 像这样的东西:

 private static types = new HashTable(); public static SqlDbType GetSqlDbType(Type type) { if (types == null) { var types = new HashTable(); types.Add(int.GetType(), SqlDbType.Int); // And so forth... } return types[type]; } 

或者说是这样的话。 当然,还是StyleCop合规性和可维护性的重构。 (在没有IDE的情况下,我只用一杯咖啡就把它写在了我的头顶。)

编辑

请注意,在处理.NET字符串的解析时,这会变得模糊。 它是varchar,nvarchar,文本还是备忘录? 在这些情况下,此方法无法知道任何方法,并且在根据表和列名称(或过程和参数名称)调用方法后,您可能必须做出更明智的决策。

我不知道如何做这样的转换,但可能有更好的方法:

我假设您要使用C#将值插入SQL查询中。

为什么不使用参数?

代替:

 SqlCommand command = new SqlCommand(String.Format( "SELECT * FROM MyTable WHERE mycolumn = {0}", ConvertValueToSql(whateverobject))); // ConvertValueToSql is what you are asking basically 

尝试这样做:

 // Conversion list of used types Dictionary typeConversion = new Dictionary(); typeConversion.Add(typeof(String), SqlDbType.NVarChar); typeConversion.Add(typeof(Int32), SqlDbType.Integer); // you can even do this if you want typeConversion.Add(typeof(MyCustomImageClass), SqlDbType.VarBinary); typeConversion.Add(typeof(MyOtherNiceClass), SqlDbType.NVarChar); // In the method SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE mycolumn = @Value"); command.Parameters.Add(new SqlParameter("@Value", typeConversion[whateverobject.GetType()]) { Value = whateverobject } ); 

这是一个旧的,但仍然有效的问题,所以这是一个不同的方式。 有人已经做了这个编码。 如果您执行类似于此的查询…

 select @@serverName as [Varchar], GetDate() as [DateTime], 3.14159 as [Decimal], 256 as [Int], : : -- And So On 

…您的数据库驱动程序将为您执行数据类型映射。 您只需检索数据并访问生成的列定义。 列名称将是DBMS数据类型(名称),列数据类型将是您正在使用的任何语言的数据类型。 您的查询可以限于您关注的特定DBMS数据类型。 请注意,这不限于任何特定的数据库管理系统。 需要注意的是,这并不能告诉您哪些数据类型需要长度参数。