2009-10-15 2 views

ответ

1

Я нашел несколько вариантов на Dot Net Pulse и CodeProject. В конце концов я пошел с кодом CodeProject преобразованного из VB.NET в C#:

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 сделать преобразование, и я просто не хватает его ,

+0

Любой может это скомпилировать? Поскольку tc.ConvertFrom возвращает объект Object, я получаю «Невозможно неявно преобразовать тип« объект »в« System.Data.DbType ». Явное преобразование существует (вам не хватает роли?)« –

+1

@AlanMacdonald: Извините, что - см. Мой –

+0

спасибо. Я был обеспокоен тем, что это может означать, что это не было хорошо проверено членами, поэтому я пошел на ответ Мэтта Миллера в данный момент –

6

Для этого не существует существующих методов - вам нужно будет перевернуть функцию для этого или кешировать Dictionary<Type, SqlDbType> для поиска.

0

Вы можете скопировать DataTable как

DataTable newdt = DataTable.Copy(); 

И Удалить столбцы с различными типами данных и добавить их в свой newdt.

Только один способ я работал вокруг него в прошлом.

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; 
} 
8

Вот мое решение, которое использует встроенные функции .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). При использовании этого параметра для параметризованных запросов SELECT или UPDATE для столбцов, которые не являются NVarChar, производительность SqlServer перетаскивается при сравнении типов NChar/NVarChar с Char/VarChar, поскольку он преобразует значения для каждого сравнения. Это немного изменило меня в последнее время (процесс длился от 4 минут до 140 + минут), поэтому всегда будьте ясны в отношении типов параметров char, когда сможете! Я бы предположил, что у других подобных типов может быть одна и та же проблема, но ни одна из них не вызвала у меня проблемы (пока).

+0

Отредактировано для удаления моего случайного нижнего уровня, который был заблокирован через час. –

0

Ответил в this thread, но это довольно кратким, поэтому я вновь процитировать его здесь:

Вы можете конвертировать TypeCode в DbType с использованием метода ConvertTypeCodeToDbType в System.Web.UI.WebControls.Parameter класс: Parameter.ConvertTypeCodeToDbType метод. Чтобы получить TypeCode, вы можете использовать метод Type.GetTypeCode(Type type).

Смежные вопросы