Как получить SqlDbType столбца в таблице с помощью ADO.NET? - PullRequest
6 голосов
/ 20 января 2009

Я пытаюсь определить во время выполнения, что такое SqlDbType столбца таблицы сервера SQL.

есть ли класс, который может сделать это в System.Data.SqlClient, или я должен сделать отображение самостоятельно? Я могу получить строковое представление обратно из

SELECT DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_CATALOG = '{0}' AND TABLE_SCHEMA = '{1}' 
   AND TABLE_NAME = '{2}' AND COLUMN_NAME = '{3}'

РЕДАКТИРОВАТЬ: я не могу использовать SMO, так как я не могу контролировать исполняющую машину, поэтому я не могу гарантировать, что она будет установлена. (Извините за то, что не сделал этот ясный RP).

РЕДАКТИРОВАТЬ: В ответ на Джоэл, я пытаюсь создать функцию, которую я могу вызвать, которая будет возвращать мне SqlDBType при передаче SqlConnection, имени таблицы и имени столбца.

Ответы [ 5 ]

15 голосов
/ 20 января 2009

В SQL Server вы можете использовать опцию FMTONLY. Это позволяет вам выполнить запрос, не получая никаких данных, просто возвращая столбцы.

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"];
2 голосов
/ 20 января 2009

Если вы в конечном итоге собираетесь прочитать данные, вы можете сделать это:

SqlCommand comm = new SqlCommand("SELECT * FROM Products", connection);
using (SqlDataReader reader = comm.ExecuteReader())
{
    while (reader.Read())
    {
        Type type = reader.GetSqlValue(0).GetType();
        // OR Type type = reader.GetSqlValue("name").GetType();
        // yields type "System.Data.SqlTypes.SqlInt32"
    }
}
1 голос
/ 27 марта 2016

Вы можете использовать enum System.Data.CommandBehavior как параметр для метода SqlCommand.ExecuteReader (System.Data.CommandBehavior.KeyInfo):

SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "select column from table";
SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.KeyInfo);
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"];

Этот пример похож на пример с использованием sql: SET FMTONLY ON; ВЫКЛЮЧИТЕ FMTONLY. Но вы не должны использовать SET FMTONLY. И в этом случае вы не
получать данные из таблицы. Вы получаете только метаданные.

1 голос
/ 13 февраля 2015

Старый вопрос, но если все, что вы пытаетесь сделать, это перейти от строки DATA_TYPE к перечислению SqlDbType, запрос, представленный в исходном вопросе в сочетании с одной строкой кода, сделает свое дело:

string dataType = "nvarchar"; // result of the query in the original question
var sqlType = (SqlDbType)Enum.Parse(typeof(SqlDbType), dataType, true);
1 голос
/ 20 января 2009

Для SQL Server используйте SMO (объекты управления SQL Server).

http://www.yukonxml.com/articles/smo/

Например, вы можете использовать этот код для обхода всех столбцов таблицы.

Server server = new Server();
Database database = new Database( "MyDB" );
Table table = new Table( database, "MyTable" );

foreach ( Column column in table.Columns )
{
        WriteLine( column.Name ); 
}   

Вот все доступные вам свойства столбца: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...