Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизSQL запрос для ADOQuery Найти похожие ветки
← →
SH (2004-08-31 14:28) [0]Подключился через 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
← →
Sergey13 © (2004-08-31 14:45) [1]2SH (31.08.04 14:28)
>Почему-то не хочет работать
В чем это выражается?
> +#13+
Это точно надо?
← →
sniknik © (2004-08-31 14:49) [2]> Почему-то не хочет работать
обычно эта информация (почему) написана в ошибке выдаваемой...
возможно изза вот этого
",242,"+datetostr(Date)+","+quotedstr("pubsite visit")+
строку в запрос без кавычек ложиш.
и хотя в инсерте позволительно так (дату в строке) автоприведение сработает, но лутше подумай насчет того чтобы параметрами все передавать, от многих проблем после избавишся.
>> +#13+
> Это точно надо?
не, достаточно пробел добавить чтобы values отделить. (а то и вовсе не нужно, стыковка со скобкой должно понять)
← →
KSergey © (2004-08-31 15:06) [3]> 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;
← →
KSergey © (2004-08-31 15:07) [4]> [3] KSergey © (31.08.04 15:06)
Только не спрашивайте меня зачем объявленаvar
strFormat : String;
;)
← →
sniknik © (2004-08-31 15:19) [5]> Только не спрашивайте меня зачем объявлена
> 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:21) [6]> [5] sniknik © (31.08.04 15:19)
> спрошу лучше зачем StringReplace в третьей функции?
А хрен знает? Видать кто пользовался - ему так больше понравилось ;)
> и еще. зачем ты ими пользуешся? параметры и лутше и быстрее.
Привычка дурацкая...
← →
SH (2004-08-31 16:01) [7]Я брал для теста простейшую таблицу в два столбца: ключ и строка. Это был список стран. Всё равно глючило. Что-то типа "Ошибка в конструкции INSERT INTO". Но SQL ведь абсолютно правильный!
← →
sniknik © (2004-08-31 16:15) [8]> Что-то типа "Ошибка в конструкции INSERT INTO". Но SQL ведь абсолютно правильный!
одно из двух утверждений неверно. и я даже догадываюсь чье. ;о))
← →
KSergey © (2004-08-31 16:19) [9]> SH (31.08.04 14:28)
> memo1.Lines:=FIATPDB.ADOQuery1.SQL;
Вот этот результатик (из мемо, копи-пастом) сюда запостить можно?
К стати, можно так же в аксес запостить и погонять - думаю, ошибочка и найдется...
← →
46_55_41_44 © (2004-09-01 09:44) [10]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;
← →
Wolfram (2004-09-01 14:23) [11]FIATPDB.ADOQuery1.Open;
попробуй ADOQuery1.execsql;
← →
46_55_41_44 © (2004-09-01 16:24) [12]Ойййййййй... Ну конечно ExecSql;!!!!!!!!!!
когда пишешь open, тогда выводит ошибку, типа запрос не возвращает набор данных!!!
мляяя... Спать надо больше!!!
← →
SH (2004-09-07 19:53) [13]Вы правы, не в формате даты дело. Всё из-за метода open. Кидает ошибки: "ADOQuery1: Command text does not return a result set" и ещё что-то типа "do no return multiple recordset for single object..."
← →
SH (2004-09-07 19:59) [14]Ещё вопрос. Как сделать, чтобы после выполнения этого запроса на 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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c