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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
14-1095079217
marsden
2004-09-13 16:40
2004.10.03
А как войти зарегистрированному пользователю?


14-1095420223
SiJack
2004-09-17 15:23
2004.10.03
В чем фокус?


14-1084251025
Vlad Oshin
2004-05-11 08:50
2004.10.03
с анекдот ру


3-1094450667
Fynjy1984
2004-09-06 10:04
2004.10.03
Дерево


3-1094042775
Zyb
2004-09-01 16:46
2004.10.03
Передача Dataset