如何在DataTable中获取列的SqlType?

Dar*_*man 19 c# datacolumn sqldatatypes

我有一个从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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

inf*_*net 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"];
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,SQL Server 2012文档中有一条说明不使用此功能.请参阅http://msdn.microsoft.com/en-us/library/ms173839.aspx (3认同)
  • 还有`reader.GetSchemaTable().Rows [x] ["ProviderSpecificDataType"]` (2认同)

Dav*_*ras 10

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

这意味着如果您使用.NET Connector for SQL Server,MySQL,Access,PostgreSQL或其他任何东西,那么DataTableDataColumn它们总是相同的,并且ADO.NET对象是通用的,可以与任何数据库引擎一起使用,因此列的类型是您已经发现了.NET类型.


小智 8

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++;}'
Run Code Online (Sandbox Code Playgroud)