Форум: "Базы";
Текущий архив: 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