2013-12-12 4 views
2

Столбцы таблицы в db могут хранить нулевые значения (как DBNull s). Есть ли способ получить эту информацию от IDataReader или DbDataReader?Есть ли способ проверить, поддерживает ли столбец нулевые значения из datareader?

using (var reader = command.ExecuteReader()) 
{ 
    //can I get the column info like if it supports null value if I pass the ordinal? 
    reader.CheckIfSupportsNull(someIndex) ??? 

    while (reader.Read()) 
    { 

    } 
} 

Я знаю, что могу читать значения ячеек и проверить его на DBNull.Value, но я не спрашиваю, могу ли я проверить значение чтения является пустым, но если я могу проверить, если сама колонка поддерживает DBNull с независимо от фактических значений, присутствующих в таблице.

Я хотел бы знать, если это возможно с MySqlDataReader и/или SqlDataReader ..

+1

_For метод SqlDataReader.GetSchemaTable возвращает метаданные о каждом столбце в следующем порядке: ... AllowDBNull ..._ –

ответ

2

Ответ @ usr указал мне в правильном направлении. Я сделал это следующим образом:

var table = reader.GetSchemaTable(); 
foreach (DataRow column in table.Rows) //here each row represents a column 
{ 
    var allowsNull = column.Field<bool>("AllowDbNull"); //get it one by one here 
    // similarly column.Field<string>("ColumnName") gives the name of the column 
} 

должно работать.

Примечание: Как отмечает @Edper

var allowsNull = (bool)column["AllowDbNull"]; 

делает работу тоже. Это имеет дополнительное преимущество, что вам не нужно ссылаться на System.Data.DataSetExtensions.dll, который необходим для метода расширения Field<T>.

+1

Вы можете сделать это так же: 'column [" AllowDBNull "]'. – Edper

+0

@ Эддер, да, это тоже, просто, что вам нужно бросить в булевую спину. – nawfal

+0

Да, где вы можете получить то, что хотите в коде, кстати? Или где вы можете решить это сейчас? – Edper

6

IDataReader.GetSchemaTable позволяет это. Он возвращает DataTable, описывающий набор результатов. Посмотрите в документы, чтобы увидеть, какие столбцы он возвращает (их много). Не уверен, насколько дорого это звонок. Я не думаю, что он совершает кругосветное путешествие на сервер.

Он возвращает свойства набора результатов, а не таблицы. Если вы выбираете столбцы непосредственно из таблицы, свойства должны совпадать. Это не может работать для вычисленных выражений (SomeCol + 1), потому что SQL Server точно не отслеживает значение nullability через выражения.

+1

Таблица схем возвращает одну строку за столбец в результирующем наборе. Но да, столбец называется 'AllowDBNull'. Благодарю. – usr

+0

Спасибо за головы, дал мне направление. + 1-е изд. Для полноты я приму свой ответ. Кстати, я предпочитаю получать информацию о столбце набора результатов, а не о самой таблице, поэтому никаких проблем нет. Я действительно думаю, что информация о столбцах в случае выражений более или менее точна, насколько нулеумие идет, но тривиальные редкие случаи не являются большой проблемой. – nawfal

1

Поскольку вы чтения данных (с использованием DbDataReader), то на самом деле нет (несмотря на другие ответы), не надежно: колонка может быть предварительно разрешено и хранить аннулирует, а затем запрещено обнуляет хранить без удаление уже сохраненных нулей. Эта практика иногда используется, поскольку проверка ограничений базы данных (например, NOT NULLABLE) делает вставку данных намного медленнее.

По сути, AllowDBNull полезен только при чтении данных, если вы уже знаете, что столбец имеет значение NOT NULLABLE, которое принудительно принудительно применяется или проверяется после любых вставок.

Из MSDN:

AllowDBNull: Срабатывает, если потребитель может установить столбец в нулевое значение или если поставщик не может определить, может ли потребитель установить столбец в нулевое значение. В противном случае не устанавливается. Столбец может содержать нулевые значения, даже если он не может быть установлен на нулевое значение.

+0

Хороший кромка, спасибо. – nawfal