Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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+
Это точно надо?


Наверх

Титульная страница Поиск, карта сайта Написать письмо