2011-09-19 18 views
10

Mam DataTable uzyskanych z bazy danych SQL, na przykład:Jak uzyskać SqlType kolumny w 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; 
    } 
} 

Kiedy próbuję uzyskać typ danych każdej kolumny przez dataColumn.DataType, mam C# typy (Int32, Int64, String, etc).

PYTANIE: Jak uzyskać dostęp do rodzimych typów danych SQL (varchar, nvarchar, bigint ...) zamiast typów C#?

Próbowałem dataColumn.DataType.UnderlyingSystemType i wynik jest taki sam.

Odpowiedz

9

Nie można, ponieważ System.Data.DataTable (lub DataColumn, DataSet lub DataRow ...) to ogólny kontener danych .NET, który działa w ten sam sposób, niezależnie od konkretnego silnika bazy danych, z którego zostały załadowane dane.

oznacza to, że pod warunkiem, że używane jest złącze .NET dla SQL Server, MySql, Access, PostgreeSQL lub cokolwiek innego, klasy DataTable i DataColumn są zawsze takie same i obiekty ADO.NET są ogólne do pracy z dowolnym mechanizmem db , więc kolumny są wpisane z typami .NET, jak się dowiedziałeś.

28

Oczywiście, że można wziąć SqlDbType z kolumny, odpowiedź jest tutaj na 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

Ta odpowiedź postawiła mnie we właściwy sposób. Dziękuję Ci! –

+0

Nie ma sprawy :) – infografnet

+2

Niestety, w dokumentacji SQL Server 2012 znajduje się notatka, aby nie używać tej funkcji. Zobacz 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

Witaj Madhukar i witaj w StackOverflow. Zastanów się nad dodaniem opisów słownych, co robi twój kod. Zwiększy to jakość Twojej odpowiedzi, lepiej pomoże innym, którzy ją przeczytają w przyszłości, i da ci więcej upvotes. Aby uzyskać więcej informacji, zobacz [How to Answer] (http://stackoverflow.com/questions/how-to-answer). – bytebuster

+0

SqlDataReader.GetDataTypeName() zwraca natywny typ SQL Server. SqlDataReader.GetFieldType() zwraca typ architektury .NET Framework. Znalazłem tę pierwszą przydatną, gdy potrzebowałem zbudować instrukcję T-SQL, aby zmienić typy lub rozmiary kolumn bazy danych. –

0

Jeśli używasz DataReader -

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

powinien działać, jeśli chcesz typ danych SQL kolumny

2

Innym podejściem jest umożliwienie SQL wykonać pracę dla Ciebie:

 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

To po prostu zwróci wersję string SqlDataTypes. OP szuka wyliczenia System.Data.SqlDbType. – JBond

Powiązane problemy