Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Трабл при вставке данных


Автор: NetShadow 30.10.2006, 09:40
Суть такая, делаю выборку, а потом эти данные надо вставить выборку делаю из MySql вставку в Oracle, код ниже:
Код

procedure TForm1.Button5Click(Sender: TObject);
begin
 MySqlADOQuerySelId.Sql.Clear;
 MySqlADOQuerySelId.Sql.Text:='select id_person, id_post_person'
                             +' from tmp_person'
                             +' order by id_person'
                             +' desc limit '
                             +Edit1.Text;
 Memo1.Lines.Add(MySqlADOQuerySelId.Sql.Text);
 MySqlADOQuerySelId.Open;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  OraADOQuery.SQL.Clear;
  OraADOQuery.Open;
    while not MySqlADOQuerySelId.EOF do
 begin
    OraADOQuery.Sql.Text:='insert into epique_insert_person (id_person,id_post_person)'
                         +'values(:id_person,:id_post_person)';
    OraADOQuery.Parameters.ParamByName('id_person').Value:=MySqlADOQuerySelId.Fields[0].AsString;
    OraADOQuery.Parameters.ParamByName('id_post_person').Value:=MySqlADOQuerySelId.Fields[0].AsString;
    OraADOQuery.ExecSQL;
    OraADOQuery.Next;
 end;
end;


вставка не происходит, выдаёт ошибку "OraAdoQuery: Missing Sql property", не пойму в чём трабл? подскажите...

Автор: superVad 30.10.2006, 09:56
с ораклом не работал, но можно попробовать перед values пробел поставить,

вместо - OraADOQuery.Parameters.ParamByName('id_person').Value
написать - OraADOQuery.Parameters.ParamByName('id_person').AsString

и я не уверен, но не могу понять зачем там OraADOQuery.Next;

и еще можно перед инсертом открывать транзакцию и после ее комитить (надежнее както)

Автор: NetShadow 30.10.2006, 10:37
superVad писал:
Цитата

с ораклом не работал, но можно попробовать перед values пробел поставить,

а что изменится?

Цитата

написать - OraADOQuery.Parameters.ParamByName('id_person').AsString

Delphi сразу ругается, и подчёркивает строку, нет такого параметра....

Цитата

и я не уверен, но не могу понять зачем там OraADOQuery.Next;

переход к следующей выбранной строке, которую нужно вставить, если ошибся, поправьте....вопрос остается открытым...

Автор: Vas 30.10.2006, 10:44
Трабл во всем smile
Код

procedure TForm1.Button5Click(Sender: TObject);
begin
 MySqlADOQuerySelId.Sql.Clear;
 MySqlADOQuerySelId.Sql.Text:='select id_person, id_post_person'
                             +' from tmp_person'
                             +' order by id_person'
                             +' desc limit '
                             +Edit1.Text;
 Memo1.Lines.Add(MySqlADOQuerySelId.Sql.Text);
 MySqlADOQuerySelId.Open;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
  OraADOQuery.SQL.Clear;
  OraADOQuery.Open; //открываем запрос  зачем????
    while not MySqlADOQuerySelId.EOF do
 begin
    OraADOQuery.Sql.Text:='insert into epique_insert_person (id_person,id_post_person) values(:id_person,:id_post_person)';
    OraADOQuery.Parameters.ParseSQL(SQL.Text, True); //заставляем запрос разобрать параметры
    OraADOQuery.Parameters.ParamByName('id_person').Value:=MySqlADOQuerySelId.Fields[0].AsString;
    OraADOQuery.Parameters.ParamByName('id_post_person').Value:=MySqlADOQuerySelId.Fields[0].AsString;
    try  //здесь вставляем обработку ошибок и стартуем транзакцию
         OraADOQuery.Connection.BeginTrans;
         OraADOQuery.ExecSQL;
         OraADOQuery.Connection.CommitTrans; //здесь закрываем. Если конечно надо каждую запись фиксировать в базе оракуль, если не все то BeginTrans и CommitTrans ставим вначале и конце процедуры, но только если записей очень много можно получить переполнение Rollback экстента в ОРАКЛЕ.
    except
        on E:EADOError do
                 ShowMessage(E.Message);
    end;    
    MySqlADOQuerySelId.Next;  //вот здесь была ошибка нужно  бежим то по запросу к MySQL а не к ORACLE
 end;
end;


Добавлено @ 10:47 
И вместо Value в параметрах лучше указывать точный тип (AsString, AsInteger и т.д.)И в случае если есть поля типа Blob то такой перенос не сработает  smile 

Автор: superVad 30.10.2006, 11:40
теперь понятно зачем там Next  smile 

Автор: NetShadow 30.10.2006, 12:47
Vas писал:

Код

    end;    
    MySqlADOQuerySelId.Next;  //вот здесь была ошибка нужно  бежим то по запросу к MySQL а не к ORACLE
 end;
end;


её-моё, я только сейчас заметил, а над ошибкой с пятницы уже бьюсь...

superVad, Vas спасибо, тема закрыта... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)