2011-09-19 94 views
10

我有一個SQL數據庫獲得一個DataTable,像這樣:如何獲取DataTable中列的SqlType?

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

當我試圖打通dataColumn.DataType每一列的數據類型,我得到的C#類型(的Int32,Int64的,字符串等)。

問題:如何訪問本機SQL數據類型(varchar,nvarchar,bigint ...)而不是C#類型?

我試過dataColumn.DataType.UnderlyingSystemType,結果是一樣的。

回答

9

不能因爲System.Data.DataTable(或DataColumn,DataSet或DataRow ...)是一個通用的.NET數據容器,無論您從哪個特定的數據庫引擎加載數據,它都以相同的方式工作。

這意味着,只要你使用的SQL Server,MySQL的訪問,PostgreeSQL或其他任何一個.NET連接器,數據表和DataColumn的課總是相同的,是ADO.NET對象是通用的任何數據庫引擎工作,所以這些列是按照您找到的.NET類型輸入的。

28

當然它有可能採取SqlDbType的一列,答案就在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

這個答案讓我以正確的方式。謝謝! –

+0

不客氣:) – infografnet

+2

不幸的是,在SQL Server 2012文檔中有一個註釋不使用此功能。請參閱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

你好Madhukar和歡迎來到StackOverflow。考慮添加一些口頭描述你的代碼的功能。這樣可以提高答案的質量,更好地幫助其他將來閱讀的人,併爲您提供更多讚譽。有關更多詳細信息,請參見[如何回答](http://stackoverflow.com/questions/how-to-answer)。 – bytebuster

+0

使用SqlDataReader.GetDataTypeName()將返回本機SQL Server類型。 SqlDataReader.GetFieldType()返回.NET Framework類型。當我需要構建T-SQL語句來更改數據庫列類型或大小時,我發現前者很有用。 –

0

如果您正在使用DataReader的 - 如果你想要一個列的SQL數據類型

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

應該工作

2

另一種方法是讓SQL做的工作對你而言:

 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

這將只返回字符串版本的SqlDataTypes。 OP正在查找System.Data.SqlDbType枚舉。 – JBond

相關問題