Текущий архив: 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.56 MB
Время: 0.041 c