Как получить 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 столбца