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

Вниз

CreateParameter   Найти похожие ветки 

 
Ильичев С.А. ©   (2005-10-27 13:11) [0]


     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
Расскажите как с параметрами работать.


 
Johnmen ©   (2005-10-27 13:17) [1]

Тайна проста - CreateParameter здесь не только лишнее, но и неуместное.
Ибо параметр будет создан неявно при присвоении текста запроса.


 
Ильичев С.А. ©   (2005-10-27 13:51) [2]

Убрал CreateParameter.
Точно такая же ошибка в том же месте.


 
sniknik ©   (2005-10-27 14:33) [3]

теперь смотри чтобы все обьекты к которым обращаешся существовали в момент обращения. т.к. у тебя видать не одна ошибка в том же месте... ;)

пример
var
 Bmp: TBitmap;
begin
 Bmp.LoadFromххххх (любой метод обьекта)  - AccessViolation обьект не существует

/////
 Bmp:= TBitmap.Create;
 Bmp.LoadFromххххх (тот же самый метод)  - Ok.


 
Ильичев С.А. ©   (2005-10-27 14:58) [4]

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 15:25) [5]

ну во первых параметр это тоже обьект. возможно по какойто причине первый раз не создавлся.
а во вторых ты своими "кусочками" никак не обьясняеш ситуацию в целом. разобраться по ним нельзя, соответственно - это просто обыкновенное чудо... ;)


 
Nikolay M. ©   (2005-10-27 15:32) [6]

Кусочек кода побольше все-таки увидеть бы...


> это просто обыкновенное чудо

Раньше, когда люди не могли объяснить увиденное, они говорили: "чудо". Сейчас они говорят: "Фотошоп".


 
Ильичев С.А. ©   (2005-10-27 17:30) [7]

да этих кусочков вволне достаточно
что бы ответить на мой вопрос надо было просто оказаться раньше в такой ситуации

ну если надо - значит надо

 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;


 
sniknik ©   (2005-10-27 17:50) [8]

> ну если надо - значит надо
а ты сомневался?

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

> да этих кусочков вволне достаточно
> что бы ответить на мой вопрос надо было просто оказаться раньше в такой ситуации
сказал вовочка глядя на двойку поставленную марьей ивановной... ;)

нафига оказываться то? чтобы чтото знать не обязательно на все грабли в округе понаступать...

p.s. больше не "фильтруй" информацию. если бы ты был способен решить что нужно для решения вопроса то был бы способен и сам его (вопрос) решить. это примерно одного уровня сложности задачи.


 
sniknik ©   (2005-10-27 17:57) [9]

кстати Data это просто указатель, так? ему прежде чем по нему записывать память выделить не надо? по моему надо... еще одна причина для AV


 
Johnmen ©   (2005-10-27 18:13) [10]

>sniknik ©   (27.10.05 17:57) [9]

В данном случае не надо, т.к. это свойство типа указатель. Он туда пишет интегер, а интегер того же размера, что и указатель.


 
sniknik ©   (2005-10-27 18:18) [11]

Johnmen ©   (27.10.05 18:13) [10]
тогда надо писать с переопределением типа а не по адресу...
типа так
вместо
PInt(Data)^ := FieldByName("Project_ID").AsInteger;
это
Data:= Pointer(FieldByName("Project_ID").AsInteger);
и естественно теперь его как поинтер не использовать ;о)


 
Johnmen ©   (2005-10-27 18:20) [12]

>sniknik ©   (27.10.05 18:18) [11]

Ну естественно...


 
sniknik ©   (2005-10-27 18:27) [13]

ну а если естественно? то сейчас он пишет "в никуда" т.к. значение при создании у data будет nil (а если случайно там окажется случайное число -> = AV).


 
Nikolay M. ©   (2005-10-27 18:41) [14]

Какая разница, что такое Data, если ошибка вываливается

> при назначении текста SQL

да еще в студийной библиотеке? Если это действительно так, то на месте автора я бы начал с того, что выкинул все, кроме присвоения текста SQL и посмотрел, останется ли ошибка.


 
Ильичев С.А. ©   (2005-10-27 18:52) [15]

2 sniknik ©
уважаемый
может вопрос и глуповат, но он не делает из меня дебила
память выделяю где считаю целесообразным

procedure TfmMain.TreeView1Addition(Sender: TObject; Node: TTreeNode);
begin
 Node.Data := AllocMem(SizeOf(Integer));
end;

норм?

не надо придумавать мне проблемы за меня
если б я не мог локализавть ошибку, то начал бы с этого свой вопрос

ну и если уж Вы так разбираетесь,
не сочтите за труд ответить на четвётрый пост


 
Nikolay M. ©   (2005-10-27 19:05) [16]


> четвётрый пост

Ты эта... Не хами. Люди тебе за спасибо помогают, а не потому, что ты им одолжение делаешь.

Версию MDAC занеси в студию. Если ошибка в msvcrt, то дельфи, по ходу, не при чем.


 
sniknik ©   (2005-10-27 20:36) [17]

Ильичев С.А. ©   (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 22:16) [18]


> ну тут тогда можно "списать" все на неполноценность ADOQuery
> с ее убогой надстройкой в виде SQL

Возможно, хотя и маловероятно. Поэтому хотелось бы заслушать ответы на вопросы, явно или косвенно заданные в [14] и [16].


 
Ильичев С.А. ©   (2005-10-28 10:27) [19]

2 sniknik ©   (27.10.05 20:36) [17]

мы на одном языке говорим ?

на это было отвечено в посте номер [5] с пояснениями в [8]

смотрю [5]

ну во первых параметр это тоже обьект. возможно по какойто причине первый раз не создавлся.

как добваление скобок во второй строке влияет на результат выполнения предыдущей? А?

смотрю [8]

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

Повторяю [2]
Убрал CreateParameter.
Точно такая же ошибка в том же месте.


И почему тогда запрос верно выполняется.
Последовательность действий я не менял.
Просто скобки добавил.

и насколько я себя знаю... ;) я буду трепатся с вами до посинения...
я уже тонял что Вы это любите, но давайте лучше по существу
или вобще ничего.


 
Ильичев С.А. ©   (2005-10-28 10:41) [20]

2 Nikolay M.

Версию MDAC занеси в студию

2.70.7713.4

месте автора я бы начал с того, что выкинул все, кроме присвоения текста SQL и посмотрел, останется ли ошибка.


 with DataModule2.ADOQuery1 do
 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] = :Param1";
 end;


Ошибка осталась.


 
msguns ©   (2005-10-28 10:52) [21]

>Ильичев С.А. ©   (28.10.05 10:41) [20]

with DataModule2.ADOQuery1 do
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] = :Param1";
 Parameters.ParamByName("Param1").Value := PInt(Node.Data)^);
  ...
end;


 
Nikolay M. ©   (2005-10-28 10:56) [22]


> Ильичев С.А. ©   (28.10.05 10:41) [20]

Попробуй мдак посвежее поставить.

Надеюсь, этот код выполняется не в OnCreate главной формы и на момент выполнения DataModule2.ADOQuery1 существует?


 
Ильичев С.А. ©   (2005-10-28 11:09) [23]

2 Nikolay M. ©   (28.10.05 10:56) [22]

да на буттон1клик просто скопировал косок
само собой всё создано

Попробуй мдак посвежее поставить.
сейчас скачаю

2 msguns ©   (28.10.05 10:52) [21]
да что тут не понятного, блин, я вобще не попаду на
Parameters.ParamByName("Param1").Value := PInt(Node.Data)^)
по тому что исключение раньше возникат


 
msguns ©   (2005-10-28 11:14) [24]

Так у тебя нету "живого" TADOQuery.
И еще-а зачем кв.скобки ?


 
Nikolay M. ©   (2005-10-28 11:15) [25]

Строку подключения покажи?
А если, как уже советовалось, вместо ADOQuery использовать ADODataSet?


 
Ильичев С.А. ©   (2005-10-28 11:26) [26]

2 Nikolay M. ©   (28.10.05 11:15) [25]
Строка подключения - имя .udl файла.

А что, есть сведения что ADODataSet получше ADOQuery ?
Я просто с АДО недавно.

2 msguns ©   (28.10.05 11:14) [24]
Так у тебя нету "живого" TADOQuery.
не понял

И еще-а зачем кв.скобки ?
Я так привык. Мне удобно.


 
Nikolay M. ©   (2005-10-28 11:32) [27]


> Строка подключения - имя .udl файла.

А содержимое у этого файла есть?


> А что, есть сведения что ADODataSet получше ADOQuery

В "родном" АДО такого объекта как ADOQuery не существует, в дельфях он сделан как наследник TCustomADODataSet для тех, кто привык пользоваться БДЕшным TQuery.


 
Johnmen ©   (2005-10-28 11:45) [28]

>Nikolay M. ©   (28.10.05 11:32) [27]
>... в дельфях он сделан как наследник TCustomADODataSet для тех, кто привык пользоваться БДЕшным TQuery.

А для тех, кто любит делать INSERT по-простому, что сделано?
:)


 
Nikolay M. ©   (2005-10-28 11:57) [29]


>  INSERT по-простому

"По-простому" - это как?


 
msguns ©   (2005-10-28 12:02) [30]

>Ильичев С.А. ©   (28.10.05 11:26) [26]
>А что, есть сведения что ADODataSet получше ADOQuery ?

Нет, тот же хрен, только вид сбоку ;))

>>Так у тебя нету "живого" TADOQuery.
>не понял

Попробуй перед
  SQL.Text := поставить
if not assigned(ADOQuery1) then ShowMessage("А ведь кверьки-то нетути");


 
Johnmen ©   (2005-10-28 12:04) [31]

Начнем тогда с "...делать INSERT, ..."


 
Nikolay M. ©   (2005-10-28 12:09) [32]


> Johnmen ©   (28.10.05 12:04) [31]

Яснее все равно не стало :)
Мне всегда хватало ADODataSet и ADOCommand.


 
Ильичев С.А. ©   (2005-10-28 12:11) [33]

2 Nikolay M. ©   (28.10.05 11:32) [27]

В "родном" АДО такого объекта как ADOQuery не существует, в дельфях он сделан как наследник TCustomADODataSet для тех, кто привык пользоваться БДЕшным TQuery.

Ну так то и TADODataSet тоже наследник TCustomADODataSet.  ;)

А содержимое у этого файла есть?

[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Password="";Persist Security Info=True;User ID=programm_connector;Initial Catalog=Billing;Data Source=NVV


"По-простому" - это как?
меня в таком случае больше интересует как мне запрос с
DELETE выполнить и получить количество удалённых строк

2 msguns ©   (28.10.05 12:02) [30]
Попробуй перед
SQL.Text :=
поставить
if not assigned(ADOQuery1) then ShowMessage("А ведь кверьки-то нетути");

это прикол ?


 
Nikolay M. ©   (2005-10-28 12:26) [34]


> OLE DB initstring

Не придерешься :(
А если with убрать?


> как мне запрос с DELETE выполнить и получить количество удалённых строк

Прочитать варианты вызова TADOCommand.Execute.


 
msguns ©   (2005-10-28 12:30) [35]

>Ильичев С.А. ©   (28.10.05 12:11) [33]
>это прикол ?

Да ведь до приколов ли тут ? А как прикажешь думать, если у тебя а этом операторе
 SQL.Text :=
вылезает AV ?

Первый мысль - это "А есть ли вообще этот квери ? В смысле создан ли, а если создан, то не грохнут ?"
Второй мысль - это глюк в самом операторе, т.е. в момент присвоения этому св-ву нового значения где-то "внутре" TADOCustomDataSet проистекает нечто, что приводит к AV. Например, попытка перестроить список параметров (Parameters)..

Есть еще и третий мысль. Но не скажу.
Пока ;)


 
Nikolay M. ©   (2005-10-28 12:35) [36]


> Первый мысль - это "А есть ли вообще этот квери ?

Не первый, а второй. Первый был я :)
Вопрос уже решен.


 
Johnmen ©   (2005-10-28 12:44) [37]

>Nikolay M. ©   (28.10.05 12:09) [32]
>Мне всегда хватало ADODataSet и ADOCommand.

Так и знал. :)
Использовать ADOQuery "легче", чем ADOCommand. ИМХО.


 
Nikolay M. ©   (2005-10-28 13:23) [38]


> Johnmen ©   (28.10.05 12:44) [37]
> Использовать ADOQuery "легче", чем ADOCommand. ИМХО.

На вкус и цвет все фломастеры разные :)



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

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

Наверх




Память: 0.58 MB
Время: 0.035 c
11-1113926956
Zoom
2005-04-19 20:09
2005.12.11
Progress в статус бар формы


14-1132552889
Ega23
2005-11-21 09:01
2005.12.11
С днем рождения! 21 ноября


2-1132879303
sergey1126
2005-11-25 03:41
2005.12.11
Не все ячейки красяться в stringgride


2-1132841801
Igor_thief
2005-11-24 17:16
2005.12.11
Почему не работает практически идентичный код?


11-1113549791
rOose
2005-04-15 11:23
2005.12.11
OpenSaveDialog