![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateParameter [D7, MSSQL]
Ильичев С.А. © (2005-10-27 13:11:00)
Parameters.CreateParameter('Param1', ftInteger, pdInput, SizeOf(Integer), PInt(Node.Data)^);
SQL.Text := 'SELECT P1.[Project_ID], P1.[Project_Name], (SELECT COUNT(*) FROM [v_Project] P2 WHERE P1.[Project_ID] = P2.[Parent_Project_ID]) AS Children_Count FROM [v_Project] P1 WHERE P1.[Parent_Project_ID] = :Param1';
Есть какая-то тайна в этом действии
при назначении текста SQL вываливается EAccessViolation в модуле MSVCRT.dll
Расскажите как с параметрами работать.
Nikolay M. (2005-10-27 22:16:00) [21]
> ну тут тогда можно "списать" все на неполноценность ADOQuery
> с ее убогой надстройкой в виде SQL
Возможно, хотя и маловероятно. Поэтому хотелось бы заслушать ответы на вопросы, явно или косвенно заданные в [14] и [16].
sniknik (2005-10-27 20:36:00) [22]Ильичев С.А. © (27.10.05 18:52) [15]
я писал чтото об ваших умственных способностях?
> ну и если уж Вы так разбираетесь,
> не сочтите за труд ответить на четвётрый пост
на это было отвечено в посте номер [5] с пояснениями в [8]
и насколько я себя знаю... ;) я буду трепатся с вами до посинения, пока вы моих рекомендаций не проверите и не скажете о результатах. но повторять то же самое... ну только в исключительных случаях.
Nikolay M. © (27.10.05 19:05) [16]
> Если ошибка в msvcrt, то дельфи, по ходу, не при чем.
как это ни при чем если параметра нет?
хотя... ты прав, если бы от параметра, то это должно быть позже не на присвоении SQL, а на следующем, открытии запроса....
ну тут тогда можно "списать" все на неполноценность ADOQuery с ее убогой надстройкой в виде SQL, и посоветовать перейти на ADODataSet и записывать запрос сразу туда куда он предназначен в CommandText...
Nikolay M. (2005-10-27 19:05:00) [23]
> четвётрый пост
Ты эта... Не хами. Люди тебе за спасибо помогают, а не потому, что ты им одолжение делаешь.
Версию MDAC занеси в студию. Если ошибка в msvcrt, то дельфи, по ходу, не при чем.
Ильичев С.А. (2005-10-27 18:52:00) [24]2 sniknik ©
уважаемый
может вопрос и глуповат, но он не делает из меня дебила
память выделяю где считаю целесообразным
procedure TfmMain.TreeView1Addition(Sender: TObject; Node: TTreeNode);
begin
Node.Data := AllocMem(SizeOf(Integer));
end;
норм?
не надо придумавать мне проблемы за меня
если б я не мог локализавть ошибку, то начал бы с этого свой вопрос
ну и если уж Вы так разбираетесь,
не сочтите за труд ответить на четвётрый пост
Nikolay M. (2005-10-27 18:41:00) [25]Какая разница, что такое Data, если ошибка вываливается
> при назначении текста SQL
да еще в студийной библиотеке? Если это действительно так, то на месте автора я бы начал с того, что выкинул все, кроме присвоения текста SQL и посмотрел, останется ли ошибка.
sniknik (2005-10-27 18:27:00) [26]ну а если естественно? то сейчас он пишет "в никуда" т.к. значение при создании у data будет nil (а если случайно там окажется случайное число -> = AV).
Johnmen (2005-10-27 18:20:00) [27]>sniknik © (27.10.05 18:18) [11]
Ну естественно...
sniknik (2005-10-27 18:18:00) [28]Johnmen © (27.10.05 18:13) [10]
тогда надо писать с переопределением типа а не по адресу...
типа так
вместо
PInt(Data)^ := FieldByName('Project_ID').AsInteger;
это
Data:= Pointer(FieldByName('Project_ID').AsInteger);
и естественно теперь его как поинтер не использовать ;о)
Johnmen (2005-10-27 18:13:00) [29]>sniknik © (27.10.05 17:57) [9]
В данном случае не надо, т.к. это свойство типа указатель. Он туда пишет интегер, а интегер того же размера, что и указатель.
sniknik (2005-10-27 17:57:00) [30]кстати Data это просто указатель, так? ему прежде чем по нему записывать память выделить не надо? по моему надо... еще одна причина для AV
sniknik (2005-10-27 17:50:00) [31]> ну если надо - значит надо
а ты сомневался?
у тебя как такового параметра нет, первым до текста запроса его ни создают ни присваивают значение... присвоение текста запроса переинициализирует параметры...
и потом тебе же сказали
> CreateParameter здесь не только лишнее, но и неуместное.
убери. просто сделай присвоение после внесения запроса.
> да этих кусочков вволне достаточно
> что бы ответить на мой вопрос надо было просто оказаться раньше в такой ситуации
сказал вовочка глядя на двойку поставленную марьей ивановной... ;)
нафига оказываться то? чтобы чтото знать не обязательно на все грабли в округе понаступать...
p.s. больше не "фильтруй" информацию. если бы ты был способен решить что нужно для решения вопроса то был бы способен и сам его (вопрос) решить. это примерно одного уровня сложности задачи.
Ильичев С.А. (2005-10-27 17:30:00) [32]да этих кусочков вволне достаточно
что бы ответить на мой вопрос надо было просто оказаться раньше в такой ситуации
ну если надо - значит надо
with DataModule2.ADOQuery1, fmMain.TreeView1 do
begin
if assigned(Node) then
begin
Parameters.CreateParameter('Param1', ftInteger, pdInput, SizeOf(Integer), PInt(Node.Data)^);
SQL.Text := 'SELECT P1.[Project_ID], P1.[Project_Name], (SELECT COUNT(*) FROM [v_Project] P2 WHERE P1.[Project_ID] = P2.[Parent_Project_ID]) AS Children_Count FROM [v_Project] P1 WHERE P1.[Parent_Project_ID] = (:Param1)';
Open;
while not Eof do
begin
with Items.AddChild(Node, FieldByName('Project_Name').AsString) do
begin
PInt(Data)^ := FieldByName('Project_ID').AsInteger;
HasChildren := FieldByName('Children_Count').AsInteger > 0;
end;
Next;
end;
Close;
Parameters.Clear;
end
else begin
SQL.Text := 'SELECT P1.[Project_ID], P1.[Project_Name], (SELECT COUNT(*) FROM [v_Project] P2 WHERE P1.[Project_ID] = P2.[Parent_Project_ID]) AS Children_Count FROM [v_Project] P1 WHERE P1.[Parent_Project_ID] IS NULL';
Open;
while not Eof do
begin
with Items.Add(nil, FieldByName('Project_Name').AsString) do
begin
PInt(Data)^ := FieldByName('Project_ID').AsInteger;
HasChildren := FieldByName('Children_Count').AsInteger > 0;
end;
Next;
end;
Close;
end;
end;
Nikolay M. (2005-10-27 15:32:00) [33]Кусочек кода побольше все-таки увидеть бы...
> это просто обыкновенное чудо
Раньше, когда люди не могли объяснить увиденное, они говорили: "чудо". Сейчас они говорят: "Фотошоп".
sniknik (2005-10-27 15:25:00) [34]ну во первых параметр это тоже обьект. возможно по какойто причине первый раз не создавлся.
а во вторых ты своими "кусочками" никак не обьясняеш ситуацию в целом. разобраться по ним нельзя, соответственно - это просто обыкновенное чудо... ;)
Ильичев С.А. (2005-10-27 14:58:00) [35]sniknik © (27.10.05 14:33) [3]
Да не то всё. Само собой это я проверил в первую очередь.
Вот сейчас кусочек запроса в скобки (где параметр в конце)
SQL.Text := 'SELECT P1.[Project_ID], P1.[Project_Name], (SELECT COUNT(*) FROM [v_Project] P2 WHERE P1.[Project_ID] = P2.[Parent_Project_ID]) AS Children_Count FROM [v_Project] P1 WHERE P1.[Parent_Project_ID] = (:Param1)';
и всё заработало.
Как так?
sniknik (2005-10-27 14:33:00) [36]теперь смотри чтобы все обьекты к которым обращаешся существовали в момент обращения. т.к. у тебя видать не одна ошибка в том же месте... ;)
пример
var
Bmp: TBitmap;
begin
Bmp.LoadFromххххх (любой метод обьекта) - AccessViolation обьект не существует
/////
Bmp:= TBitmap.Create;
Bmp.LoadFromххххх (тот же самый метод) - Ok.
Ильичев С.А. (2005-10-27 13:51:00) [37]Убрал CreateParameter.
Точно такая же ошибка в том же месте.
Johnmen (2005-10-27 13:17:00) [38]Тайна проста - CreateParameter здесь не только лишнее, но и неуместное.
Ибо параметр будет создан неявно при присвоении текста запроса.