Проблема в Лоцман 2013 c подключением через DCOMConnection

Автор Vigor, 10.06.13, 15:18:38

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Vigor

Здравствуйте!
В Лоцман 2013 возникла проблема с подключением к БД MSSQL через DCOMConnection в C++Builder XE3

1. создал через Component->Import Component из  LoodsmanServerApplication.dll класс обертку LoodsmanServerApplication_TLB.h и подключил в проект
2. На форму кинул компонент  TDCOMConnection
3. Код:

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   Datasnap::Win::Mconnect::TDCOMConnection* con;

   con = DCOMConnection1;
   // прописано в design компонента  DCOMConnection1 :
   // con->ComputerName = "ServComp";
   // con->ServerName = "LoodsmanServerApplication.MainSystem";
   // con->ServerGUID = "{392BA982-A82F-44AB-BA8A-69BE25199F73}";

   // Интерфейс из LoodsmanServerApplication_TLB.h
   IMainSystem *app;
   try
   {
      con->Open();
      if (con->Connected)
      {
         IDispatch* disp = (IDispatch*)(con->AppServer);
         IMainSystemDisp TempInterface( (IMainSystem*)disp);

         TVariant v_inRetCode,v_errMsg,v_Result;

         TempInterface.GetDBList(&v_inRetCode, &v_errMsg, &v_Result);
         if ((int)v_inRetCode != 0)
         {
            ShowMessage("err GetDBList=" + v_errMsg);
         }
         else
         {
            ShowMessage("ok GetDBList=" + v_Result);
         }


         TempInterface.ConnectToDBEx(L"MYDBNAME", L"sa", L"1", &v_inRetCode, &v_errMsg, &v_Result);
         if ((int)v_inRetCode != 0)
         {
            ShowMessage("err ConnectToDBEx=" + v_errMsg);
         }
         else
         {
            ShowMessage("ok ConnectToDBEx=" + v_Result);
         }
      }
   }
   __finally
   {
      con->Close();
   }
}

//-------------------------------------

1) GetDBList отрабатывает нормально - в v_Result выводится список БД, v_inRetCode = 0

2) ConnectToDBEx - выдает ошибку:
v_inRetCode = -2
v_errMsg = "Cannot find OCI DLL: oci.dll"
Порылся в инте, оказалось, что oci.dll - это оракловская либа, хотя у нас БД MS SQL, и оракла вообще нет
Пробовал подсунуть эту dll (скачал с сайта oracle) - начинает выдавать другие ошибки типа ошибка драйвера. Такое ощущение, что Лоцман пытается подсоединиться к MS SQL БД используя драйвера Oracle

3) Есть интересная библиотека http://www.infnt.ru/VLDelphi/VLDelphiMain.html для Delphi
установил ее, при запуске демо-приложения (PLMCommander) выводится та же ошибка "Cannot find OCI DLL: oci.dll"!!!

Кто-нибудь с таким сталкивался?
Это что, глюк 2013 Лоцмана???

Chaa

Посмотрите, что у вас в файле LoodsmanCommon.ini, там указаны настройки баз данных. Проверьте, что сервер приложений работает именно с этим файлом, путь к нему указан в LoodsmanAppServerMain.ini.

Vigor

Посмотрел инишники, криминального вроде ничего нет
1) в LoodsmanAppServerMain.ini корректный путь к LoodsmanCommon.ini
2) в LoodsmanCommon.ini тоже все верно, вот строки относящиеся к подключению:
[AppServers]
ServComp=MYDOMAIN
[Servers]
serverdb\mssqlserv=1
[Databases]
MYDBNAME=serverdb\mssqlserv

3) Фишка в том, что стандартный клиент Лоцмана, нормально работает и без проблем подключается к БД., т.е. он где-то получает информацию, что MYDBNAME - это БД MS SQL, а не Oracle. А вот при вызове метода сервера приложений ConnectToDBEx почему-то пытается использовать именно оракловские драйвера, хотя повторю, БД оракла у нас вообще нет. Мистика :)

Интересно, можно в LoodsmanCommon.ini или где-нибудь в реестре в  ручную прописать тип БД = MS SQL?

------------
Короче, периписал приведенный выше код на Delphi - и... о боги! все заработало.
Неужели асконавцы так не любят c++Builder? :-/
TLB.pas делал из той же LoodsmanServerApplication.dll

//--------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  con: TDCOMConnection;
  app: IMainSystemDisp;

  disp: IDispatch;
  TempInterface: IMainSystemDisp;

  inErrCode: OleVariant;
  stErrMess: OleVariant;
  stDBList: String;
  inResult: OleVariant;
  inRetCode: Integer;
begin

  con := DCOMConnection1;



  try
    con.Open;
    if con.Connected then
    begin

     disp := con.AppServer;
       TempInterface := IMainSystemDisp(disp);

      //stDBList := con.AppServer.GetDBList(inErrCode, stErrMess);
      stDBList := TempInterface.GetDBList(inErrCode, stErrMess);

      ShowMessage(stDBList);

      //inResult := con.AppServer.ConnectToDBEx('MYDBNAME', 'sa', '1', inErrCode, stErrMess);
      inResult := TempInterface.ConnectToDBEx('MYDBNAME', 'sa', '1', inErrCode, stErrMess);

      inRetCode := inErrCode;
      if (inRetCode <> 0) then
      begin
        ShowMessage('err ConnectToDBEx=' + stErrMess);
      end
      else
      begin
        ShowMessage('ok ConnectToDBEx=' + VarToStr(inResult));
      end;


      //inResult := con.AppServer.CheckDBVersion(inErrCode, stErrMess);
      inResult := TempInterface.CheckDBVersion(inErrCode, stErrMess);

      inRetCode := inErrCode;
      if (inRetCode <> 0) then
      begin
        ShowMessage('err CheckDBVersion=' + stErrMess);
      end
      else
      begin
        ShowMessage('ok CheckDBVersion=' + VarToStr(inResult));
      end;

    end;
  finally
    con.Close;
  end;
end;