将DataColumn.DataType转换为SqlDbType

时间:2009-10-15 20:34:27

标签: c# ado.net

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

6 个答案:

答案 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 PulseCodeProject找到了几个选项。我最终使用从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方法中的方法DbTypeConvertTypeCodeToDbType转换为System.Web.UI.WebControls.Parameter。要获取TypeCode,您可以使用方法Type.GetTypeCode(Type type)