Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
6-1115721192
juice
2005-05-10 14:33
2005.08.21
TNMSMTP и кодировка


4-1119600206
officeman
2005-06-24 12:03
2005.08.21
Как скопировать приложение используемое ОС-ой, как его Удалить?


14-1122408089
MailMan
2005-07-27 00:01
2005.08.21
Пирамиды которые строят сверху вниз


6-1112850836
artemon
2005-04-07 09:13
2005.08.21
ServerSocket.Socket.Connections[] ...


1-1122965509
Term
2005-08-02 10:51
2005.08.21
Добавление и удаление ключа на автозапуск





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский