Как получить SqlType столбца в DataTable?
У меня есть DataTable, полученный из базы данных 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;
}
}
Когда я пытаюсь получить DataType каждого столбца с помощью dataColumn.DataType, я получаю типы С# (Int32, Int64, String и т.д.).
ВОПРОС: . Как я могу получить доступ к собственным типам данных SQL (varchar, nvarchar, bigint...) вместо типов С#?
Я пробовал dataColumn.DataType.UnderlyingSystemType, и результат тот же.
Ответы
Ответ 1
вы не можете, потому что System.Data.DataTable
(или DataColumn, или DataSet, или DataRow...) является общим контейнером данных .NET, который работает одинаково независимо от конкретного механизма базы данных, с которого вы загрузили ваши данные.
это означает, что при использовании .NET Connector для SQL Server, MySql, Access, PostgreeSQL или чего-либо еще, классы DataTable и DataColumn всегда одинаковы, а объекты ADO.NET являются общими для работы с любым движком db, поэтому столбцы набираются с типами .NET, как вы узнали.
Ответ 2
Конечно, можно взять SqlDbType столбца, ответ здесь на SO: ссылка.
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"];
Ответ 3
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++;}'
Ответ 4
Как говорит Дэвид... вы в .NET, поэтому типы будут типами .NET. Это список сопоставлений типов от SQL Server к .NET, который показывает вам, какой тип .NET вы получите для данного типа столбца Sql.. надеюсь, что это поможет.
http://msdn.microsoft.com/en-us/library/ms131092.aspx
Ответ 5
Другой подход - позволить 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);
}
Ответ 6
Если вы используете DataReader -
SqlDataReader reader = cmd.ExecuteReader();
reader.GetDataTypeName(int ordinal)
должен работать, если вы хотите, чтобы тип данных SQL столбца