type tipo new net dato datatype data columna column change cambiar c# ado.net

c# - tipo - Convierta DataColumn.DataType a SqlDbType



new datacolumn c# (6)

No hay métodos existentes para hacer esto: necesitará hacer una función para hacer esto o almacenar en caché un Dictionary<Type, SqlDbType> para las búsquedas.

¿Hay un convertidor para ir de DataColumn.DataType a SqlDbType? ¿O tengo que escribir un método para hacerlo?


Podría copiar el DataTable como

DataTable newdt = DataTable.Copy();

Y elimine las columnas con los diferentes DataTypes y agréguelos a su newdt.

Solo una forma en la que trabajé en el pasado.


Algo como esto podría ser un buen comienzo. No es exhaustivo, pero me llevó a donde tenía que ir:

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


Encontré un par de opciones en Dot Net Pulse y CodeProject . Finalmente fui con el código CodeProject convertido de VB.NET a 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; }

Realmente esperaba encontrar que había algún método oculto secreto System.Data.SqlClient para hacer la conversión y me estaba perdiendo.


Aquí está mi solución, que usa la funcionalidad .NET incorporada:

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

Tenga en cuenta que esto siempre configurará cadenas para NVarChar (cualquier solución genérica a este problema tendrá el mismo problema, porque no hay forma de saber cuál es el SqlDbType correcto). Cuando se usa esto para consultas parametrizadas SELECT o UPDATE contra columnas que no son NVarChar, el rendimiento de SqlServer se ralentiza al comparar NChar / NVarChar con tipos Char / VarChar porque está convirtiendo valores para cada comparación. Esto me mordió duro recientemente (un proceso pasó de tomar 4 minutos a más de 140 minutos), así que siempre sea explícito sobre los tipos de parámetros de su char cuando pueda. Me imagino que otros tipos similares pueden tener el mismo problema, pero ninguno que me haya causado un problema (todavía).


Respondió en este hilo , pero es bastante breve, así que volveré a citarlo aquí:

Puede convertir TypeCode en DbType utilizando el método ConvertTypeCodeToDbType en System.Web.UI.WebControls.Parameter class: Parameter.ConvertTypeCodeToDbType Method. Para obtener TypeCode puede usar el método Type.GetTypeCode(Type type) .