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

Вниз

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

 
Лариса   (2003-05-30 11:37) [0]

Добрый день, всем. Подскажите почему я не могу передать параметры в Query. Это мой первый опыт работы с данным компонентом и почем утакая проблема понять не могу. Я с помощью компонента ADOQuery пытаюсь удалить данные по условию из таблицы в Аccess. В самом Query написано:
delete from tab1
where god=:god and mes=:mes
а в программе пишу:
q1.close;
q1.parameters[0].value:=2000;
q1.parameters[1].value:="01";
q1.execsql;
После запуска программы выдается ошибка, что слишком мало параметров нужно 2. Что делать?


 
sniknik ©   (2003-05-30 11:46) [1]

q1.Params[0].Value:= 2000;


 
Лариса   (2003-05-30 11:51) [2]

Не-а, так не проходит. Выдает ошибку: Undeklared identifier "params"


 
sniknik ©   (2003-05-30 11:54) [3]

sorry глюк в ответе. сбило
> В самом Query написано:


 
Max Zyuzin ©   (2003-05-30 11:56) [4]

>Лариса (30.05.03 11:51)
А если как в обчном Query обратится по имени?
q1.ParamByName("god").AsInteger:=2000;
q1.ParamByName("mes").AsString:="01";
Ну в зависимоти от типов полей As...


 
Лариса   (2003-05-30 12:00) [5]

Я уже пробовала обращаться именно по имени. С ADO так не проходит. У него нет, чтобы можно было либо по имени, либо по номеру, только по номеру и все.


 
sniknik ©   (2003-05-30 12:02) [6]

а на какой команде ругается? так вроде все нормально выглядит, ну может еще тип явно указать, не помешает
q1.parameters[0].DataType:= ftInteger;
q1.parameters[0].value:=2000;
q1.parameters[1].DataType:= ftString;
q1.parameters[1].value:="01";

попробуй.


 
sniknik ©   (2003-05-30 12:06) [7]

Лариса (30.05.03 12:00)
>Я уже пробовала обращаться именно по имени. С ADO так не проходит. У него нет, чтобы можно было либо по имени, либо по номеру, только по номеру и все.

есть
q1.Parameters.ParamByName().Value
нет AsInteger/string ....


 
Лариса   (2003-05-30 13:56) [8]

Извините, по по работе вызывали.
Нет такого, чтобы можно было задать либо Parambyname или Params. Только Parameters[0].


 
sniknik ©   (2003-05-30 14:05) [9]

TParameters.ParamByName
TParameters See also
Locates the parameter with a given name.
function ParamByName(const Value: WideString): TParameter;

поспорим? а за Params я уже извинился он тоже есть но у TQuery, незачем его здесь вспоминать.


 
Лариса   (2003-05-30 14:12) [10]

попробовала с ParamByName-прошло, но ошибку так и выдало. У меня проблема не в том, что я не могу написать как параметры передать.а в том, что он их не принимает и все время мне выдает ошибку, что то слишком мало параметров, то слишком много.


 
WarLord ©   (2003-05-30 14:16) [11]


> delete from tab1
> where god=:god and mes=:mes
> а в программе пишу:
> q1.close;
> q1.parameters[0].value:=2000;
> q1.parameters[1].value:="01";
> q1.execsql;

должно работать
SQL нигде не переопределяется?


 
Ann ©   (2003-05-30 14:20) [12]

Ларис, а какую точно ошибку выдает?


 
Лариса   (2003-05-30 14:21) [13]

Нет, я только начала писать программку и там ничего еще кроме этого нет. Самое интересное, что когда выдется ошибка, то иногда пишется: слишком мало параметров, нужно 2, а иногда нужно 4.


 
NAlexey ©   (2003-05-30 14:24) [14]

Parameters.FindParam("YourName").Value


 
NAlexey ©   (2003-05-30 14:27) [15]

>слишком мало параметров, нужно 2, а иногда нужно 4.
Ты дорогая Лариса нами не доконца с нами честнА :) Такого не может быть, потому что быть такого не может. Приводи полный текст запроса и выполняющегося кода.


 
WarLord ©   (2003-05-30 14:30) [16]


> Лариса (30.05.03 14:21)

самый интересный вопрос: ADOQuery к ADOConnection подключен? ADOConnection активен?


 
Лариса   (2003-05-30 14:32) [17]

Слушайте, издевательство какое-то. :) Я уже все пеерпробовала, а итог такой же.


 
WarLord ©   (2003-05-30 14:34) [18]


> Лариса (30.05.03 14:32)
> Слушайте, издевательство какое-то. :) Я уже все пеерпробовала,
> а итог такой же.

чудес не бывает!


 
Лариса   (2003-05-30 14:37) [19]

NAlexey честна я с вами :) Я что в начале написла с тех пор ничего не изменилось :) Только передачу параметров меняла когда кто-нибудь что-то советовал. В итоге - ничего. Та же ошибка.

WarLord ADOQuery к ADOConnection подключен и он активен.

p.s. 1 параметр передает нормально, на 2 затыкается


 
sniknik ©   (2003-05-30 14:37) [20]

чем дальше тем больше ощущение что самое интересное за кадром...

напиши так, только точно,
q1.close;
q1.ParamCheck:= true;
q1.SQL.Text:= "delete from tab1 where god=:pGod and mes=:pMes";
q1.parameters[0].DataType:= ftInteger;
q1.parameters[0].value:= 2000;
q1.parameters[1].DataType:= ftString;
q1.parameters[1].value:= "01";
q1.execsql;
что дает в результате? и где (строка ошибки).


 
NAlexey ©   (2003-05-30 14:38) [21]

>Cлушайте, издевательство какое-то. :) Я уже все пеерпробовала, а итог такой же.
Предположение: не есть ли у тебя где триггерок или процедура какая которая срабатывает на удаление из этой таблицы?


 
NAlexey ©   (2003-05-30 14:42) [22]

>Предположение
Ах да, чтоэто я, у тебя дело до запуска даже не доходит...


 
Лариса   (2003-05-30 14:43) [23]

sniknik прям скопировала в свою программу. В итоге на строках:q1.parameters[0].DataType:= ftInteger; и q1.parameters[1].DataType:= ftString; ошибка Undeklared identifier ftInteger и ftString;
если эти строки забить, то в итоге та же ошибка с парметрами только теперь ему мало и надо 4 :))))



 
sniknik ©   (2003-05-30 14:45) [24]

Лариса (30.05.03 14:43)
модуль DB в uses.


 
Лариса   (2003-05-30 14:52) [25]

sniknik додавила, теперь ошибок на строки q1.parameters[0].DataType:= ftInteger; и q1.parameters[1].DataType:= ftString; не выдает. Но ошибка по поводу параметров осталась.


 
sniknik ©   (2003-05-30 15:03) [26]

бред.
ну ладно, код правильный, теперь давай со свойствами компонента разбиратся.
сделай все по умолчанию а лутше добавь новый и нечего не меняй кроме Connection. а то может у тебя там фильтры или связи какие. и сделай то же но с q 2. ???


 
NAlexey ©   (2003-05-30 15:06) [27]

Да там наверное в DesignTime добавлено параметров скорее всего.


 
Лариса   (2003-05-30 15:11) [28]

Попробовала. Ошибка опять-таки на строке q2.execsql; Пишет: "[Microsoft][Драйвер ODBC Microsoft Access] Слишком мало параметров.Требуется 4."


 
Лариса   (2003-05-30 15:13) [29]

NAlexey где параметры добавлены?????


 
Zz_   (2003-05-30 15:14) [30]

А может попробовать руками ?

q1.parameters.Clear;
q1.parameters.CreateParameter(...);


 
NAlexey ©   (2003-05-30 15:18) [31]

Гдето ты нас кидаешь...
Предполагаемые действия:
1) Создать эти параметры в DesignTime, принудительно присвоить им тип и значение потом запустить и смотреть что будет.
2)Попробывать написать так:
with TADOQuery.Create(nil) do
Connection := YourADOConnection;
SQL.Text := Format("delete from tab1 where god = %d and mes = %s", [1, "Blah-Blah"]);
try
ExecSQL;
finally
Free;
end;
end;
3)Сообщить о результатах.


 
sniknik ©   (2003-05-30 15:19) [32]

NAlexey © (30.05.03 15:06)
q1.ParamCheck:= true;
q1.SQL.Text:= "delete from tab1 where god=:pGod and mes=:pMes";

ParamCheck должен их переделать при изменении строки запроса.


 
Лариса   (2003-05-30 15:23) [33]

Да нигде я вас не кидаю. Я разобраться не могу, почему так, в чем проблема? :(
И я в первый раз компонентами ADO пользуюсь и не получается , что еще больше удручает.


 
NAlexey ©   (2003-05-30 15:23) [34]

>NAlexey где параметры добавлены?????
Э-э-э-...Мммм. Ну не знаю где, в ADOQuery наверное... прям жмешь на свойство Parameters(там где 3 точки) и добавляешь их. Но как уже сказал "sniknik" ParamCheck развеял наши сомнения. Так ты всеже попробуй их добавить так, прям жёстко прописать тип и значение и запустить.


 
sniknik ©   (2003-05-30 15:32) [35]

Лариса (30.05.03 15:23)
считай что меня осенило :о) (если получится)
а там ли мы ищем? если у ADOConnection1.Connected свойство прям в разработке в true поставить что будет?


 
Лариса   (2003-05-30 15:33) [36]

NAlexey да я уже так делала поначалу. С этого все и началось :)


 
Лариса   (2003-05-30 15:34) [37]

sniknik стоит оно в true


 
sniknik ©   (2003-05-30 15:41) [38]

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


 
Лариса   (2003-05-30 15:52) [39]

sniknik выслала


 
Лариса   (2003-05-30 15:59) [40]

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


 
NAlexey ©   (2003-05-30 16:04) [41]

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


 
sniknik ©   (2003-05-30 16:21) [42]

Лариса (30.05.03 15:52)
чегото сорвалось :(. не получил, ну до понедельника. надеюсь перешлеш.

можно на yandex продублировать (в остальном совпадает) для гарантии.


 
WarLord ©   (2003-05-30 16:22) [43]


> sniknik © (30.05.03 15:41)
> это уже интересно... не вышлеш проект вместе с базой? надеюсь
> база у тебя небольшая, а если еще заархивировать...

ну и что там?


 
sniknik ©   (2003-05-30 16:29) [44]

WarLord © (30.05.03 16:22)
нет ничего пока(в смысле письма нет), или ушло в никуда или пока в пути.


 
NAlexey ©   (2003-05-30 16:31) [45]

Да кстати, если разберешся напиши... Интересно всеже.


 
sniknik ©   (2003-05-30 17:09) [46]

NAlexey © (30.05.03 16:31)
догадываюсь :о). но письма до сих пор нет. так что всем умерить любопытство до понедельника... (или навсегда) :о))


 
sniknik ©   (2003-06-05 22:31) [47]

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

ну и вот что там.
поля в базе
год,месяц,собственник,пользователи,.... все поля на русском.
запрос
q1.SQL.Text:= "delete from tab1 where god=:pGod and mes=:pMes";
после замены на
q1.SQL.Text:= "delete from tab1 where [год]=:pGod and [месяц]=:pMes";
ошибка с количеством параметров исчезла. (какое чудо! ;о)

но начала выдавать "невозможно удаление данных из указанных таблиц" (типа база ридонли)
используемая строка
Provider=MSDASQL.1;Password="";Persist Security Info=True;User ID=bypakbayev_zh;Data Source=База данных MS Access;Mode=ReadWrite;Extended Properties="DSN=База данных MS Access;DBQ=D:\vag;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;";Initial Catalog=D:\vag
причем юзеров нет, и системная база не используется, и база указана DBQ=D:\vag заметьте неправильно (нужно d:\vad.mdb) т.е. строка базу не определяет, работает исключительно за счет указанной в ODBC DSN (и не совсем правильно).

после замены на (раз уж ODBC)
Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D:\vag.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
запрос заработал...

но лутше бы всетаки использовать Jet
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\vag.mdb;Persist Security Info=False
то же самое.
+ некоторые мелочи, как то - поля на английском, компоненты для работы с базой ADOxxxxx хранить в датамодуле а не на выделенной для этого форме. вместо ADOQuery/Table использовать ADODataSet/ADOCommand. В таблицу добавить ключевое поле. И т.д. (то что я еше упустил, ненамерено).

:о)) все.
p.s. если базу сжать (в аксесс) то вместо 29мег она будет меньше 4мег. потом "exe" с исходниками никогда не посылай это -605кб. -*.dcu(хотя и мелочь) итого в архиве не 628кб а 210. (почуствуйте разницу :о)) а в общем было весело, можеш еще обращатся. :о)))


 
WarLord ©   (2003-06-06 08:52) [48]

ну что ж... надеюсь, дальше будет лучше...


 
SlavonDT   (2003-06-06 09:56) [49]

Ребята, вы конечно извините, но вы гоните!
Для запроса такого вида ОБЯЗАТЕЛЬНО использование ADOCommand, а не ADOQuery, т.к. второе предполагает возврат результата, а из контекста запроса результатов быть не должно!!!!


 
sniknik ©   (2003-06-06 10:43) [50]

SlavonDT (06.06.03 09:56)
Желательно, желательно, не путай.
у кверей q1. execsql; не возвращеет датасет, и сам вызывает ADOCommand.Execute, сначала вызвав еще какуюто процедуру. (но помню, но можете посмотреть)

никто же не делает Open.

p.s. не считайте себя самым умным, сдесь все евреи. ;о))) и почитайте чего нибудь, пригодится.


 
Mc'key   (2003-06-06 16:34) [51]

Может prepare забыла сделать оттого и ен понимаит?



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

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

Наверх




Память: 0.59 MB
Время: 0.016 c
1-97607
SergeyI
2003-06-19 11:41
2003.06.30
как отловить клик на ScrollBar или кому он придалежит?


1-97580
Maxim Pshevlotsky
2003-06-15 07:10
2003.06.30
Скорость выполнения MTS


14-97853
BofA
2003-06-12 14:07
2003.06.30
Как получить страницу из интернета в виде строки?


6-97772
Zhenya
2003-04-24 20:55
2003.06.30
ClientSocket???


7-97912
DAT
2003-04-18 15:51
2003.06.30
Отсутствует доверие к программируемому доступу к проекту VB