![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про SQL и ADO. Ошибка при добавлении записи. [D7]
SlavaNV © (2005-05-25 12:29:00)Здравствуйте. Пытаюсь с помощью SQL добавить запись в таблицу, допустим Index. Поля в этой таблице связаны с другими полями других таблиц (всё связывал в MS Access 2003). SQL запрос следующий: 'INSERT INTO [Index](Field) VALUES ("SomeText");' И выдаёт ошибку: 'Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.' При формировании того же самого запроса в Access всё работает нормально. Пробовал и через ADOTable, там вообще выскакивает ошибка с 'FROM'. Помогите, пожалуйста, в чём проблема? Может я что-то не так делаю?
isasa (2005-05-25 18:05:00) [1]Попробуй при первичном отображении формы (или где он там :))
с ParamList дать ему фокус
ParamList.SetFocus;
а в контроле выделить левую верхнюю ячейку (без ParamList.SetFocus может выдать ошибку)
SlavaNV (2005-05-25 17:48:00) [2]Кстати :) Может поможете?
procedure TInsertForm.DictListChange(Sender: TObject);
begin
ParamList.Cells[ParamList.Col,ParamList.Row]:=DictList.Items[DictList.ItemIndex];
DictList.Visible := False;
ParamList.SetFocus;
end;
procedure TInsertForm.DictListExit(Sender: TObject);
begin
ParamList.Cells[ParamList.Col,ParamList.Row]:=DictList.Items[DictList.ItemIndex];
DictList.Visible := False;
ParamList.SetFocus;
end;
procedure TInsertForm.ParamListSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
Var Dict, Field: String;
R: TRect;
begin
Get_Dict(ParamList.Cells[0,ARow],Dict,Field);
If Dict<>'' Then Enum_Dict(Dict,Field);
if ((ACol = 1) AND
(Dict <> '')) then begin
R := ParamList.CellRect(ACol, ARow);
R.Left := R.Left + ParamList.Left;
R.Right := R.Right + ParamList.Left;
R.Top := R.Top + ParamList.Top;
R.Bottom := R.Bottom + ParamList.Top;
DictList.Left := R.Left + 1;
DictList.Top := R.Top + 1;
DictList.Width := (R.Right + 1) - R.Left;
DictList.Height := (R.Bottom + 1) - R.Top;
DictList.Visible := True;
DictList.SetFocus;
end;
CanSelect := True;
end;
DictList - TCombobox
ParamList - TValueListEditor
Вобщем при наведении на определённую ечейку выскакивает Combobox со списком значений, вот. Но вот опять незачада, всё работает нормально, но вот не срабатывает событие SelectCell при первом наведении. Если я нажал на другое поле, а потом на 1е, то всё нормально. Опять туплю? :)
isasa (2005-05-25 16:47:00) [3]На индексировании не один человек погиб
А мне нравится больше так :)
fMain.SQL.Text:='SELECT * FROM Mine';
чем :)
fMain.SQL.Add('SELECT * FROM Mine');
SlavaNV (2005-05-25 16:42:00) [4]> isasa, спасибо :) Вот что значит сидеть столько времени на работе и придя домой что-то попытаться написать... а ведь ничё сложного :)
fMain.SQL.Add('SELECT * FROM Mine');
fMain.Open;
fMain.Insert;
fMain.FieldByName('My').Value:='Slava2';
fMain.Post;
fMain.Close;
Всем, большое спасибо!
isasa (2005-05-25 16:40:00) [5]var fMain : TADOQuery;
.........
fMain.SQL.Clear;
fMain.SQL.Text:='INSERT INTO Mine ( My ) Values ("SomeText");';
fMain.ExecSQL;
.............
Вполне достаточно и правильно.
Если идет ошибка, причина в структуре таблицы. Как я понял у тебя соотношение один ко многим.
Сделай таблицу, где "многим" так:
id - первичный счетчик уникальный совпадения не допускаются индексированное поле
sID - твой индекс (по этому полю можно не индексировать )
isasa (2005-05-25 16:30:00) [6]Схема обычная:
TADOQuery.Open;
TADOQuery.Edit;
TADOQuery.FieldByName('').Value:=....
..............
TADOQuery.Post;
TADOQuery.Close;
Если запрос составной (присутствует оператор join), то таблицы должны быть связаны
через индексированные поля (по крайней мере с одной стороны).
Проверь наличие индексов.
Val (2005-05-25 16:29:00) [7].Active:=True; - нафиг
SlavaNV (2005-05-25 16:29:00) [8]>isasa, если ставить поле ключевым, то совпадения не допускаются, а у меня могут быть совпадения. Хотя даже если я выставляю это поле ключевым, то опять эта ошибка.
SlavaNV (2005-05-25 16:24:00) [9]
Procedure TInsertForm.ExecSQL(SQL: String);
Begin
fMain.Close;
fMain.SQL.Clear;
fMain.SQL.Add(SQL);
fMain.ExecSQL;
fMain.Active:=True;
End;
...
ExecSQL('INSERT INTO Mine ( My ) Values ("SomeText");');
Если использую Table, то так:
AdoTable1.Active:=True;
AdoTable1.Insert;
AdoTable1.FieldByName('My').AsString:=SomeText';
AdoTable1.Post;
Может чё в ConnectString не то?
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+
BDPath+';Mode=ReadWrite;Extended Properties="";Persist Security Info=False;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';
....
Try
SetStatus('Подождите, идёт загрузка данных...');
ADOConnection1.Connected:=True;
If ADOConnection1.Connected=False then Application.Terminate;
Except On E:Exception Do Begin
MessageBox(Application.Handle,PAnsiChar('Нет связи с базой'+#10#13+E.Message),'Ошибка!',16);
Application.Terminate;
End;
End;
> isasa, Ставлю Индексированое поле: "Да (Допускаются совпадения).". Всё равно вылетает это ошибка. :(
isasa (2005-05-25 16:17:00) [10]Таблица должна иметь ключевое поле и проиндексирована.
В конструкторе Access Индексированное поле - ДА!
А связи убиратьне надо.
Val (2005-05-25 16:15:00) [11]>[5] SlavaNV (25.05.05 15:54)
что-то вы недоговариваете. давайте код.
ANB (2005-05-25 15:58:00) [12]
> А при использовании ADOTable 'Ошибка синтаксиса в предложении
> FROM'.
- как ты ее юзаешь для инсерта ?
SlavaNV (2005-05-25 15:54:00) [13]Всё равно не пойму, создал новую таблицу, убрал Индексированное поле, никаких записей, и всё равно выскакивает ошибка при вызове SQL. А при использовании ADOTable 'Ошибка синтаксиса в предложении FROM'. Неужели никак добавить нельзя? :( Работа горит...Или может я кого-то не так понял?
SlavaNV (2005-05-25 15:48:00) [14]> Val, нет не Open, хотя я думаю, что Open, что ExecSQL одно и тоже,может ошибаюсь =)
> DSKalugin, итак использую ExecSQL
fMain.SQL.Clear;
fMain.SQL.Add(SQL);
fMain.ExecSQL;
> isasa, т.е. мне убрать все связи?
P.S.: Вот только что посмотрел, на самом деле оно добавляет в поле значение, но ошибка выскакивает...
isasa (2005-05-25 12:56:00) [15]Таблицы обязательно долны быть проиндексированы (в том-же Access).
Значение индексированного поля присваивать нельзя (формируется СУБД).
Разницы между TADOTable и TADOQuery практически никакой.
TADOTable = SELECT * FROM <Table>
DSKalugin (2005-05-25 12:39:00) [16]>При формировании того же самого запросав Access всё работает нормально.
Ключевое поле тут запрос, а значит надо использовать не ADOTable, а TADOQuery.ExecSQL
Val (2005-05-25 12:31:00) [17]метод Open, вероятно, вызываете?