Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateParameter [D7, MSSQL]


Страницы:   1 2

Ильичев С.А. ©   (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 здесь не только лишнее, но и неуместное.
Ибо параметр будет создан неявно при присвоении текста запроса.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо