Форум: "Базы";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.007 c