Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.035 c
8-1120762481
ronyn
2005-07-07 22:54
2005.12.11
Как к тексту добавить графику?


4-1128418629
NightLord
2005-10-04 13:37
2005.12.11
InternetExplorer


3-1130058026
darklord
2005-10-23 13:00
2005.12.11
update тока одной записи


1-1131796854
Bruce
2005-11-12 15:00
2005.12.11
Хранение и передача пароля


3-1130416819
Андрей Жук
2005-10-27 16:40
2005.12.11
Из какой вьюхи получить список полей таблиц в Oracle?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский