Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.049 c
4-1093810369
cerber1
2004-08-30 00:12
2004.10.03
чтение СОМ портов


1-1095148299
resut
2004-09-14 11:51
2004.10.03
Не хватает ресурсов


14-1095404479
Knight
2004-09-17 11:01
2004.10.03
К владельцам Win2003 Server...


1-1095335118
webpauk
2004-09-16 15:45
2004.10.03
Parent


1-1095321764
~Shaman~
2004-09-16 12:02
2004.10.03
массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский