如何获取数据表中某列的SqlType
本文关键字:SqlType 数据表 何获取 获取 | 更新日期: 2023-09-27 18:09:04
我有一个从SQL数据库获得的数据表,如下所示:
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;
}
}
当我试图通过dataccolumn获取每列的DataType时。数据类型,我得到c#类型(Int32, Int64, String等)。
问题:我如何访问本地SQL数据类型(varchar, nvarchar, bigint…)而不是c#类型?
我已经尝试过dataccolumn . datatype . underlyingsystemtype和结果是相同的
当然可以取列的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"];
你不能,因为System.Data.DataTable
(或DataColumn
,或DataSet
,或DataRow
…)是一个通用的。net数据容器,不管你从哪个特定的数据库引擎加载数据,它的工作方式都是一样的。
这意味着如果你为SQL Server, MySQL, Access, PostgreSQL或其他任何东西使用。net连接器,DataTable
和DataColumn
类总是相同的并且是ADO。.NET对象是通用的,可以与任何数据库引擎一起工作,因此,正如您所发现的那样,列使用.NET类型键入。
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++;
}
另一种方法是让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);
}
正如David所说…你在。net中,所以类型是。net类型。这是一个从SQL Server到。net的类型映射列表,它向您展示了对于给定的SQL列类型,您最终会得到什么样的。net类型。希望这能帮到你…
http://msdn.microsoft.com/en-us/library/ms131092.aspx根据Madhukar Krishna的回答,如果您有一个SQLDataReader
或MySQLDataReader
对象,您可以使用以下代码(用于MySQLDataReader
对象的示例)获得给定列的SQL类型元数据(在代码中,我们获得索引为1的列的元数据):
...
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
的enum值为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
给出了大小信息
如果您正在使用DataReader -
SqlDataReader reader = cmd.ExecuteReader();
reader.GetDataTypeName(int ordinal)
应该可以工作。