Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы по ADO


lightix ©   (2004-05-06 11:52:00) 

Имеется связка BCB6 + ADO + Oracle9 OLE DB Provider.
Простейший пример - на форме имеется запросное поле - DBLookupComboBox, который содержит некоторые данные из справочника.
Также имеется ADODataSet, в котором выбираются данные согласно запросу из другой таблицы. Причем если в запросном поле ничего не указали, то нужно выбрать все данные из таблицы.
Пишу запрос:

select * from t1 where f1=:param1 or :param1 is null

во-первых в Parameters появляется 2 одинаковых параметра... во вторых если для выполнения запроса я напишу

ADODataSet1->Close();
ADODataSet1->Parameters->ParamByName("param1")->Value =
DBLookupComboBox1->KeyValue;
ADODataSet1->Open();

то присвоится значение только 1-му параметру из 2-х  и  запрос работать не будет, нужно писать через Parameters->Items[0] и т.п. явно задавать по номеру.
А это очень неудобно, т.к. при каждом изменении запроса будет меняться порядок параметров и всех их не запомнишь ...
Так же при таком варианте не работает запрос если DBLookupComboBox1->KeyValue = NULL, т.к. в этом случае при передаче параметра Null преобразуется автоматически в -1 и естественно не сравнивает с null...
Приходится писать вот с такими извращениями:

select * from t1 where f1=:param1 or nvl(:param1,-1)=-1

при этом если тип параметра String и передается не NULL, то вылетает ошибка , т.к. функция nvl преобразовывает параметр к типу int. Для этого модернизирую код вот таким образом:

select * from t1 where f1=:param1 or nvl(:param1,'-1')='-1'


Вот такие вот извращения ... Может можно как то по-человечески работать в этом BCB6 с ADO?
До этого работали в BCB5 + NCOCI8 было все просто замечательно...

И еще - как правильно занулять (очищать запросное поле) KeyValue у DBLookupComboBox ? Раньше делали всегда KeyValue=Null и все работало. А сейчас для строк нужно делать KeyValue="", для чисел -1, для даты вообще непонятно ....

Помогите, народ, работать невозможно :(


Erik   (2004-05-06 16:04:00) [1]

NCOCI неработает с потоками, пожалуй нет неодного нормального бесплатного компонента для работы с Oracle. Я кажется все перепробовал с серездным тестированием.

У нас используется TRxDBLookupCombo(Sender).ResetField;


lightix   (2004-05-06 15:22:00) [2]

А мы под NCOCI писали года 2, и все замечательно было ... а тут собрались покупать лицензионный BCB6, а под него NCOCI не ставятся ... Решили на ADO переходить , а тут такие кошмары....
Незнаю что теперь и делать - это не работа а мучения, выкручиваешь себе руки, текст программы получается нечитабельным и непонятным ..... УЖАС.

Кстати DBLookupComboBox->KeyValue.Clear() - не чистит ...


Erik   (2004-05-06 15:01:00) [3]

Для это вобщето есть спецальный метод ..Clear. А чего все накинулись на ADO? Оно вобще жутко глючно в Delphi неализовано. Если Oracle используйте прямые компоненты доступа или вобще BDE. У нас уже 5 лет используются и только сейчас будем постипенно переползать на ODAC.


Erik   (2004-05-06 15:00:00) [4]

Для это вобщето есть спецальный метод ..Clear. А чего все накинулись на ADO? Оно вобще жутко глючно в Delphi неализовано. Если Oracle используйте прямые компоненты доступа или вобще BDE. У нас уже 5 лет используются и только сейчас будем постипенно переползать на ODAC.


lightix   (2004-05-06 13:11:00) [5]

Это итак ясно, но в BCB6 (как я уже раньше говорил), Null присвоить ему в некоторых случаях не удается, и мало того, когда KeyValue числовое, то после присвоения ему Null оно становится = -1 !!!!!!!!!


stone   (2004-05-06 13:05:00) [6]


> А как же быть с DBLookupComboBox->KeyValue? Ведь он не Null
> получается а то -1 то "" ....

KeyValue variant, поэтому может принимать любое значение, в том числе NULL


lightix   (2004-05-06 13:00:00) [7]

Запрос статически строится.

select * from t1 where f1=:param1_forequal or :param1_fornull is null


А как же быть с DBLookupComboBox->KeyValue? Ведь он не Null получается а то -1 то "" ....


Johnmen   (2004-05-06 12:00:00) [8]

Стандартный выход.
select * from t1 where f1=:param1_forequal or :param1_fornull is null
где параметрам присавиваются одинаковые значения...

А вообще, если уж запрос строится динамически, то и строй его с учетом текущих значений...


Наверх

Титульная страница Поиск, карта сайта Написать письмо