如何将 C# 数据类型“转换”为 SQL Server 数据类型(SqlDbType
已知)
IE:
C# -> "String"
SQL Server -> N'String'
如何将 C# 数据类型“转换”为 SQL Server 数据类型(SqlDbType
已知)
IE:
C# -> "String"
SQL Server -> N'String'
试试这个:它是一个扩展类,所以在你想要使用这些方法的文件上添加:
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<Type, SqlDbType>();
public static SqlDbType GetSqlDbType(Type type)
{
if (types == null)
{
var types = new HashTable<Type, SqlDbType>();
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<Type, SqlDbType> typeConversion = new Dictionary<Type, SqlDbType>();
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 数据类型。请注意,这不限于任何特定的数据库管理系统。需要注意的是,这并没有告诉您哪些数据类型需要长度参数。