Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизМастера, помогите запустить параметрический запрос Найти похожие ветки
← →
Sam (2002-06-17 19:58) [0]Привет All! Есть такая проблемка:
ADOQuery1.SQL.Add("SELECT *");
ADOQuery1.SQL.Add("FROM BOOKS");
ADOQuery1.SQL.Add("WHERE AUTHOR IS NULL")
Выполняя этот код, получаем в DBGrid некоторое кол-во строк (<>0). А при выполнении следующего кода:
ADOQuery1.SQL.Add("SELECT *");
ADOQuery1.SQL.Add("FROM BOOKS");
ADOQuery1.SQL.Add("WHERE AUTHOR=:Par1");
ADOQuery1.Parameters.ParamByName("Par1").Value:=Null;
ADOQuery1.Open;
Получаю 0 записей. Почему? :(
← →
TSV (2002-06-17 20:21) [1]Кажется, надо вот так:
ADOQuery1.Parameters.ParamByName("Par1").Clear;
Удачи.
← →
MOA (2002-06-17 23:54) [2]После подстановки параметров Ваш запрос будет выглядеть примерно так:
SELECT * FROM Books WHERE Author=NULL
NULL - это "неизвестно", сравнение с NULL всегда выдаст FALSE.
Удачи!
← →
oss (2002-06-18 01:24) [3]Ну самое главное =NULL не бывает !
есть WHERE Author IS NULL или WHERE Author NOT IS NULL,
а второе, если ты уже знаешь значение парамерта то не лучне тебе его в строку и вставить, типа
ADOQuery1.SQL.Add("SELECT * FROM BOOKS"+
"WHERE AUTHOR IS NULL");
← →
Sam (2002-06-19 10:06) [4]Спасибо, конечно, за рекомендации, но ...
2TSV: У объекта TParameter нету метода Clear в отличии от объекта TParam
2MOA: Непонятно для чего тогда в свойстве Attributes объекта TParameter есть элемент paNulable.
2oss: Можно и динамически формировать SQL-запрос, но всегда хочется найти красивое решение
← →
Kaban (2002-06-19 10:13) [5]Кстати неплохо бы prepare сделать, запрос то с параметром
← →
MOA (2002-06-19 11:00) [6]2Sam:Непонятно для чего тогда в свойстве Attributes объекта TParameter есть элемент paNulable
А это потому, что в общем случае, Delphi неизвестно, как именно программист собирается использовать параметр. Можно, например, вызывать встроенную процедуру или функцию - там NULL обрабатывется программистом в теле процедуры/функции, можно построить сложное условие на CASE WHEN-ELSE типа
... CASE WHEN :Parametr IS NULL THEN ... ELSE ... END
и т.д.
Резюмируя, ещё раз:
Значение NULL это - "неизвестно". Любое выражение
<Что-то> любая-арифметическая-или-логическая-операция NULL
ВСЕГДА ИМЕЕТ ЗНАЧЕНИЕ NULL (т.е. "неизвестно"), что интерпретируется в условиях как FALSE.
Удачи!
← →
MOA (2002-06-19 11:02) [7]Забыл добавить - конечно, кроме двух операций
<Что-то> IS NULL
и
<Что-то> IS NOT NULL
← →
Sam (2002-06-19 21:00) [8]2MOA: Значит выборка записей с NULL-значениями в определенном поле параметрическим запросом невозможна?
← →
Sam (2002-06-19 21:02) [9]2MOA: Значит выборка записей с NULL-значениями в определенном поле параметрическим запросом невозможна?
← →
MOA (2002-06-19 22:12) [10]Сорри за паузу - ну не постоянно мне Инет доступен.
Нет, отчего же. Позвольте привести цитату из Вас:
ADOQuery1.Parameters.ParamByName("Par1").Value:=Null;
Видно, что в этом участке кода Вы уже точно знаете, что хотите именно записи с NULL. Ну да, запрос на равенство не сработает - но ведь можно
1. Подменить или сам Query или сменить текст запроса (ну да, менять запрос я и сам не люблю:))
2. Если Вы работаете на каком-нибудь SQL - сервере (IB, MSSQL, ORACLE(тогда завидую)) - можно написать пользовательскую процедуру (функцию), корректно обрабатывающую NULL в качестве входного параметра.
К сожалению, простого сравнения недостаточно. Попробуйте почитать Дейта "Введение в базы данных". У него целая глава посвящена NULL. Говорит - "это не надо, лучше значения по умолчанию, но не все со мной (Дейтом) согласны".
И я тоже. Все таки значение "неизвестно" имеет право на существование в предметной области. Например, Паспорт-серия-номер-клиента-нашей-фирмы NULL (ну не знаем мы).
С уважением, МОА.
PS. Если Вы пользуетесь каким-нибудь SQL - сервером тема может быть продолжена (а даже если и не используете). Со взаимной пользой обсудим.
Удачи!
← →
Sam (2002-06-20 13:49) [11]2MOA: С радостью продолжу дискуссию. Вопрос: где можно найти Дейта (в смысле есть ли бесплатный электронный вариант)? Очень хочется почитать про эти Null-значения.
Коментарий насчет динамического изменения запроса: если запрос большой и сложный (в смысле синтаксическом), то некрасиво каждый раз закрывать, изменять текст SQL-запросов и потом открывать компонент. Хотелось бы его один раз открыть (предварительно установив Prepared в True, как тут кто-то подметил выше) и потом только параметры менять.
P.S. Не верится, что возможности выборки Null-значений не предусмотрено Microsoft"ом: ведь их (Null) поддержка предусмотрена, а выполнение запросов с их участием нет?
P.P.S. Я работаю через ADO с *.mdb формата Access 2000.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c