Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > добавление записей через AdoQuery


Автор: neweraser 1.12.2009, 01:22
Всем привет
Код

  DataModule1.ADOQuery.Close;
  DataModule1.ADOQuery.SQL.Clear;
  for i:= 0 to ObjGuardList2.Count - 1 do
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (EmplName) Values("' + ObjGuardList2.Items[i] + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (GenDir) Values("' + Datamodule1.RequisTable.FieldByName('GenDir').AsString + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (FullName) Values("' + Datamodule1.RequisTable.FieldByName('FullName').AsString + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (ObjName) Values("' + ObjChoose.DataField + '")');
  DataModule1.ADOQuery.ExecSQL;

добавляю много строк и выдается такая ошибка
Цитата

пропущен символ (;) в конце инструкции SQL

пробовал так
Код

DataModule1.ADOQuery.Close;
  DataModule1.ADOQuery.SQL.Clear;
  for i:= 0 to ObjGuardList2.Count - 1 do
  begin
    DataModule1.ADOQuery.SQL.Clear;
    DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (EmplName) Values("' + ObjGuardList2.Items[i] + '")');
    DataModule1.ADOQuery.ExecSQL;
  end;
  DataModule1.ADOQuery.SQL.Clear;
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (GenDir) Values("' + Datamodule1.RequisTable.FieldByName('GenDir').AsString + '")');
  DataModule1.ADOQuery.ExecSQL;
  DataModule1.ADOQuery.SQL.Clear;
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (FullName) Values("' + Datamodule1.RequisTable.FieldByName('FullName').AsString + '")');
  DataModule1.ADOQuery.ExecSQL;
  DataModule1.ADOQuery.SQL.Clear;
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (ObjName) Values("' + ObjChoose.DataField + '")');
  DataModule1.ADOQuery.ExecSQL;

добавляет но криво и в середине вываливается ошибка
и даже после каждой 
 DataModule1.ADOQuery.SQL.Clear; (после цикла) добавлял
DataModule1.ADOQuery.First;  smile 
в сети ничего кроме
Цитата

Access не поддерживает конструкцию оператора INSERT для множественной вставки.
Для множественной вставки используйте цикл, где на каждой итерации производите вставку 1 строки
Но, используя Delphi можно обойтись гораздо проще, не использовать оператор INSERT SQL..
а просто InsertRecord
например..

Код:
var i:integer;
begin
  for i := 0 to Memo1.Lines.Count-1 do
   ADOTable1.InsertRecord([Memo1.Lines[i]]);
end;

больше ничего не нашел, может есть какой-то еще вариант решения проблемы? не хочется ADOTable использовать, и так на форме куча компонентов

Автор: Данкинг 1.12.2009, 01:42
Цитата(neweraser @  1.12.2009,  01:22 Найти цитируемый пост)
добавляет но криво и в середине вываливается ошибка

Почему криво, какая ошибка? Вообще перед каждым .Clear делай .Close 
Код

DataModule1.ADOQuery.Close;
DataModule1.ADOQuery.SQL.Clear;


Добавлено через 41 секунду
Цитата(neweraser @  1.12.2009,  01:22 Найти цитируемый пост)
DataModule1.ADOQuery.First; 

Это явно ни при чём. smile 

Автор: Teleport 1.12.2009, 03:07
Цитата

пропущен символ (;) в конце инструкции SQL


В тексте SQL-запроса в конце перед самой ' нужно ставить ;



Код

ADOQ1.Active:= false;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add('INSERT INTO my_table1 VALUES("' +my_str_value1+'","' + my_str_value2+'", "' + my_str_value3 + '","' + my_str_value4 + '");');
ADOQ1.ExecSQL;



Видишь - у меня ; перед '  smile 
Немного не по теме - ты всегда пишешь на каждой строке  DataModule1.ADOQuery? 
with -  вообще не пользуешься? Это я на всякий случай. 3-4 строчки еще без него, а более - уже с ним, как-то удобнее.

Автор: neweraser 1.12.2009, 10:10
Цитата(Данкинг @  1.12.2009,  01:42 Найти цитируемый пост)
какая ошибка?

он с ObjguardList2 добавляет как нужно, потом добавляет запись в 3-4 строку (в зависимости от ObjguardList2.Count), хотя мне надо в 1-ю строку в поле 'GenDir',  а потом ошибка (какая не помню (я не дома) smile
Код

 DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (GenDir) Values("' + Datamodule1.RequisTable.FieldByName('GenDir').AsString + '")');

Цитата(Teleport @  1.12.2009,  03:07 Найти цитируемый пост)
with -  вообще не пользуешься?

пользовался, но потом посчитал это некрасивым  smile , т.к. у меня сначала with, потом if условия, goto и др... а потом опять добавление  smile могу код скинуть  smile только вечером

Цитата(Teleport @  1.12.2009,  03:07 Найти цитируемый пост)
В тексте SQL-запроса в конце перед самой ' нужно ставить ;

я пробовал, все равно та же ошибка :((

Автор: Frees 1.12.2009, 10:19
может 
поле Datamodule1.RequisTable.FieldByName('FullName').AsString или другие поля имеют значение null? asstring тогда вернет пустоту и запрос у тебя криво соберется

Автор: Данкинг 1.12.2009, 12:01
Цитата(neweraser @  1.12.2009,  10:10 Найти цитируемый пост)
потом добавляет запись в 3-4 строку (в зависимости от ObjguardList2.Count), хотя мне надо в 1-ю строку в поле 'GenDir',  

Если надо вставлять в конкретную строку, то используется не Insert, а Update с условием Where. smile 
И вообще, что значит "третья" строка? Конечно, в трёх записях не запутаешься, но когда добавишь 1000-ю запись, далеко не факт, что в таблице она и физически будет именно 1000-й. smile 

Автор: neweraser 1.12.2009, 18:56
Цитата(Frees @  1.12.2009,  10:19 Найти цитируемый пост)
поле Datamodule1.RequisTable.FieldByName('FullName').AsString или другие поля имеют значение null?

может да, я не знаю к какой строке он конкретно обращается, мне нужна первая, хотя больше их там и не должно быть, в той таблице всегда одна строка
Цитата(Данкинг @  1.12.2009,  12:01 Найти цитируемый пост)
Update с условием Where

как это?

Автор: Данкинг 1.12.2009, 18:58
Цитата(neweraser @  1.12.2009,  18:56 Найти цитируемый пост)
как это? 

При наличии ключевого (к примеру) поля:
Код

update TABLE set pole1='3' where id=3

В данном случае в pole1 будет занесено значение "3" для тех записей, у которых поле id имеет значение 3.

Автор: Teleport 1.12.2009, 19:18
2 neweraser - главное определиться - тебе нужно ИЗМЕНИТЬ (ОБНОВИТЬ) значения в существующей записи (строке) или же ДОБАВИТЬ НОВУЮ запись (строку) в таблицу.

Автор: neweraser 1.12.2009, 19:29
все равно не доходит до меня :(
ipicture не грузится, поэтому так присоеденил на всякий случай.
в поле EmplName у меня добавляется несколько записей
в остальные по одной записи из лругой таблицы
изначально код выглядел вот так 
Код

DataModule1.ADOQuery.Close;
  DataModule1.ADOQuery.SQL.Clear;
  for i:= 0 to ObjGuardList2.Count - 1 do
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (EmplName) Values("' + ObjGuardList2.Items[i] + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (GenDir) Values("' + Datamodule1.RequisTable.FieldByName('GenDir').AsString + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (FullName) Values("' + Datamodule1.RequisTable.FieldByName('FullName').AsString + '")');
  DataModule1.ADOQuery.SQL.Add('Insert into ' + TableName + ' (ObjName) Values("' + ObjChoose.DataField + '");');
  DataModule1.ADOQuery.ExecSQL;

 smile 

Автор: neweraser 1.12.2009, 19:31
Teleport, я добавляю новые записи в только что созданную таблицу

Автор: Данкинг 1.12.2009, 19:34
neweraser, хочешь сказать, этот код заполняет первую строку таблицы? smile 

Автор: neweraser 1.12.2009, 19:44
нееет, он должен заполнять только ЕмплНаме, допустим 4 поля сверху, остальные 3 поля только на первой строке, а остальные поля потом будут заполняться

Добавлено через 1 минуту и 25 секунд
 smile фигня какая-то, вирус? английские буквы в русские переключаются, делпхи  smile  (было написано на англ. раскладке)

Автор: Данкинг 1.12.2009, 20:05
Цитата(neweraser @  1.12.2009,  19:44 Найти цитируемый пост)
остальные 3 поля только на первой строке, а остальные поля потом будут заполняться

Вот для этого каждая строка и должна иметь уникальный номер (например, ID). Вначале заполняем 4 строки ЕмплНаме с помощью insert, а потом уже - 3 столбца первой строки с помощью update... where ID=1... smile 

Цитата(neweraser @  1.12.2009,  19:44 Найти цитируемый пост)
фигня какая-то, вирус? английские буквы в русские переключаются, делпхи 

Это не вирус, это ПунтоСвитчер. smile

Автор: neweraser 1.12.2009, 20:29
а можно без ид? например where ('поле GenDir - первая строка') smile
пс это не пунто свичер, а что-то с форумом или моей оперой smile

Добавлено через 1 минуту и 40 секунд
т.к. в блокноте нормально все )) скопировал - вставил в окошко сообщения - вроде нормально

Автор: Данкинг 1.12.2009, 21:09
Цитата(neweraser @  1.12.2009,  20:29 Найти цитируемый пост)
а можно без ид? например where ('поле GenDir - первая строка')

Можно, если ты уверен, что Иван Иванович Иванов у тебя во всей базе один-единственный. smile 

Цитата(neweraser @  1.12.2009,  20:29 Найти цитируемый пост)
пс это не пунто свичер, а что-то с форумом или моей оперой 

Ну, не знаю, обычно такое с ПунтоСвитчером бывает как раз бывает. А так - видимо, глюк очередной. smile 

Автор: neweraser 1.12.2009, 21:23
чуть не так сформулировал, это пустое поле, можно просто как-то явно указать на него?

Автор: Данкинг 1.12.2009, 21:43
Цитата(neweraser @  1.12.2009,  21:23 Найти цитируемый пост)
пустое поле

...where pole1 is null (вроде в Access так) - обновляются записи с пустыми полями pole1. smile 

Автор: neweraser 1.12.2009, 22:43
ну так они все обновляются smile а мне одно надо, а хотя в принципе и все можно, уже просто времени нет думать.. 
Спасибо smile

Автор: Данкинг 1.12.2009, 23:25
neweraser, не знаю-не знаю, должны только по условию WHERE..., разбирайся, где накосячилзаблуждаешься. smile  smile 

Автор: neweraser 2.12.2009, 00:30
AdoQuery же вроде работает почти как и AdoTable, можно его соединить с какой-нибудь таблицей?
например как-то так
DataSource1.DataSet:= table1 
(до этого в AdoQuery в свойствах выбрал DataSource1)
а потом работать как и с AdoTable, т.е.
ADOQuery.FieldByName('pole'):= 'значение';
или я опять туплю и этого делать не стоит?

Цитата(Данкинг @  1.12.2009,  23:25 Найти цитируемый пост)
разбирайся, где накосячилзаблуждаешься

smile в пятницу курсовик сдавать, времени нет, а у меня не то что программа не готова, так еще теории нет 

Автор: Данкинг 2.12.2009, 00:58
Цитата(neweraser @  2.12.2009,  00:30 Найти цитируемый пост)
можно его соединить с какой-нибудь таблицей?

Если просто в нём выбираешь все записи (select * from TABLE), то... Вроде как можно, только не помню, делал ли я так когда-то. В общем, попробуй, должно получиться:
Код

AdoQuery.Close;
AdoQuery.SQL.Clear;
AdoQuery.SQL.Add('select * from table');
AdoQuery.Open;
AdoQuery.Append;
AdoQuery.FieldByName('pole1').AsString:='bugaga';
AdoQuery.Post;


Добавлено @ 01:00
Цитата(neweraser @  2.12.2009,  00:30 Найти цитируемый пост)
(до этого в AdoQuery в свойствах выбрал DataSource1)

А это зачем? Указываешь для AdoQuery соответствующее AdoConnection - и всё, безо всяких датасоурсов.

Автор: neweraser 2.12.2009, 01:23
 smile 
только вместо AdoQuery.Append мне нужно было AdoQuery.Edit
спасибо еще раз! выручил!!

Автор: Данкинг 2.12.2009, 01:39
Цитата(neweraser @  2.12.2009,  01:23 Найти цитируемый пост)
только вместо AdoQuery.Append мне нужно было AdoQuery.Edit

В таком случае (т.е. для редактирования) не забудь сначала встать на нужную строку, к примеру:
Код

AdoQuery.First;
...
AdoQuery.Recno:=101;

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)