2009-10-15 13 views

Respuesta

1

Encontré un par de opciones en Dot Net Pulse y CodeProject. Al final fuimos 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; 
} 

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

+0

¿Alguien tiene esto para compilar? Como tc.ConvertFrom devuelve un Objeto, obtengo "No se puede convertir implícitamente el tipo 'objeto' a 'System.Data.DbType'. Existe una conversión explícita (¿falta un molde?)" –

+1

@AlanMacdonald: Lo siento, vea mi editar, –

+0

gracias. Me preocupaba que esto pudiera indicar que los miembros no habían probado bien esta cuestión, así que opté por la respuesta de Matt Miller en este momento. –

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.

0

Se puede copiar el DataTable como

DataTable newdt = DataTable.Copy(); 

y borrar las columnas con los diferentes tipos de datos y añadirlos a su newdt.

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

1

Algo como esto podría ser un buen comienzo. No es exhaustiva, 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; 
} 
8

aquí está mi solución, que utiliza una función de la funcionalidad de .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; 
} 

Mira que esto siempre va a establecer cadenas de 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).

+0

Editado para eliminar mi downvote accidental que estaba bloqueado después de una hora. –

0

respondidas en this thread, pero es bastante breve, así que voy a volver a citar aquí:

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