2011-09-19 10 views
10

Ho un DataTable ottenuti da un database SQL, in questo modo:Come ottenere il SqlType di una colonna in un 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; 
    } 
} 

Quando provo ad ottenere il tipo di dati di ogni colonna attraverso dataColumn.DataType, ho ottenere i tipi C# (Int32, Int64, String, ecc).

domanda: Come posso accedere ai tipi di dati SQL nativi (varchar, nvarchar, bigint ...) al posto della C# tipi?

ho provato dataColumn.DataType.UnderlyingSystemType e il risultato è lo stesso.

risposta

9

non è possibile perché System.Data.DataTable (o DataColumn, DataSet o DataRow ...) è un contenitore di dati .NET generico che funziona allo stesso modo indipendentemente dal motore di database specifico da cui sono stati caricati i dati.

significa che se si è utilizzato un connettore .NET per SQL Server, MySql, Access, PostgreeSQL o qualsiasi altra cosa, le classi DataTable e DataColumn sono sempre le stesse e gli oggetti ADO.NET sono generici per funzionare con qualsiasi motore di database , quindi le colonne sono digitate con i tipi .NET come hai scoperto.

2

Come dice David ... SEI IN .NET in modo che i tipi saranno tipi .NET. Questo è un elenco di mapping dei tipi da SQL Server a .Net che vi mostra quello .NET digitare vi ritroverete con per un determinato tipo di colonna Sql .. Spero che questo aiuti ..

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

28

Naturalmente è possibile prendere SqlDbType di una colonna, la risposta è qui su 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

Questa risposta mi ha messo nel modo giusto. Grazie! –

+0

sei il benvenuto :) – infografnet

+2

Purtroppo, c'è una nota nella documentazione di SQL Server 2012 non utilizzare questa funzione. Vedi 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

Ciao Madhukar e benvenuto su StackOverflow. Prendi in considerazione l'aggiunta di una descrizione verbale del tuo codice. Ciò aumenterà la qualità della risposta, aiuterà meglio gli altri che lo leggeranno in futuro e fornirà più voti. Vedi [Come rispondere] (http://stackoverflow.com/questions/how-to-answer) per maggiori dettagli. – bytebuster

+0

Utilizzando SqlDataReader.GetDataTypeName() restituisce il tipo SQL Server nativo. SqlDataReader.GetFieldType() restituisce il tipo di .NET Framework. Ho trovato il primo utile quando ho avuto bisogno di costruire un'istruzione T-SQL per modificare i tipi di colonna o le dimensioni del database. –

0

Se si utilizza DataReader -

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

dovrebbe funzionare se si desidera che il tipo di dati SQL di una colonna

2

Un altro approccio è quello di lasciare SQL fare il lavoro per voi:

 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

Ciò restituirà solo la versione stringa di SqlDataTypes. L'OP sta cercando l'enum System.Data.SqlDbType. – JBond