Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.012 c
8-47612
aach
2002-03-11 18:11
2002.07.15
Прозрачность формы


1-47532
Board
2002-06-27 19:12
2002.07.15
Загрузить из файла строки но до запятой


3-47123
Oleon
2002-06-21 16:43
2002.07.15
Работа с цифрами.


3-47171
chad
2002-06-19 11:14
2002.07.15
компонент наследник от TTable


1-47258
easy
2002-06-27 17:08
2002.07.15
Битмапы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский