· Вторым идет параметр IsNull_Name — булевский флаг, указывающий, может-ли поле Name быть пустым (иметь значение NULL). В языке C# пустое поле задается выражением DBNull.Value. DBNull — это класс!
· Третий параметр Original_Name — старое, исходное значение поля Name удаляемой строки таблицы.
· Затем идут параметры с угадываемой мнемоникой: IsNull_Phone (обнуляемо-ли поле Phone), Original_ Phone, IsNull_Addr и, наконец, Original_Addr.
Всего 7 полей. Казалось бы, чтобы удалить строку, достаточно знать лишь значение ее первичного ключа (уникальный идентификатор строки). Для чего нужна избыточная информация? Она используется в алгоритме обновления данных, который по умолчанию принят в ADO.NET. Алгоритм соответствует стратегии Optimistic Concurrency, повышающей надежность данных. Думаю, что вы слышали об этой стратегии в курсе лекций по базам данных. Коротко, ее суть сводится к тому, что обновление, или удаление производится лишь в том случае, если текущие поля данных не изменились с момента их чтения, то имеют место все три равенства:
Name = Original_Name, Phone = Original_Phone, Addr = Original_Addr
Имея информацию о параметрах, проанализируйте все три SQL-предложения, генерируемые построителем команд (объектом OleDbCommandBuilder) и оцените объем рутинной работы, от которой он нас избавил. Он не только создает 3 недостающие команды, но и создает код для манипуляции всеми перечисленными параметрами.
Надеюсь, вы поняли роль единиц в SQL-операторах. Они заменяют константу TRUE. Логический тип (bool) давно появился в традиционных языках программирования, например в языке Algol (60-е годы прошлого столетия). Однако в языке C++ он появился не сразу. Поэтому в API-функциях вы видите TRUE (макрос, заменяющий эту константу на единицу) и FALSE (аналог нуля), а не true, и false — настоящие константы типа bool.
Повторяющаяся часть сложных выражений, имеющая вид,
? = 1 AND Name IS NULL OR (Name = ?)
после подстановок имеет вид:
Name = IsNull_Name AND Name IS NULL OR (Name = Original_Name)
Это логическое условие читается так:
· IsNull_Name = TRUE AND Name IS NULL — если имя можно не задавать и оно не задано,
· OR или (если задано),
· (Name = Original_Name) — текущее значение равно старому,
· то обновление производить можно.
Если выражение, состоящее из пересечения (AND) подобных проверок по всем полям строки таблицы, истинно, то текущая запись таблицы удаляется (DELETE) или изменяется или (UPDATE).
Заметим, что если отказаться от проверок на нулевые поля, то синтаксис команд UPDATE и DELETE будет заметно проще. Работая с адаптерами связи вручную, мы можем задать такие тексты команд.
UPDATE Studs SET Name = ? , Phone = ? , Addr = ?
WHERE StudID = ? AND Name = ? AND Phone = ? AND Addr = ?
DELETE FROM Studs
WHERE StudID = ? AND Name = ? AND Phone = ? AND Addr = ?
Построитель команд настолько противоречивый инструмент, что от него трудно отвязаться. Приведу еще один фрагмент кода, который демонстрирует, как установить два важных свойства, которые повысят надежность этого инструмента.
OleDbCommandBuilder builder = new OleDbCommandBuilder (da);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
Console.WriteLine ("\n" + builder.GetUpdateCommand().CommandText);
Сравните текст команды Update при наличии префикса и суффикса с тем, что был без них. Говорят (но я не проверял), что после этих установок обновления будет работать, даже если имена колонок таблицы базы данных будут совпадать с ключевыми словами языка SQL, или в них будут пробелы.
Я потерял довольно много времени в режиме отладке, когда назвал одну из колонок таблицы экзаменов Date (теперь она называется MyDate). Приложение вело себя непредсказуемо, и бедные студенты страдали. Если бы я догадался использовать префикс и суффикс, то проблема бы, наверно, исчезла.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.