Набор данных, допускающий нулевые значения, даже когда AllowDBNull = False? - PullRequest
2 голосов
/ 25 апреля 2009

Я разработал набор данных с помощью конструктора наборов данных VS2008. В одной из таблиц данных я установил для свойства «AllowDBNull» большинства столбцов значение False. Тем не менее, если я создаю DataRow, содержащий нулевые значения для этих столбцов, эта таблица данных принимает эту строку без каких-либо ошибок.

Я что-то здесь не понимаю? Пожалуйста посоветуй. Спасибо.

Редактировать Однако отличное объяснение Майка Спросса вызывает другой вопрос. Как мы проверяем текстовые поля, если они System.DBNull? Удивительно, что DataSets не рассматривает строку "" как System.DBNull и выдает исключение. Или это не так?

Редактировать Я думаю, что нашел проблему и причину. Я инициализирую новую строку в DataTable, прежде чем заполнять значения для этой строки. При инициализации строки в этом столбце может быть указано значение по умолчанию для строки, то есть "". Я думаю это все? Есть идеи по этому поводу?

Ответы [ 3 ]

13 голосов
/ 25 апреля 2009

Краткий ответ:

System.DBNull.Value != null

Более длинный ответ:

В C # концепция значения NULL в SQL представлена ​​свойством Value класса System.DBNull. При работе с базой данных более знакомый C # null фактически не означает «нулевое значение».

Когда для столбца базы данных установлено значение null, ADO.NET будет инициализировать столбец в соответствии со значением по умолчанию для этого столбца (например, для столбца int будет установлено значение 0). То есть использование null может фактически привести к тому, что ненулевое значение окажется в базе данных, и поэтому вы не получите ошибку.

Если вместо этого вы установите столбец базы данных на System.DBNull.Value, столбец будет фактически установлен на NULL. Это ситуация, которая AllowDBNulls == false помешает вам сделать.

2 голосов
/ 25 апреля 2009

По поводу вашего "бонуса" ;-) вопрос: NULL (без строки) и "" (пустая строка) - это две разные вещи. Поэтому совершенно разумно относиться к ним по-разному. Это - различие между нулем и DBNull, которое портит вещи. Если бы во время разработки ADO.NET были доступны обнуляемые типы, возможно, все было бы намного проще. Но до .NET 2.0 не было возможности представить, например, "нулевое целое число".

0 голосов
/ 25 апреля 2009

Вы точно присваиваете этим столбцам значения NULL или пустую строку? Если вы не назначаете столбцу какое-либо значение, оно по умолчанию будет равно NULL (если не установлено ограничение DEFAULT). В противном случае вы можете присвоить значение NULL, выполнив -

ds.Tables[0].Rows[0]["Col"] = null;

Если вы назначаете пустую строку этим столбцам, она не равна NULL.

И если в столбце есть значение NULL, помеченное как NOT NULLABLE, оно выдаст ошибку -

Столбец Col1 не допускает нулевые значения.

EDIT:

Под NOT NULLABLE я подразумеваю AllowDBNull = false.

Ваш код кажется правильным. Можете ли вы попробовать обрезать текст?

Вот весь код -

DataTable dt = new DataTable();

DataColumn column = new DataColumn("Col1");
column.AllowDBNull = false;
dt.Columns.Add(column);

DataRow dr = dt.NewRow();
dr["Col1"] = null;

dt.Rows.Add(dr);
...