![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы по 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
где параметрам присавиваются одинаковые значения...
А вообще, если уж запрос строится динамически, то и строй его с учетом текущих значений...