![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос для ADOQuery [D7, Access]
SH © (2004-08-31 14:28:00)Подключился через ADO к базе данных Access. Почему-то не хочет работать
стандартная SQL конструкция INSERT INTO(param_name) VALUES(param_value).
Вот кусок кода:
---------------
FIATPDB.ADOQuery1.SQL.Clear;
FIATPDB.ADOQuery1.SQL.Add('INSERT INTO SiteVisits(RefUserID,Site,SiteID,' +
'VisitDate,VisitPurpose,VisitDuration, VisitTime,Offsite)' +#13+
'VALUES('+user_id+','+quotedstr('Molodechno City Library')+
',242,'+datetostr(Date)+','+quotedstr('pubsite visit')+
',60,'+quotedstr(datetimetostr(time))+',False)');
memo1.Lines:=FIATPDB.ADOQuery1.SQL;
FIATPDB.ADOQuery1.Open;
---------------
Последовательность полей/значений соблюдаю, посылаю не все поля, а выборочно -
только обязательные для заполнения.
Использую компоненты: TADOQuery, TADOConnection, TDataSource, TDBGrid.
Моя ConnectionString:
----------------------
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Gena\Delphi6\Access\Molodechno.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
SH (2004-09-07 19:59:00) [1]Ещё вопрос. Как сделать, чтобы после выполнения этого запроса на insert произошло обновление данных DBGrid с выводом всего на экран. Пробовал:
with adoquery1 do
begin
ssql:='INSERT INTO dates([date]) VALUES('+DateToMSAccessSQLString(date)+')';
sql.Add(ssql);
execsql;
ssql:='select * from dates';
sql.Add(ssql);
open;
end;
SH (2004-09-07 19:53:00) [2]Вы правы, не в формате даты дело. Всё из-за метода open. Кидает ошибки: "ADOQuery1: Command text does not return a result set" и ещё что-то типа "do no return multiple recordset for single object..."
46_55_41_44 (2004-09-01 16:24:00) [3]Ойййййййй... Ну конечно ExecSql;!!!!!!!!!!
когда пишешь open, тогда выводит ошибку, типа запрос не возвращает набор данных!!!
мляяя... Спать надо больше!!!
Wolfram (2004-09-01 14:23:00) [4]FIATPDB.ADOQuery1. Open;
попробуй ADOQuery1. execsql;
46_55_41_44 (2004-09-01 09:44:00) [5]FIATPDB.ADOQuery1.Close;
FIATPDB.ADOQuery1.SQL.Clear;
FIATPDB.ADOQuery1.SQL.Add('INSERT INTO SiteVisits(RefUserID,Site,SiteID,VisitDate,VisitPurpose,VisitDuration, VisitTime,Offsite)');
FIATPDB.ADOQuery1.SQL.Add('Values(');
FIATPDB.ADOQuery1.SQL.Add(#39 + user_id + #39 + ','); //если user_id текстовая переменная, если нет то без #39 и так для всех!!!!
FIATPDB.ADOQuery1.SQL.Add(#39 + 'Molodechno City Library' + #39 + ',');
FIATPDB.ADOQuery1.SQL.Add('242' + ',');
FIATPDB.ADOQuery1.SQL.Add(datetostr(Date) + ',');
FIATPDB.ADOQuery1.SQL.Add(#39 + 'pubsite visit' + #39 + ',');
FIATPDB.ADOQuery1.SQL.Add('60' + ',');
FIATPDB.ADOQuery1.SQL.Add(datetimetostr(time) + ',');
//или так FIATPDB.ADOQuery1.SQL.Add(#39 + datetimetostr(time) + #39 + ','); //насколько я понял VisitTime текстовое поле, если так то этот вариант, если нет, то верхний
FIATPDB.ADOQuery1.SQL.Add('False' + ')');
FIATPDB.ADOQuery1.Open;
KSergey (2004-08-31 16:19:00) [6]> SH (31.08.04 14:28)
> memo1.Lines:=FIATPDB.ADOQuery1.SQL;
Вот этот результатик (из мемо, копи-пастом) сюда запостить можно?
К стати, можно так же в аксес запостить и погонять - думаю, ошибочка и найдется...
sniknik (2004-08-31 16:15:00) [7]> Что-то типа "Ошибка в конструкции INSERT INTO". Но SQL ведь абсолютно правильный!
одно из двух утверждений неверно. и я даже догадываюсь чье. ;о))
SH (2004-08-31 16:01:00) [8]Я брал для теста простейшую таблицу в два столбца: ключ и строка. Это был список стран. Всё равно глючило. Что-то типа "Ошибка в конструкции INSERT INTO". Но SQL ведь абсолютно правильный!
KSergey (2004-08-31 15:21:00) [9]> [5] sniknik © (31.08.04 15:19)
> спрошу лучше зачем StringReplace в третьей функции?
А хрен знает? Видать кто пользовался - ему так больше понравилось ;)
> и еще. зачем ты ими пользуешся? параметры и лутше и быстрее.
Привычка дурацкая...
sniknik (2004-08-31 15:19:00) [10]> Только не спрашивайте меня зачем объявлена
> var
> strFormat : String;
спрошу лучше зачем StringReplace в третьей функции?
function DateToMSAccessSQLString (const dtmDateTime : TDateTime) : String; // для MS Access
begin
DateTimeToString (Result, '#mm''/''dd''/''yyyy#', dtmDateTime);
end;
и еще. зачем ты ими пользуешся? параметры и лутше и быстрее.
KSergey (2004-08-31 15:07:00) [11]> [3] KSergey © (31.08.04 15:06)
Только не спрашивайте меня зачем объявлена
var
strFormat : String;
;)
KSergey (2004-08-31 15:06:00) [12]> datetostr(Date)+
Меня это тоже насторожило
На всякий случай:
// -------- преобразует из типа даты в текстовый, подходящий для подстановки в запросы -----
function DateToMSSQLString (const dtmDateTime : TDateTime) : String; // для MSSQL
var
strFormat : String;
begin
strFormat:= 'yyyymmdd'; // ~~~ 20000112
DateTimeToString (Result, strFormat, dtmDateTime);
end;
// -------- преобразует из типа даты-время в текстовый, подходящий для подстановки в запросы -----
function DateTimeToMSSQLString (const dtmDateTime : TDateTime) : String; // для MSSQL
var
strFormat : String;
begin
strFormat:= 'yyyymmdd hh:nn:ss'; // ~~~ 20000112 15:35:27
DateTimeToString (Result, strFormat, dtmDateTime);
end;
// -------- преобразует из типа даты в текстовый, подходящий для подстановки в запросы -----
function DateToMSAccessSQLString (const dtmDateTime : TDateTime) : String; // для MS Access
var
strFormat : String;
strRes : String;
begin
strFormat:= '#mm.dd.yyyy#'; // #07.16.2003#
DateTimeToString (strRes, strFormat, dtmDateTime);
Result:= StringReplace(strRes,'.','/',[rfReplaceAll, rfIgnoreCase]); // #07/16/2003#
end;
sniknik (2004-08-31 14:49:00) [13]> Почему-то не хочет работать
обычно эта информация (почему) написана в ошибке выдаваемой...
возможно изза вот этого
',242,'+ datetostr(Date)+','+quotedstr('pubsite visit')+
строку в запрос без кавычек ложиш.
и хотя в инсерте позволительно так (дату в строке) автоприведение сработает, но лутше подумай насчет того чтобы параметрами все передавать, от многих проблем после избавишся.
>> +#13+
> Это точно надо?
не, достаточно пробел добавить чтобы values отделить. (а то и вовсе не нужно, стыковка со скобкой должно понять)
Sergey13 (2004-08-31 14:45:00) [14]2SH (31.08.04 14:28)
>Почему-то не хочет работать
В чем это выражается?
> +#13+
Это точно надо?