21

我有一个从 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 结果是一样的。

4

7 回答 7

35

当然可以取一列的 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"];
于 2012-03-15T20:35:58.463 回答
10

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

这意味着如果您为 SQL Server、MySQL、Access、PostgreSQL 或其他任何东西使用了 .NET 连接器,DataTableandDataColumn类总是相同的,并且作为 ADO.NET 对象是通用的,可以与任何 db 引擎一起使用,因此列是类型化的如您所见,使用 .NET 类型。

于 2011-09-19T11:36:57.387 回答
9
SqlConnection SqlCon = new SqlConnection("Data Source=(local);Database=dbname;Integrated Security=SSPI;");

SqlCon.Open();

SqlCmd = SqlCon.CreateCommand();
SqlCmd.CommandText = "select * from Tablename";

SqlDataReader SqlDr = SqlCmd.ExecuteReader();
SqlDr.Read();

int i = 0;

while (i < SqlDr.FieldCount)
{ 
   MessageBox.Show(SqlDr.GetDataTypeName(i));
   i++;
}
于 2012-10-14T16:03:04.530 回答
4

另一种方法是让 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);
}
于 2016-03-04T20:52:20.787 回答
2

正如大卫所说......你在.NET中,所以类型将是.NET类型。这是从 SQL Server 到 .Net 的类型映射列表,它向您展示了对于给定的 Sql 列类型最终将使用哪种 .NET 类型..希望这会有所帮助..

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

于 2011-09-19T11:48:10.003 回答
1

基于 Madhukar Krishna 的回答,如果您有一个SQLDataReader或一个MySQLDataReader对象,您可以使用以下代码(适用于对象的示例)获取给定列的 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);

用于System.Data.SqlDbType从 a获取String,并忽略字母大小写,例如如果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提供大小信息。

于 2018-04-07T16:15:44.247 回答
0

如果您使用的是 DataReader -

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

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

于 2015-08-18T21:41:06.590 回答