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

Вниз

параметрические запросы в ADO. что я упустил7   Найти похожие ветки 

 
umbra ©   (2007-12-24 12:44) [0]

есть адодатасет dsMain, у которого в коллекции Parameters создано 5 параметров

name типа ftString
date типа ftDate
dtindex типа ftInteger
nmindex типа ftInteger
rjnumber типа ftString;


База аксессовская, dsMain.ParamCheck = true;
Сперва выполняется следующий код:

procedure TdmBaseLink.SetAccount(const Value: String);
begin
 if FAccount = "" then
   begin
     FAccount := Value;
     with dsMain do
       begin
//это контейнер для хранения параметров
         FParameters[0].Value := Value;
         Parameters[0].Value := Value;
         CommandText := "SELECT Counter FROM accounts " +
                    "WHERE accname=:name";
//здесь, как я понимаю, dsMain.Parameters.Count = 1
         Open;
         FParameters[3].Value := Fields[0].AsInteger;
         Close;
//восстанавливаем состояние параметров
         RestoreParams;
       end;
   end;
end;


эта процедура отрабатывает без проблем. Далее выполняется следующая
function TdmBaseLink.DateExists: Boolean;
begin
 Result := True;
 with dsMain do
   begin
     CommandText := "SELECT dtcounter FROM dates " +
                    "WHERE (accdate=:date) AND (AccName=:nmindex)";
//здесь dsMain.Parameters.Count = 1
     Open;//здесь получаем сообщение о том, что не всем
                        //параметрам присвоено значение
     if not Bof then
       Result := False
     else
       begin
         FParameters[2].Value := Fields[0].AsInteger;
       end;
     Close;
     RestoreParams;
   end;
end;

что я упускаю? в отладчике видно, что значения у параметров есть.


 
Kolan ©   (2007-12-24 12:48) [1]

> //здесь, как я понимаю, dsMain.Parameters.Count = 1

А на самом деле как?


 
Kolan ©   (2007-12-24 12:50) [2]

> //восстанавливаем состояние параметров
>         RestoreParams;

Так а тут что?


 
umbra ©   (2007-12-24 12:59) [3]


> А на самом деле как?
>

именно так


> Так а тут что?
>

procedure TdmBaseLink.RestoreParams;
begin
 FParameters.RestoreDatasetParams(dsMain);
 FParameters.RestoreCommandParams(cmdMain);
end;


FParameters имеет тип TSimpleParams

 TSimpleParams = class
 private
   FParams: TObjectList;
   function GetItem(index: Integer): TSimpleParam;
   procedure SetItem(index: Integer; const Value: TSimpleParam);
   function GetCount: Integer;
 public
   constructor Create; reintroduce; virtual;
   destructor Destroy; override;
   function Add: TSimpleParam;
   procedure Delete(item: Integer);
   function Insert(before: Integer): TSimpleParam;
   procedure RestoreDatasetParams(target: TADODataSet);
   procedure RestoreCommandParams(target: TADOCommand);
   property Items[index: Integer]: TSimpleParam read GetItem write SetItem; default;
   property Count: Integer read GetCount;
 end;

procedure TSimpleParams.RestoreDatasetParams(target: TADODataSet);
var
  i: Integer;
  tmp: TParameter;

begin
 with target.Parameters do
   begin
     Clear;
     for i := 0 to FParams.Count - 1 do
       begin
         tmp := Add as TParameter;
         Self[i].AssignTo(tmp);
       end;
   end;
end;

RestoreCommandParams полностью аналогично, только параметрі добавляются в ADOCommand


 
sniknik ©   (2007-12-24 13:17) [4]

при присвоении запроса CommandText-у параметры пере-инициализируются (тк. ParamCheck = true;)

> //здесь dsMain.Parameters.Count = 1
а должно бы быть 2, т.к. их два в запросе
> ...
> "WHERE (accdate=:date) AND (AccName=:nmindex)";

> что я упускаю?
да ты их вообще не задаешь... а должен сразу после внесения запроса (не до!!!).

> в отладчике видно, что значения у параметров есть.
а вот это странно... как и со счетчиком параметров, уверен что смотришь туда куда надо?


 
sniknik ©   (2007-12-24 13:24) [5]

> тк. ParamCheck = true;
это не значит что поставив false ты сохранишь предустановленные значения, нет, это будет значить, что автопарсинг/автосоздание убираются и задача по инициализации ложится на программиста (by hand)...


 
umbra ©   (2007-12-24 13:26) [6]

> //здесь dsMain.Parameters.Count = 1
а должно бы быть 2, т.к. их два в запросе

имелось в виду dsMain.Parameters.Count = 2 Копипаст подвел :)

да ты их вообще не задаешь...

они задаются в сеттерах свойств и хранятся в списке FParameters. после RestoreParams значения оказываются в dsMain.Parameters Так что ничего странного нет :)


> а должен сразу после внесения запроса (не до!!!).

именно так? просто ДО присвоения текста запроса у меня есть 5 параметров, после присвоения - столько, сколько параметров в тексте запроса.


 
umbra ©   (2007-12-24 13:37) [7]


> это не значит что поставив false ты сохранишь предустановленные
> значения, нет, это будет значить, что автопарсинг/автосоздание
> убираются и задача по инициализации ложится на программиста
> (by hand)...

да это я уже понял. Просто я думал, что сработает следующая схема - значения и типы параметров хранятся в отдельном списке. После каждого изменения текста запроса при ParamCheck = true; в датасете остается столько параметров, сколько в тексте запроса. Поэтому, после закрытия датасета из списка в датасет добавляются все параметры, со всеми готовыми значениями, а при следующем запросе остаются только нужные. Но что-то все не так просто, наверное.
На самом деле все это - сбор вспомогательной информации, хранящейся в базе и нужной приложению.


 
sniknik ©   (2007-12-24 15:07) [8]

> после RestoreParams значения оказываются в dsMain.Parameters Так что ничего странного нет :)
странно то, что RestoreParams у тебя вызывается после Open;, т.е. даже если ты там их правильно восстанавливаешь то все одно поздновато будет.


 
umbra ©   (2007-12-24 15:21) [9]


> странно то, что RestoreParams у тебя вызывается после Open;

оно всегда и должно быть после Open. На момент открытия все параметры уже имеют нужные значения. На самом деле вся эта возня - это последовательная инициализация этих самых параметров на основе уже инициализированных. Первой всегда вызывается TdmBaseLink.SetAccount. В ней происходит первое обращение к базе и в ней входящий параметр присваивается и dsMain.Parameters[0].Value и FParameters[0].Value. После этого везде значения присваиваются только FParameters[х].Value, а после закрытия датасета вызывается RestoreParams.


 
umbra ©   (2007-12-24 15:27) [10]


> .е. даже если ты там их правильно восстанавливаешь

в отладчике видно, что количество параметров, их значения и порядок - правильные.


> "WHERE (accdate=:date) AND (AccName=:nmindex)";

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


 
sniknik ©   (2007-12-24 17:05) [11]

> На момент открытия все параметры уже имеют нужные значения.
если бы было так то этого
> получаем сообщение о том, что не всем параметрам присвоено значение
бы не было...

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

> если AccName - подстановочное значение из другой таблицы, связанное по счетчику
у тебя в запросе нет связи, подстановочного значения которое делает аксесс, ... банальная, плоская таблица (ели цель получить аналог запроса в аксесс), есть только поле связи (раз говориш это оно). подставлять естественно нужно значение того же типа, что поле по которому связь, а не того, которое аксесс ставит на его место (у тебя его и нет, т.что выбор из одного варианта).


 
umbra ©   (2007-12-24 17:57) [12]

Все дело оказалось в том, что в таблице Accounts поле-счетчик я назвал Counter  Усиленно читая справку, я обнаружил, что это зарезервированное слово
Изменил название поля и все прошло. :)



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.112 c
3-1189751998
Xmen
2007-09-14 10:39
2008.01.27
Учет доставки периодики. Проблема с недоставкой.


2-1198581830
Koss
2007-12-25 14:23
2008.01.27
Работа с Indy


15-1198157501
Ins
2007-12-20 16:31
2008.01.27
Delphi Puzzles


3-1190114648
Oleg_teacher
2007-09-18 15:24
2008.01.27
Динамическое создания поля в Парадоксе


1-1192971907
Dimmitt
2007-10-21 17:05
2008.01.27
Синхронная прокрутка двух Memo