Есть ли конвертер для перехода от DataColumn.DataType к SqlDbType? Или мне нужно написать метод для этого?Преобразование DataColumn.DataType в SqlDbType
ответ
Я нашел несколько вариантов на 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 сделать преобразование, и я просто не хватает его ,
Для этого не существует существующих методов - вам нужно будет перевернуть функцию для этого или кешировать Dictionary<Type, SqlDbType>
для поиска.
Вы можете скопировать DataTable как
DataTable newdt = DataTable.Copy();
И Удалить столбцы с различными типами данных и добавить их в свой newdt.
Только один способ я работал вокруг него в прошлом.
Что-то вроде этого может быть хорошим началом. Это не является исчерпывающим, но получил меня туда, где я должен был пойти:
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;
}
Вот мое решение, которое использует встроенные функции .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, когда сможете! Я бы предположил, что у других подобных типов может быть одна и та же проблема, но ни одна из них не вызвала у меня проблемы (пока).
Отредактировано для удаления моего случайного нижнего уровня, который был заблокирован через час. –
Ответил в this thread, но это довольно кратким, поэтому я вновь процитировать его здесь:
Вы можете конвертировать TypeCode
в DbType
с использованием метода ConvertTypeCodeToDbType
в System.Web.UI.WebControls.Parameter
класс: Parameter.ConvertTypeCodeToDbType метод. Чтобы получить TypeCode, вы можете использовать метод Type.GetTypeCode(Type type)
.
- 1. Преобразование строки в SqlDbType
- 2. Преобразование строки из PowerShell в sqldbtype. datetime
- 3. .NET Тип системы для SqlDbType
- 4. Что преобразовывает SqlDbType в Oracle?
- 5. Как диагностировать ArgumentOutOfRangeException в SqlDbType?
- 6. новообращенного значения строки SqlDbType
- 7. Отображение перечисления SqlDbType - C#
- 8. Эффективный способ предоставления SqlDbType?
- 9. SqlDbType and Geography
- 10. C# Анализировать SqlDbType Convertion
- 11. Использование DBNull.Value с SqlParameter без знания sqlDbType?
- 12. Почему DBNull.Value требует правильного SqlDbType?
- 13. Параметрированный SqlCommand - преимущество указания SqlDbType?
- 14. Сохраненная процедура Где параметр SqlDbType
- 15. Название «SqlDbType» не существует в текущем контексте
- 16. Недостатки не указывать SqlDbType в SqlCommand.Parameter
- 17. Какой SqlDbType сопоставляется с varChar (max)?
- 18. Какой SqlDbType следует использовать при создании таблицы?
- 19. SQLiteconnection DBTYPE всегда Int32 несмотря SqlDbType Установка
- 20. SqlDbType и собственный тип SQL Server
- 21. SqlParameter: разница в передаче SqlDbType vs без передачи
- 22. C# Почему нет неявного приведения из SqlDbType в DbType?
- 23. ADO.NET: метод SqlParameterCollection.Add (String, SqlDbType, Int32). Размер аргумента - что значит?
- 24. Как определить SQLDBType переменной, которая будет добавлена к параметру?
- 25. Как узнать/проверить, совместимо ли значение SqlDbType или нет?
- 26. Когда следует использовать «SqlDbType» и «размер» при добавлении параметров SqlCommand?
- 27. Не влияет ли параметр DbType SqlDbType на производительность?
- 28. Какой размер для параметра SqlDbType с помощью bigint?
- 29. Можно ли включить SqlDbType в строковое представление значения по умолчанию для соответствующего типа C#?
- 30. У нас есть логическое обоснование недостающего географии типа данных в SqlDbType перечисления
Любой может это скомпилировать? Поскольку tc.ConvertFrom возвращает объект Object, я получаю «Невозможно неявно преобразовать тип« объект »в« System.Data.DbType ». Явное преобразование существует (вам не хватает роли?)« –
@AlanMacdonald: Извините, что - см. Мой –
спасибо. Я был обеспокоен тем, что это может означать, что это не было хорошо проверено членами, поэтому я пошел на ответ Мэтта Миллера в данный момент –