Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

Мастера, помогите запустить параметрический запрос   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
8-47623
Ruslan.
2002-03-06 19:57
2002.07.15
DXWaveList


6-47630
M@tvey
2002-04-10 15:40
2002.07.15
Помощь


14-47699
mph
2002-06-15 14:08
2002.07.15
многопроцессорные системы


3-47166
Tutov Roman
2002-06-18 17:12
2002.07.15
мастер-деталь


1-47529
AlexanderVasjuk
2002-07-03 15:13
2002.07.15
Drag&Drop из приложение вовне