2011-09-19 26 views
10

tengo un DataTable obtenido a partir de una base de datos SQL, así:¿Cómo obtener el SqlType de una columna en una DataTable?

using (SqlCommand cmd = new SqlCommand(query, _sqlserverDB)) 
{ 
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    { 
     DataSet dataSet = new DataSet(); 
     adapter.Fill(dataSet); 
     result = (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count > 0) ? dataSet.Tables[0] : null; 
    } 
} 

Cuando intento para obtener el tipo de datos de cada columna a través dataColumn.DataType, consigo los tipos de C# (Int32, Int64, String, etc.)

PREGUNTA: ¿Cómo puedo acceder a los tipos de datos SQL nativos (varchar, nvarchar, bigint ...) en lugar de los tipos C#?

He intentado dataColumn.DataType.UnderlyingSystemType y el resultado es el mismo.

Respuesta

9

no se puede porque System.Data.DataTable (o DataColumn, o DataSet, o DataRow ...) es un contenedor de datos .NET genérico que funciona de la misma manera independientemente del motor de base de datos específico desde el que cargó sus datos.

esto significa que siempre que utilice un .NET Connector para SQL Server, MySql, Access, PostgreeSQL o cualquier otra cosa, las clases DataTable y DataColumn son siempre las mismas y los objetos ADO.NET son genéricos para funcionar con cualquier motor db , por lo que las columnas se escriben con los tipos .NET como descubriste.

2

Como dice David ... estás en .NET por lo que los tipos serán .NET. Esta es una lista de asignaciones de tipo de SQL Server para .Net que muestra lo que .NET tipo que va a terminar con un tipo de columna de SQL asignados .. espero que esta ayuda ..

http://msdn.microsoft.com/en-us/library/ms131092.aspx

28

Por supuesto, es posible tomar SqlDbType de una columna, la respuesta está aquí en SO: link.

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF"; 
SqlDataReader reader = cmd.ExecuteReader(); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 
+0

Esta respuesta me puso en el camino correcto. ¡Gracias! –

+0

de nada :) – infografnet

+2

Desafortunadamente, hay una nota en la documentación de SQL Server 2012 para no usar esta característica. Ver http://msdn.microsoft.com/en-us/library/ms173839.aspx – Naomi

7
SqlConnection SqlCon = new SqlConnection("Data Source=(local);Database= dbname;Integrated Security=SSPI;"); 

SqlDataReader SqlDr; 

SqlCon.Open(); 
SqlCmd = SqlCon.CreateCommand(); 

SqlCmd.CommandText = "select * from Tablename"; 

SqlDr = SqlCmd.ExecuteReader(); 
SqlDr.Read(); 
int i=0; 
while (i < SqlDr.FieldCount) 
{ MessageBox.Show(SqlDr.GetDataTypeName(i)); i++;}' 
+0

Hola, Madhukar y bienvenidos a StackOverflow. Considere agregar alguna descripción verbal de lo que hace su código. Esto aumentará la calidad de su respuesta, ayudará mejor a otros que la leerán en el futuro y le dará más votos favorables. Consulte [Cómo responder] (http://stackoverflow.com/questions/how-to-answer) para obtener más detalles. – bytebuster

+0

El uso de SqlDataReader.GetDataTypeName() devuelve el tipo de SQL Server nativo. SqlDataReader.GetFieldType() devuelve el tipo de .NET Framework. Encontré el anterior útil cuando necesité construir una declaración T-SQL para alterar los tipos o tamaños de columnas de la base de datos. –

0

Si está utilizando DataReader -

SqlDataReader reader = cmd.ExecuteReader(); reader.GetDataTypeName(int ordinal)

debería funcionar si desea que el tipo de datos SQL de una columna

2

Otro enfoque es dejar que SQL haga el trabajo para usted:

 SqlConnection rConn = connectToSQL(); //returns sql connection 

     SqlCommand SqlCmd = new SqlCommand(); 

     SqlCmd = rConn.CreateCommand(); 

     SqlCmd.CommandText = "SELECT ORDINAL_POSITION, " + 
           "COLUMN_NAME, " + 
           "DATA_TYPE, " + 
           "CHARACTER_MAXIMUM_LENGTH, " + 
           "IS_NULLABLE " + 
          "FROM INFORMATION_SCHEMA.COLUMNS " + 
          "WHERE TABLE_NAME = 'TableName'"; 
     SqlDataReader SqlDr = SqlCmd.ExecuteReader(); 

     SqlDr.Read(); 
     while (SqlDr.Read()) 
      { 
      var OrdPos = SqlDr.GetValue(0); 
      var ColName = SqlDr.GetValue(1); 
      var DataType = SqlDr.GetValue(2); 
      var CharMaxLen = SqlDr.GetValue(3); 
      var IsNullable = SqlDr.GetValue(4); 
      Console.WriteLine("ColName - " + ColName + " DataType - " + DataType + " CharMaxLen - " + CharMaxLen); 
      } 
+0

Esto solo devolverá la versión de cadena de SqlDataTypes. El OP está buscando System.Data.SqlDbType enum. – JBond

Cuestiones relacionadas