如何获取DataTable中列的SqlType?

我有一个从SQL数据库获得的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; } } 

当我尝试通过dataColumn.DataType获取每列的DataType时,我得到C#类型(Int32,Int64,String等)。

问题:如何访问本机SQL数据类型(varchar,nvarchar,bigint …)而不是C#类型?

我试过dataColumn.DataType.UnderlyingSystemType,结果是一样的。

您不能,因为System.Data.DataTable (或DataColumn ,或DataSet ,或DataRow …)是一个通用的.NET数据容器,无论您从哪里加载数据,它都以相同的方式工作。

这意味着如果您使用.NET Connector for SQL Server,MySQL,Access,PostgreSQL或其他任何东西, DataTableDataColumn类总是相同的,并且ADO.NET对象是通用的,可以与任何数据库引擎一起使用,因此列如您所知,使用.NET类型键入。

当然可以采用一列的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"]; 
 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++;}' 

正如David所说……你在.NET中,因此类型将是.NET类型。 这是从SQL Server到.Net的类型映射列表,它显示了您将为给定的Sql列类型最终得到的.NET类型。希望这有助于..

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

另一种方法是让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); } 

如果您使用的是DataReader –

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

如果您想要列的SQL数据类型应该工作

基于Madhukar Krishna的回答,如果您有SQLDataReaderMySQLDataReader对象,您可以使用以下代码获取给定列的SQL类型元数据(在代码中,我们获取索引为1的列的元数据)(示例适用于MySQLDataReader宾语):

 ... MySqlDataReader dr = ... Console.WriteLine("dr.GetFieldType(1) = {0}, dr.GetName(1) = {1}, dr.GetValue(1) = {2}, dr.GetDataTypeName(1) = {3}", dr.GetFieldType(1), dr.GetName(1), dr.GetValue(1), dr.GetDataTypeName(1)); bool b = Enum.TryParse(dr.GetDataTypeName(1), true, out System.Data.SqlDbType mySqlDbTypeEnum); Console.WriteLine("mySqlDbTypeEnum = {0}, b = {1}", mySqlDbTypeEnum, b); 

这条线:

 bool b = Enum.TryParse(dr.GetDataTypeName(1), true, out System.Data.SqlDbType mySqlDbTypeEnum); 

用于从String获取System.Data.SqlDbType ,并忽略字母大小写,例如,如果dr.GetDataTypeName(1)返回"VARCHAR"System.Data.SqlDbType枚举值为System.Data.SqlDbType.VarChar

然后,您可以通过使用以下代码(源MSDN )检查SQL列元数据来获取数据类型的大小(例如VARCHAR(15)):

 ... (continuation) DataTable schemaTable; // Retrieve column schema into a DataTable. schemaTable = dr.GetSchemaTable(); // For each field in the table... foreach (DataRow myField in schemaTable.Rows) { // For each property of the field... foreach (DataColumn myProperty in schemaTable.Columns) { // Display the field name and value. Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString()); } Console.WriteLine(); // Pause. //Console.ReadLine(); } 

ColumnSize属性提供大小信息。