Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.27;
Скачать: [xml.tar.bz2];

Вниз

параметрические запросы в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
2-1198727890
Washington
2007-12-27 06:58
2008.01.27
Виртуальная память, оперативная память


2-1199041662
DmT
2007-12-30 22:07
2008.01.27
использование стандартного ввода/вывода для конс. приложений


15-1197887433
Дмитрий
2007-12-17 13:30
2008.01.27
Пожалуйста помогите с Pascal


2-1199292200
Петровский
2008-01-02 19:43
2008.01.27
Привязка к ПК


2-1198583952
312kbps
2007-12-25 14:59
2008.01.27
SelectDirectory





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский