将DataColumn.DataType转换为SqlDbType

是否有转换器从DataColumn.DataType转到SqlDbType? 或者我必须写一个方法来做它?

这是我的解决方案,它使用内置的.NETfunction:

///  /// Get the equivalent SQL data type of the given type. ///  /// Type to get the SQL type equivalent of 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参数类型! 我认为其他类似的类型可能有相同的问题,但没有一个导致我的问题(尚未)。

没有现成的方法可以执行此操作 – 您需要滚动函数来执行此操作或缓存Dictionary以进行查找。

这样的事情可能是一个好的开始。 它并不全面,但让我到了我需要去的地方:

 Dictionary GetSQLTypeConversionMap() { var result = new Dictionary(); 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; } 

我在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方法来进行转换,我只是错过了它。

您可以复制DataTable

 DataTable newdt = DataTable.Copy(); 

并删除具有不同数据类型的列,并将它们添加到您的newdt。

这只是我过去解决过的一种方式。

在这个post中回答,但它很简短,所以我在这里重新引用它:

您可以使用System.Web.UI.WebControls.Parameter类中的方法ConvertTypeCodeToDbTypeTypeCode转换为DbType : Parameter.ConvertTypeCodeToDbType方法。 要获取TypeCode,您可以使用方法Type.GetTypeCode(Type type)