Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO с провайдером Microsoft.Jet.OLEDB.4.0 не хочет делать INSERT


leonidus ©   (2005-07-13 09:56:00) 

Люди помогите разобраться.
Я с ADO только начал забираться, и мне не понятно вот что.

Глобальные переменные:
db_path:string; //путь к той базе с которой работаем
result_request:tstringlist //тут будет хранитсяся считанная из базы информация

Написал процедуру для обращения к базе:

procedure do_request(request:string);
const
 ConnStr = 'Provider=%s;Data Provider=%s;Data Source=%s';
 Provider='MSDataShape.1';
 DataProvider='Microsoft.Jet.OLEDB.4.0';
begin
 if not form4.ADOConnection1.Connected then
   form4.ADOConnection1.ConnectionString := Format(ConnStr,[Provider, DataProvider, db_path]);

 form4.ADODataSet1.Close;
 form4.ADODataSet1.CommandText:=request;
 form4.ADODataSet1.Open;
end;

Далее в программе читаю данные из таблицы:
db_path:=.... - тут путь к базе из которой читаем

do_request('SELECT ivalue FROM item WHERE ifield=''Имя компьютера'' and reportid=2');
do_request('SELECT ivalue FROM item WHERE ifield=''Псевдоним компьютера'' and reportid=2');
do_request('SELECT ivalue FROM item WHERE ifield=''Имя компьютера'' and reportid=3');
do_request('SELECT ivalue FROM item WHERE ifield=''Псевдоним компьютера'' and reportid=3');

В этой процедуре получаю результат чтения и добавляю его в result_request:

procedure TForm4.ADODataSet1AfterOpen(DataSet: TDataSet);
var
st:string;
begin
st:=DataSet['ivalue'];
//заменяю все подозрительные символы
st:=stringreplace(st,',',' ',[rfReplaceAll]);
st:=stringreplace(st,'''','`',[rfReplaceAll]);

result_request.Add(st);
end;

Чтение проходит нормально, в result_request загружаются нужные данные. А теперь мне нужно данные из result_request записать в другую базу, для этого я делаю так:

db_path:=.... - тут путь к базе в которую пишем
form4.ADOConnection1.Connected:=false;

st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[0]+chr(39)+','+chr(39)+result_request.Strings[1]+chr(39)+')';
do_request(st);
form4.ADOConnection1.Connected:=false;

В результате получаю исключительную ситуацию с надписью "Текущий проводник не поддерживает возврат нескольких наборов записей в одной операции". Если нажать "Ок" появляется следующее сообщение о ошибке: "ADODataSet1: CommandText does not return a result set". Однако интересно то, что данные всетаки записываются и если блок:  

do_request(st);
form4.ADOConnection1.Connected:=false;

закрыть в try/except то все буден нормально. Однако подозреваю что вот так игнорировать исключительные ситуации не очень корректно, тем более что если мне потребуется добавить еще одну запись в таблицу, т.е. если написать:

db_path:=.... - тут путь к базе в которую пишем
form4.ADOConnection1.Connected:=false;

st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[0]+chr(39)+','+chr(39)+result_request.Strings[1]+chr(39)+')';
do_request(st);

st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[2]+chr(39)+','+chr(39)+result_request.Strings[3]+chr(39)+')';
do_request(st);

form4.ADOConnection1.Connected:=false;

То искл. ситуация появится  после первого do_request(st) и программа дальше не пойдет.

Подскажите пожалуйста, что я делаю не так, может нужно просто сменить провайдела базы данных, но на что его менять?


Anatoly Podgoretsky   (2005-07-13 13:59:00) [1]

Плохиш ©   (13.07.05 11:55) [13]
Не царское это дело.


leonidus   (2005-07-13 13:37:00) [2]

Да, да уже все исправил. Спасибо большое.


Плохиш   (2005-07-13 11:55:00) [3]


> leonidus ©   (13.07.05 11:40) [10]

>  form4.ADOQuery1.ExecSQL;
>  form4.ADOQuery1.Open;

Может всё-таки спустишься с олимпа и заглянешь в справку?
Ответ тебе ешё в [6] дали.


ЮЮ   (2005-07-13 11:50:00) [4]

form4.ADOQuery1.ExecSQL;
// выпорлнит запрос на вставку

form4.ADOQuery1.Open;
// тоже выполнит запрос на вставку, попутно ругнувшись, что "does not return a result set"

вмест о/b>, это не вмест е

Open - для SELECT-предложений, ExecSQL-для всех прочих, не возвращаючих набор данных


ANB   (2005-07-13 11:49:00) [5]

Опубликуй структуру таблицы


leonidus   (2005-07-13 11:40:00) [6]

Переписал процедуру do_request, вместо ADODataSet использую ADOQuery:

procedure do_request(request:string);
const
 ConnStr = 'Provider=%s;Data Provider=%s;Data Source=%s';
 Provider='MSDataShape.1';
 DataProvider='Microsoft.Jet.OLEDB.4.0';
begin
 if not form4.ADOConnection1.Connected then
   form4.ADOConnection1.ConnectionString := Format(ConnStr, [Provider, DataProvider, db_path]);

 form4.ADOQuery1.Close;
 form4.ADOQuery1.SQL.Clear;
 form4.ADOQuery1.SQL.Add(request);
 form4.ADOQuery1.ExecSQL;
 form4.ADOQuery1.Open;
end;

Теперь обращаюсь к этой процедуре:

result_request.Add('1');
result_request.Add('2');
result_request.Add('3');
result_request.Add('4');

db_path:=...
form4.ADOConnection1.Connected:=false;
st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[0]+chr(39)+','+chr(39)+result_request.Strings[1]+chr(39)+')';

try
do_request(st);
except
end;

st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[2]+chr(39)+','+chr(39)+result_request.Strings[3]+chr(39)+')';

try
do_request(st);
except
end;
form4.ADOConnection1.Connected:=false;

Появляется та же ошибка, что текущий проводник не поддерживает позврат нескольких наборов записей, однако оба раза do_request выполныется, а не застревает на первом же, однако в результате в таблице я вижу не две записи а почему-то четыре, т.е. две одинаковых первых записи и потом две одинаковых вторых записи, т.е.

1 2
1 2
3 4
3 4

блин что же это за лажа такая????


sniknik   (2005-07-13 11:04:00) [7]

> и что это приведет к тому, что form4.ADOConnection1.Connected станет True?
нет конечно.
но в общем код правилен (в этом куске), просто сдесь по признаку конекта определяется первое обращение и задается строка конекта, а открывается он при первом запросе/обращении к серверу из любого подключенного компанента (из себя тоже ;).

в общем, это не то место где надо придиратся. ;о))


Anatoly Podgoretsky   (2005-07-13 10:52:00) [8]

ЮЮ ©   (13.07.05 10:44) [7]
Да что там придираться к одной строчке, нет смысла.


ЮЮ   (2005-07-13 10:44:00) [9]

if not form4.ADOConnection1.Connected then
 form4.ADOConnection1.ConnectionString := Format(ConnStr,[Provider, DataProvider, db_path]);

и что это приведет к тому, что form4.ADOConnection1.Connected станет True?


Anatoly Podgoretsky   (2005-07-13 10:42:00) [10]

Все сообщения правильные.


ЮЮ   (2005-07-13 10:42:00) [11]

написать зверя do_insert, в котором использовать TADOCommand.Execute вместо TADODataSet1.Open


leonidus   (2005-07-13 10:39:00) [12]

do_request это моя процедура:

procedure do_request(request:string);
const
ConnStr = 'Provider=%s;Data Provider=%s;Data Source=%s';
Provider='MSDataShape.1';
DataProvider='Microsoft.Jet.OLEDB.4.0';
begin
if not form4.ADOConnection1.Connected then
  form4.ADOConnection1.ConnectionString := Format(ConnStr,[Provider, DataProvider, db_path]);

form4.ADODataSet1.Close;
form4.ADODataSet1.CommandText:=request;
form4.ADODataSet1.Open;
end;

так что в ней поменять-то надо?


ЮЮ   (2005-07-13 10:35:00) [13]

do_request это что за зверь?
поищи в том же зверинце что-нибудь подобное do_execute, чтобы выполняло запрос, не надеясь при этом получить "ADODataSet1: CommandText does not return a result set".

т.е. используй TADOCommand для INSERT-предложений, а не TADODataSet


leonidus   (2005-07-13 10:09:00) [14]

>ANB что значит "Гоняешь строки без использования параметров" ? Каких параметров?

На счет "неправильных символов". Я сделе сейчас проще, перед записью данных, заполняю result_request вручную, для так сказать чистоты эксперимента:

result_request:=tstringlist.Create;
result_request.Add('1');
result_request.Add('2');
result_request.Add('3');
result_request.Add('4');

а теперь делаю запрос:

form4.ADOConnection1.Connected:=false;
st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[0]+chr(39)+','+chr(39)+result_request.Strings[1]+chr(39)+')';
do_request(st);

st:='INSERT INTO tabl VALUES ('+chr(39)+result_request.Strings[2]+chr(39)+','+chr(39)+result_request.Strings[3]+chr(39)+')';
do_request(st);
form4.ADOConnection1.Connected:=false;

И все равно таже песьня....


ANB   (2005-07-13 10:01:00) [15]

Мозги надо менять, а не провайдера. Даже разбираться неохота. Гоняешь строки без использования параметров. Ты уверен, что отследил все "неправильные" символы ? И как выглядит такая перекачка, если ты, фактически, данные не все переносишь ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо