Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

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

 
leonidus ©   (2005-07-13 09:56) [0]

Люди помогите разобраться.
Я с 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) и программа дальше не пойдет.

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


 
ANB ©   (2005-07-13 10:01) [1]

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


 
leonidus ©   (2005-07-13 10:09) [2]

>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;

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


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

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

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


 
leonidus ©   (2005-07-13 10:39) [4]

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;

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


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

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


 
ЮЮ ©   (2005-07-13 10:42) [6]

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


 
ЮЮ ©   (2005-07-13 10:44) [7]

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:52) [8]

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


 
sniknik ©   (2005-07-13 11:04) [9]

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

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


 
leonidus ©   (2005-07-13 11:40) [10]

Переписал процедуру 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

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


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

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


 
ЮЮ ©   (2005-07-13 11:50) [12]

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

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

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

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


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


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

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

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


 
leonidus ©   (2005-07-13 13:37) [14]

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


 
Anatoly Podgoretsky ©   (2005-07-13 13:59) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.053 c
4-1120064577
ВломПридумывать
2005-06-29 21:02
2005.08.21
HELP !!!


5-1093530180
SEROGA
2004-08-26 18:23
2005.08.21
Создание компонентов


4-1120038815
Dmitrij_K
2005-06-29 13:53
2005.08.21
CreateProcess


6-1115956502
@ndrew
2005-05-13 07:55
2005.08.21
Ошибки работы TSocket


9-1114751547
Crave
2005-04-29 09:12
2005.08.21
Неисчезающее меню