是否有从DataColumn.DataType转到SqlDbType的转换器?或者我必须写一个方法来做它?
答案 0 :(得分:10)
这是我的解决方案,它使用内置的.NET功能:
/// <summary>
/// Get the equivalent SQL data type of the given type.
/// </summary>
/// <param name="type">Type to get the SQL type equivalent of</param>
public static SqlDbType GetSqlType(Type type)
{
if (type == typeof(string))
return SqlDbType.NVarChar;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
type = Nullable.GetUnderlyingType(type);
var param = new SqlParameter("", Activator.CreateInstance(type));
return param.SqlDbType;
}
请注意,这将始终将字符串设置为NVarChar(此问题的任何通用解决方案将具有相同的问题,因为无法知道正确的SqlDbType)。当对非NVarChar的列使用此参数化SELECT或UPDATE查询时,在将NC / NVarChar与Char / VarChar类型进行比较时,SqlServer的性能会下降,因为它正在为每次比较转换值。这最近让我很难(一个过程从4分钟到140多分钟),所以在你可以的时候总是明确你的char参数类型!我想其他类似的类型可能有同样的问题,但没有一个导致我的问题(还)。
答案 1 :(得分:6)
没有现成的方法可以执行此操作 - 您需要滚动函数来执行此操作或缓存Dictionary<Type, SqlDbType>
以进行查找。
答案 2 :(得分:1)
这样的事情可能是一个好的开始。它并不全面,但让我到了我需要去的地方:
Dictionary<Type, SqlDbType> GetSQLTypeConversionMap()
{
var result = new Dictionary<Type, SqlDbType>();
result.Add(typeof(string), SqlDbType.VarChar);
result.Add(typeof(Int16), SqlDbType.Int);
result.Add(typeof(Int32), SqlDbType.Int);
result.Add(typeof(DateTime), SqlDbType.DateTime2);
return result;
}
答案 3 :(得分:1)
我在Dot Net Pulse和CodeProject找到了几个选项。我最终使用从VB.NET转换为C#的CodeProject代码:
private SqlDbType GetDBType(System.Type theType)
{
System.Data.SqlClient.SqlParameter p1;
System.ComponentModel.TypeConverter tc;
p1 = new System.Data.SqlClient.SqlParameter();
tc = System.ComponentModel.TypeDescriptor.GetConverter(p1.DbType);
if (tc.CanConvertFrom(theType)) {
p1.DbType = (DbType)tc.ConvertFrom(theType.Name);
} else {
//Try brute force
try {
p1.DbType = (DbType)tc.ConvertFrom(theType.Name);
}
catch (Exception) {
//Do Nothing; will return NVarChar as default
}
}
return p1.SqlDbType;
}
我真的希望发现有一些隐藏的秘密System.Data.SqlClient方法来进行转换,我只是错过了它。
答案 4 :(得分:0)
您可以复制DataTable,如
DataTable newdt = DataTable.Copy();
删除具有不同数据类型的列,并将它们添加到newdt。
我过去只是解决这个问题的一种方式。
答案 5 :(得分:0)
在this thread回答,但这很简短,所以我会在这里重新引用它:
您可以使用TypeCode
类:Parameter.ConvertTypeCodeToDbType方法中的方法DbType
将ConvertTypeCodeToDbType
转换为System.Web.UI.WebControls.Parameter
。要获取TypeCode,您可以使用方法Type.GetTypeCode(Type type)
。