Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 10:41   #1
sectorb
 
Регистрация: 23.11.2011
Сообщений: 7
По умолчанию Ошибка синтаксиса в инструкции insert into

Добрый день!
Пишу программу которая должна добавлять данные из текстового файла в базу данных MSAccess. Вроде бы все должно работать но вылазит ошибка "Ошибка синтаксиса в инструкции insert into" при добавлении последних двух столбцов.
Цикл For нужен для того чтобы вставлять в базу значения по столбцам - из этого выходит еще один недочет, когда вставишь один столбец то следующий столбец вставлятся не с первой записи а с той на которой закончился предыдущий столбец(Рисунок прилогается)



Посмотрите пожалуйста:
Код:
 for w:=1 to 9 do
  begin
  reset(f1);

  if w=1 then begin
  tableee:='Process';
  a:=p[1];
  b:=p[2];
  end;

   if w=2 then begin
  tableee:='CPU';
  a:=p[5];
  b:=p[6];
  end;

    if w=3 then begin
  tableee:='Disk';
  a:=p[6];
  b:=p[7];
  end;

    if w=4 then begin
  tableee:='memory';
  a:=p[11];
  b:=p[12];
  end;

    if w=5 then begin
  tableee:='PID';
  a:=p[15];
  b:=p[16];
  end;

    if w=6 then begin
  tableee:='File';
  a:=p[20];
  b:=p[21];
  end;

     if w=7 then begin
  tableee:='User';
  a:=p[20];
  b:=p[21];
  end;

     if w=8 then begin
  tableee:='Date';
  a:=p[20];
  b:=p[21];
  end;
  
  while not eof(f1) do begin
     readln(f1,buf4);
     buf5:=copy(buf4,a,b-a);
     buf:=c+buf5+c;

     try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('INSERT INTO Pro('+tableee+') VALUES('+buf+')');
    ADOQuery1.ExecSQL;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM Pro');
    ADOQuery1.Active:=True;
     
    except
    on e:Exception do
    end;
    end;
    end;
     closefile(f1);
    end;
sectorb вне форума Ответить с цитированием
Старый 23.11.2011, 16:03   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,762
По умолчанию

Почему так происходит вполне понятно..
не совсем понятно что и где, но похоже вам хотелось так,

Код:
 
  reset(f1);
while not eof(f1) do begin
     readln(f1,buf4);
buf:='';
 ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Pro(
for w:=1 to 8 do
  begin


  if w=1 then begin
  tableee:='Process, ';
  a:=p[1];
  b:=p[2];
  end;

   if w=2 then begin
  tableee:='CPU, ';
  a:=p[5];
  b:=p[6];
  end;

    if w=3 then begin
  tableee:='Disk, ';
  a:=p[6];
  b:=p[7];
  end;

    if w=4 then begin
  tableee:='memory, ';
  a:=p[11];
  b:=p[12];
  end;

    if w=5 then begin
  tableee:='PID, ';
  a:=p[15];
  b:=p[16];
  end;

    if w=6 then begin
  tableee:='File, ';
  a:=p[20];
  b:=p[21];
  end;

     if w=7 then begin
  tableee:='User, ';
  a:=p[20];
  b:=p[21];
  end;

     if w=8 then begin
  tableee:='Date';
  a:=p[20];
  b:=p[21];
  end;
 buf5:=copy(buf4,a,b-a);
     buf:=buf+','+c+buf5+c;

ADOQuery1.SQL.Add(tableee);
 end;

ADOQuery1.SQL.Add(' VALUES('+buf+')');
try
ADOQuery1.ExecSQL;
 except
    on e:Exception do
    end;

    end;
     closefile(f1);
  ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM Pro');
    ADOQuery1.Active:=True;
    end;
это если попереставлять всё что там у вас есть.

На самом деле с трудом понимаю зачем цикл For вообще нужен если сразу всё известно и зачем в цикле всё время выполняется селективный запрос..

Может собрать сразу запрос и всё? что вроде этого
Код:
 reset(f1);
     try
while not eof(f1) do begin
     readln(f1,buf4);
     buf:=c+copy(buf4,p[1],p[2]-p[1])+c+', '+c+copy(buf4,p[5],p[6]-p[5])+c+', '+c+copy(buf4,p[6],p[7]-p[6])+c..... и тд;

    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('INSERT INTO Pro(Process, CPU, Disk, и тд ) VALUES('+buf+')');
    ADOQuery1.ExecSQL;

  end;
 finally
 closefile(f1);  
 end;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM Pro');
    ADOQuery1.Active:=True;
PS Всё переставлял в браузере, так что возможны ошибки...

Последний раз редактировалось vovk; 23.11.2011 в 16:06.
vovk вне форума Ответить с цитированием
Старый 23.11.2011, 22:57   #3
sectorb
 
Регистрация: 23.11.2011
Сообщений: 7
По умолчанию

Ураааа ! Заработало как надо спасибо тебе большое) Я бы тебе руку пожал и пивка купил)

А ошибка про синтаксис вылазила потому что я использовал зарезервированые слова, а в частности Date и User.

Вот окончательный код:
Код:
reset(f1);
     try
while not eof(f1) do begin
    readln(f1,buf4);
    buf:=c+copy(buf4,p[1],p[2]-p[1])+c+', '+c+copy(buf4,p[5],p[6]-p[5])+c+', '+c+copy(buf4,p[6],p[7]-p[6])+c+', '+c+copy(buf4,p[11],p[12]-p[11])+c+', '+c+copy(buf4,p[15],p[16]-p[15])+c+', '+c+copy(buf4,p[20],p[21]-p[20])+c   +', '+c+copy(buf4,p[22],p[23]-p[22])+c+', '+c+copy(buf4,p[23],Length(buf)-p[23])+c;

    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('INSERT INTO Pro(Process,CPU,Disk,memory,PID,File,Usr,Data) VALUES('+buf+');');
    Memo1.Text:=Form1.ADOQuery1.SQL.Text;
    ADOQuery1.ExecSQL;
    end;

 finally
 closefile(f1);
 end;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM Pro');
    ADOQuery1.Active:=True;
sectorb вне форума Ответить с цитированием
Старый 23.11.2011, 23:26   #4
sectorb
 
Регистрация: 23.11.2011
Сообщений: 7
По умолчанию

хм, только теперь дату не выводит, т.е. поля в которых должны быть даты пусты, а все остальные заполнены
как быть?
sectorb вне форума Ответить с цитированием
Старый 24.11.2011, 03:13   #5
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,762
По умолчанию

Цитата:
Сообщение от sectorb Посмотреть сообщение
Ураааа ! Заработало как надо спасибо тебе большое) Я бы тебе руку пожал и пивка купил)

А ошибка про синтаксис вылазила потому что я использовал зарезервированые слова, а в частности Date и User.

Вот окончательный код:
Код:
......
    buf:=c+copy(buf4,p[1],p[2]-p[1])+c+', '+c+copy(buf4,p[5],p[6]-p[5])+c+', '+c+copy(buf4,p[6],p[7]-p[6])+c+', '+c+
copy(buf4,p[11],p[12]-p[11])+c+', '+c+copy(buf4,p[15],p[16]-p[15])+c+', '+c+copy(buf4,p[20],p[21]-p[20])+c   +', '+c+
copy(buf4,p[22],p[23]-p[22])+c+', '+c+copy(buf4,p[23],Length(buf)-p[23])+c;

   ............
Почему Length(buf) не спрашиваю (хотя понять не в силах), но чтото мне подсказывает что если уж Length, то скорее всего не buf а buf4

PS Да, на счёт зарезирвированных слов, вы лучше поля переименуйте. А то грабли потом гденибудь найдёте))

Последний раз редактировалось vovk; 24.11.2011 в 03:17.
vovk вне форума Ответить с цитированием
Старый 24.11.2011, 09:23   #6
sectorb
 
Регистрация: 23.11.2011
Сообщений: 7
По умолчанию

ой и правда спасибо огромное еще раз
sectorb вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка синтаксиса в Acceess Droid БД в Delphi 3 06.06.2012 10:32
ошибка синтаксиса в инструкции create table boshki Помощь студентам 6 02.06.2011 18:36
ошибка синтаксиса foreach KLAXON PHP 32 08.02.2011 15:57
Ошибка синтаксиса Santosh Microsoft Office Access 2 18.08.2010 00:15
Ошибка инструкции Insert tools SQL, базы данных 3 18.11.2009 21:32