Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1118643891
syte_ser78
2005-06-13 10:24
2005.07.11
Ответный код


5-1089198820
RagE
2004-07-07 15:13
2005.07.11
не срабатывает таймер


1-1118714581
Viktop
2005-06-14 06:03
2005.07.11
Связи таблиц в D9


14-1118403581
NightStranger
2005-06-10 15:39
2005.07.11
Smile


3-1117189673
vader
2005-05-27 14:27
2005.07.11
SQL-запрос ОСТАТОК ТОВАРОВ НА СКЛАДЕ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский