Форум: "Начинающим";
Текущий архив: 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