Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > No mapping error code


Автор: Cetus 26.7.2005, 19:36
клиент написан на delphi6 тестировался на Oracle8,
при тестировании на Oracle 10 (у заказчика) стала возникать ошибка
(примерный текст) DBX Error: no mapping for error code.

Код


function  TDM.AddPerson(Id: string; Name, Surname, Patronymic, Phone, Note : string;
                        Id_Contractor : String;
                        DateIn, Rate, Id_Manager, Id_Position: string; PersonType: integer; isInsert : Boolean): boolean;
var
  TD : TTransactionDesc;
  dd : string;
  i : integer;
begin
  TD.TransactionID := 2;
  TD.IsolationLevel := xilREADCOMMITTED;
  SQLConnection.StartTransaction(TD);
  i := 0;
  if isInsert then
  try           ////////////   insert section
    // ввод данных о персоне
    SQLRq.Clear;
    SQLRq.Append(NoParam);
    SQLRq.Append(Surname);
    SQLRq.Append(Name);
    SQLRq.Append(Patronymic);
    SQLRq.Append(Phone);
    SQLRq.Append(Note);
    SQLRq.Append(NoParam);
    i := 1;
    if not InsRec(Tbl_Person, True, SQLRq) then
      raise exception.Create(NoParam);
    dd := '(SELECT Id FROM '+ Tables[Tbl_Person] +
          ' WHERE name=' + Quote + Name + Quote +  ' and surname=' + Quote + SurName + Quote + ' and Patronymic' + Patronymic + ' and Note' + Note +')';
    if (PersonType = ftPers_Employee) then
    begin
      // ввод работника
      SQLRq.Clear;
      SQLRq.Append(dd);
      SQLRq.Append(DateIn);
      SQLRq.Append(NoParam);
      SQLRq.Append(Id_Position);
      SQLRq.Append(Id_Manager);
      SQLRq.Append(Rate);
      SQLRq.Append(NoParam);
      i := 2;
      if not InsRec(Tbl_Employee, True, SQLRq) then
        raise exception.Create(NoParam);
    end
    else
    begin
      // ввод представителя
      SQLRq.Clear;
      SQLRq.Append(dd);
      SQLRq.Append(Id_Contractor);
      SQLRq.Append(NoParam);
      i := 3;
      if not InsRec(Tbl_Contact_Person, True, SQLRq) then
        raise exception.Create(NoParam);
    end;
    SQLConnection.Commit(TD);
    Result := True;
  except
    Result := False;
    SQLConnection.Rollback(Td);
  end
  else /////////////  update section
  try
    // update
    dd := '  UPDATE ' + Tables[Tbl_Person]  + ' SET ' +
          '  surname = ' + Surname +
          ', name = ' + Name+
          ', patronymic = ' + Patronymic +
          ', Phone = ' + Phone +
          ', note = ' + Note +
          '  WHERE Id=' + Id;
    i := 4;
    if not SQLExec(dd) then
      raise exception.Create(NoParam);
    dd := '  UPDATE ' + Tables[Tbl_Employee] + ' SET ' +
          '  Enrolment_date = ' + DateIn +
          ', Position_Id = ' + Quote + Id_Position + Quote +
          ', Manager_Id = ' + Quote + Id_Manager + Quote +
          ', Rate = ' + Quote + Rate + Quote +
          '  WHERE Id = ' + Id;
    i := 5;
    if (PersonType = ftPers_Employee) then
      if not SQLExec(dd) then
        raise exception.Create(NoParam);
    SQLConnection.Commit(TD);
    Result := True;
  except
    Result := False;
    SQLConnection.Rollback(Td);
  end;                  //////////  end all sections

  if not Result then
    Case DM.ErrorCode of
      NoError    : begin
                     AlarmBox('Данные о персоне были удалены другим пользователем');
                     Result := True;
                   end;
      cOraUnique : if (i = 1) or (i = 4) then
                     InfoBox('Человек с таким ФИО уже введен');
      cOraParent : if (i = 2) or (i = 5) then
                     AlarmBox('Термин должности был удален другим пользователем')
                   else if (i = 3) then
                     AlarmBox('Данные о контрагенте были удалены другим пользователем')
                   else
                     AlarmBox('Отсутствует одна из ведущих записей');
    else
      ErrorBox(DM.ErrorMessage);
    end;
end;



function TDM.SQLExec(SQLText: string): boolean;
begin
  try
    FRowsAffected := SQLConnection.Execute(SQLText, nil);
    Result := (FRowsAffected = 1);
    FErrorMessage := '';
    FErrorCode := NoError;
  except on E: Exception do begin
    FErrorMessage := E.Message;
    FErrorCode := GetOraError(FErrorMessage);
    Result := False;
  end; end;
end;


// добавление записи
function TDM.InsRec(TblNo: integer; LastDate :boolean; SQLRq : TStrings): boolean;
var
  dd, txt : string;
  i : integer;
begin
  Result := False;
  if (SQLRq.Count < 2) then exit;
  dd := '';
  for i := 0 to SQLRq.Count - 1 do
  begin
    txt := SQLRq.Strings[i];
    if (i = 0) then
      dd := Quote + txt + Quote;
    else
      dd := dd + Comma + Quote + txt + Quote;
  end;
  dd := 'INSERT INTO ' + Tables[TblNo] + ' VALUES (' + dd + ')';
  Result := SQLExec(dd);
end;





предполагаю что ошибка из-за использования транзакции, но что это может быть за баг??
использовались стандартные компоненты со вкладки bExpress

Автор: Cetus 26.7.2005, 20:07
DBX: No mapping for error code found

Автор: LSD 27.7.2005, 10:47
В справке по Delphi 2005 я ничего про эту ошибку не нашел, а в 6-ке про нее чтонибудь написанно? И еще вопрос, в какой точке выкидывается ошибка. И кстати обновлять BDE, не пробовали?

Автор: Cetus 27.7.2005, 13:06
в файле sqlconst.pas:

-------------------
SDBXUNKNOWNERROR = 'DBX Error: No Mapping for Error Code Found';
-------------------

Использую не BDE, а DbExpress. последний есть в 6-ке а в 7 версии делфи его нет(по крайней мере каких-то компонент), про 2005 не знаю.

как я понял ошибка возникает при использовании транзакций.
(убрал транзакции и ошибка пропала).

отловить конкретный момент, когда возникает ошибка не могу.

баг, скорее всего, в используемых *.dll-ках DbExpress, на эту мысль подтолкнуло сообщение с королевства делфи, вопрос № 29378.

прогу тестировали на машине с делфи 7, oracle10, испольтзуемые .dll :
oci.dll от oracle 10;
dbexpint.dll и dbexpora.dll от delphi 6;

P.S. где брать обновление bde (и dbexpress?)

Автор: LSD 27.7.2005, 13:38
Цитата(Cetus @ 27.7.2005, 14:06)
Использую не BDE, а DbExpress. последний есть в 6-ке а в 7 версии делфи его нет(по крайней мере каких-то компонент), про 2005 не знаю.

В 2005 dbExpress есть, там у TSQLConnection есть свойство Multiple Transaction попробуй поменять его.

Цитата(Cetus @ 27.7.2005, 14:06)
P.S. где брать обновление bde (и dbexpress?)

BDE доступен для скачивания с борландовского сайта всем, а вот dbExpress обновляются вместе с Delphi, а эти обновления только для http://bdn.borland.com/article/0,1410,28405,00.html.

Автор: Cetus 29.7.2005, 10:11
не нашел Multiply transaction в delphi6.
Кстати есть ли какие либо компоненты в 2005 у DbExpress для кеширования данных? ( в 6-ке это TSQLClientDataSet)

Автор: LSD 29.7.2005, 10:50
Там есть: TSQLDataSet, TSQLQuery, TSQLTable, TSimpleDataSet, а вот кто из них кеширует не знаю.

Автор: Cetus 30.7.2005, 11:47
ладно, будем разбираться при необходимости smile
Всем спасибо!
Будем считать что, проблема решается правильной подменой Dll

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