Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизВопрос про SQL и ADO. Ошибка при добавлении записи. Найти похожие ветки
← →
SlavaNV (2005-05-25 12:29) [0]Здравствуйте. Пытаюсь с помощью SQL добавить запись в таблицу, допустим Index. Поля в этой таблице связаны с другими полями других таблиц (всё связывал в MS Access 2003). SQL запрос следующий: "INSERT INTO [Index](Field) VALUES ("SomeText");" И выдаёт ошибку: "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции." При формировании того же самого запроса в Access всё работает нормально. Пробовал и через ADOTable, там вообще выскакивает ошибка с "FROM". Помогите, пожалуйста, в чём проблема? Может я что-то не так делаю?
← →
Val © (2005-05-25 12:31) [1]метод Open, вероятно, вызываете?
← →
DSKalugin © (2005-05-25 12:39) [2]>При формировании того же самого запроса в Access всё работает нормально.
Ключевое поле тут запрос, а значит надо использовать не ADOTable, а TADOQuery.ExecSQL
← →
isasa © (2005-05-25 12:56) [3]Таблицы обязательно долны быть проиндексированы (в том-же Access).
Значение индексированного поля присваивать нельзя (формируется СУБД).
Разницы между TADOTable и TADOQuery практически никакой.
TADOTable = SELECT * FROM <Table>
← →
SlavaNV (2005-05-25 15:48) [4]> Val, нет не Open, хотя я думаю, что Open, что ExecSQL одно и тоже,может ошибаюсь =)
> DSKalugin, итак использую ExecSQL
fMain.SQL.Clear;
fMain.SQL.Add(SQL);
fMain.ExecSQL;
> isasa, т.е. мне убрать все связи?
P.S.: Вот только что посмотрел, на самом деле оно добавляет в поле значение, но ошибка выскакивает...
← →
SlavaNV (2005-05-25 15:54) [5]Всё равно не пойму, создал новую таблицу, убрал Индексированное поле, никаких записей, и всё равно выскакивает ошибка при вызове SQL. А при использовании ADOTable "Ошибка синтаксиса в предложении FROM". Неужели никак добавить нельзя? :( Работа горит...Или может я кого-то не так понял?
← →
ANB © (2005-05-25 15:58) [6]
> А при использовании ADOTable "Ошибка синтаксиса в предложении
> FROM".
- как ты ее юзаешь для инсерта ?
← →
Val © (2005-05-25 16:15) [7]>[5] SlavaNV (25.05.05 15:54)
что-то вы недоговариваете. давайте код.
← →
isasa © (2005-05-25 16:17) [8]Таблица должна иметь ключевое поле и проиндексирована.
В конструкторе Access Индексированное поле - ДА!
А связи убиратьне надо.
← →
SlavaNV (2005-05-25 16:24) [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, Ставлю Индексированое поле: "Да (Допускаются совпадения).". Всё равно вылетает это ошибка. :(
← →
SlavaNV (2005-05-25 16:29) [10]>isasa, если ставить поле ключевым, то совпадения не допускаются, а у меня могут быть совпадения. Хотя даже если я выставляю это поле ключевым, то опять эта ошибка.
← →
Val © (2005-05-25 16:29) [11].Active:=True; - нафиг
← →
isasa © (2005-05-25 16:30) [12]Схема обычная:
TADOQuery.Open;
TADOQuery.Edit;
TADOQuery.FieldByName("").Value:=....
..............
TADOQuery.Post;
TADOQuery.Close;
Если запрос составной (присутствует оператор join), то таблицы должны быть связаны
через индексированные поля (по крайней мере с одной стороны).
Проверь наличие индексов.
← →
isasa © (2005-05-25 16:40) [13]var fMain : TADOQuery;
.........
fMain.SQL.Clear;
fMain.SQL.Text:="INSERT INTO Mine ( My ) Values ("SomeText");";
fMain.ExecSQL;
.............
Вполне достаточно и правильно.
Если идет ошибка, причина в структуре таблицы. Как я понял у тебя соотношение один ко многим.
Сделай таблицу, где "многим" так:
id - первичный счетчик уникальный совпадения не допускаются индексированное поле
sID - твой индекс (по этому полю можно не индексировать )
← →
SlavaNV (2005-05-25 16:42) [14]> 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:47) [15]На индексировании не один человек погиб
А мне нравится больше так :)
fMain.SQL.Text:="SELECT * FROM Mine";
чем :)
fMain.SQL.Add("SELECT * FROM Mine");
← →
SlavaNV (2005-05-25 17:48) [16]Кстати :) Может поможете?
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 18:05) [17]Попробуй при первичном отображении формы (или где он там :))
с ParamList дать ему фокус
ParamList.SetFocus;
а в контроле выделить левую верхнюю ячейку (без ParamList.SetFocus может выдать ошибку)
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.049 c