Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Есть разница м/у Open и ExecSQL в ADOQuery? 


Boo   (2002-03-28 17:21) [0]

Есть MSSQL2000, MDAC2.7 (пробовал и с другими версиями).

Делаю связку:

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("select id, text from Table1");
ADOQuery1.Open;
DataSource1.DataSet:=ADOQuery1;
ADOQuery2.DataSource:=DataSource1;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add("Update Table1 set text="dsgvd" where id=:id");
ADOQuery2.Prepared:=True;
ADOQuery2.ExecSQL;


Дык вот. В параметр ADOQuery.Parameters[0] почему-то выдается [null] и следовательно ничего не изменяется (id - уникальное поле), т. е. значение параметра автоматом не присвается
Но! Если вместо ADOQuery2.ExecSQL; поставить ADOQuery2.Open, то прога ругается (некуда поставить курсор), но изменения в базе происходят (параметр id принимает зависимое значение)
К чему-бы енто? (и желательно - как лечится :-))



Aleksandr   (2002-03-28 17:29) [1]

Гы... параметры всегда ручками ставятся... Енто Борланд знает, что вместо :id надо подставить параметр из списка параметров, а Transact-SQL на энто до фени...
Всего лишь одна строчка:
ADOQuery2.Parameters.ParamByName("ID").Value:=...



Boo   (2002-03-28 17:40) [2]

Да нее... Компилятор сам создает конструкцию, которая при работе программы подставляет вместо :id - значение из ADOQuery1 (стандартная связка), только вот почему с такими параметрами Open и ExecSQL работают совершенно по-разному - ХЗ
:-)



aus   (2002-03-28 18:48) [3]

Вроде бы должен знать компилятор, только почему-то не всегда делает то, что нужно. Вручную надежнее.
А разницу посмотри в исходниках.



Shaman_Naydak   (2002-03-28 20:26) [4]

Да.. тут еще есть баги..
ты кстати ADOUpdate провесил ?

У меня тоже была такая фишка..
Вызывалась хранимая,возвращающая recordset (хранимая тоже хитрая, но не в ней дело)
Мне нужно было получить _Recordset.
Я сперва как всегда использовал
MyRecordset:=ADOCommand1.Execute;
И при присвоении его потом ADODataset2.Recordset:=MyRecordset
все вставало раком..
переписал первое как (использовал TADODataset вместо TADOCOmmand)
ADODataset1.Open; MyRecordset:=ADODaatset1.Recordset;
И все заработало.. разница там, что в случае Dataset"а сперва создается _Recordset, инициализируется как-то хитро, а потом вызывается _Command..
Короче,и у ADO и у борланда еще не все в порядке в этом месте
(причем, по моему, у ADO намного больше не в порядке)



Boo   (2002-03-28 21:32) [5]

> Shaman_Naydak
У Борланда (BDE+ODBC) я видел всего 2 траблы:
1) дебильная настройка (sorry) - ODBC, потом BDE
2) при некоторых драйверах ODBC для MSSQL recordcount из принципа выдает -1, при других - string-и режутся до 250 символов

Вот и решил перейти на ADO (простота настройки - одна строка + нормальная работа с длинными строками в база), дык нет - трабла с параметрами для ExecSQL.
Кстати нашел разницу м/у Open и ExecSQL:
Open - метод TDataSet
ExecSQL - метод TADOQuery, который работает через Execute
но вот куда деваются параметры (из DataSource) - ХЗ
:-)




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.038 c
14-57842          VuDZ                  2002-03-10 13:06  2002.04.18  
SQL Request - помогите, а то всё забыл


1-57693           esprit_bel            2002-04-01 04:19  2002.04.18  
Про окно


1-57823           Ученики СШ51          2002-04-06 09:41  2002.04.18  
Убрать из...


1-57702           ymin                  2002-04-08 10:12  2002.04.18  
а как форму с stringGrid или stringGrid из формы сохранить в форм


3-57641           Kuzmich               2002-03-28 15:17  2002.04.18  
ADO и WebServices - вещи несовместимые?