Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Connect к MySQL через dbExpress->ODBC [D7]


Juice ©   (2005-10-27 10:44:00) 

Вопрос может и не по базам данных вообще. Кто-то работал с dbExpress через ODBC ? Я скачал драйвер OpenODBC for dbExpress и все ОК - демка, что с ним в комплекте нормально  работает. Но из своего приложения при попытке коннекта я получаю :
Project raised exception class EDbxOdbcWarning with messsage 'SQL_SUCCESS_WITH_INFO returned from ODBC function SQLGetINfo(SQL_IDENTIFIER_QUOTE_CHAR) ODBC Return Code:1: SQL_SUCCESS_WITH_INFO  No ODBC diagnostic info avalable.' Prosess stoped. Use Step or Run to continue.
После этой ошибки я продолжаю работать, открываю датасет, получаю данные. Я скопировал TSQLConnection из демки и кинул на свою форму, перенес и проверил все настройки проекта и директивы компилятора - все один в один сходится с той демкой. Вот куски кода коннекта:
Мой код:

try
   SQLConnection2.Connected := true;
 finally
   if SQLConnection2.Connected then ShowMessage('yo'); //показывается!
 end;
 SimpleDataSet1.Open;

А вот из демки:

procedure TFormOdbcExplor.pbConnectClick(Sender: TObject);
var
 sConString, sVendorLib, sVendorDesc: String;
 Status: SQLResult;
 Len : Smallint;
 {begin: exception stack demo}
 //  O: TObject;
 {end.}
begin
 {begin: exception stack demo}
 {
   O := Self;
  if O nil then
    O := nil;
  ShowMessage( O.ClassName() );
 //}
 {end.}
 Cursor := crSQLWait;
 try
 try
   TickCountInfo := GetTickCount;

   //SQLConnection1.Connected := not (SQLConnection1.Connected);
   if SQLConnection1.Connected then
     SQLConnection1.Connected := False
   else
   try
     if cbDefConOpt.Checked then
       SQLConnection1.Params.Clear;
     try
       SQLConnection1.Connected := True;
     finally
       // remove cached connection options cConnectionOptionsNames[coInternalCloneConnection]:
       sConString := dfDSN.Text;
       sVendorLib := GetOptionValue(sConString, cConnectionOptionsNames[coInternalCloneConnection],
         {HideOption=}True, {TrimResult=}True, {bOneChar=}False,
         {HideTemplate=}#0);
       if sVendorLib #0 then
         dfDSN.Text := sConString;
     end;
   except
     on e:Exception do
     begin
       if pos(DbxOpenOdbcInterface.rsNotSpecifiedDNSName, E.Message) > 0 then
         exit
       else
         raise;
     end;
   end;

   repeat

   TickCountInfo := GetTickCount - TickCountInfo;
   SB.Panels[0].Text := Format(cTickCountInfo, [TickCountInfo]);

   if SQLConnection1.Connected then
   begin
     pbConnect.Caption := 'Disc&onnect';
     // goto query page
     TabSet1.TabIndex := 1;
     // save last connection string to second position (after '?')
     sConString := Trim(dfDSN.Text);
     sConString := GetOptionValue(sConString, 'DSN');
     if (dfDSN.Text='?') or (sConString='') or (sConString='?') then
     begin
       Len := 0;
       Status := SQLConnection1.SQLConnection.getOption(TSQLConnectionOption(xeConnConnectionName),
         nil, 0, Len);
       if (Status 0) or (Len 0 then
         SetLength(sConString, Len);
       if (Status 0) or (Len 1 then
           sConString := 'VendorLib='+sVendorLib + ';' + sConString
         else
           sConString := 'VendorLib='+sVendorLib + ';DSN=' + sConString
       end;
     end;
     if sVendorLib #0 then
     begin
       sVendorLib := ExtractVendorLibName(sVendorLib);
       sVendorDesc := ';VENDORLIB='+UpperCase(sVendorLib);
       for Len := 0 to VendorLib.Items.Count-1 do
       begin
         if Pos(sVendorDesc, UpperCase(VendorLib.Items[Len])) > 0 then
         begin
           sVendorDesc := #0;
           VendorLib.ItemIndex := Len;
           Break;
         end;
       end;
       if sVendorDesc #0 then
       begin
         sVendorDesc := 'VendorName=?' + sVendorLib +';VendorLib='+sVendorLib;
         VendorLib.Items.Add(sVendorDesc);
         VendorLib.ItemIndex := VendorLib.Items.Count-1;
       end;
     end;

     Len := dfDSN.Items.IndexOf(sConString);
     if (Len>1)or(Len0 then
         dfDSN.Items.Delete(Len);
       dfDSN.Items.Insert(1, sConString);
     end;
     dfDSN.Text := sConString;
   end
   else
     pbConnect.Caption := 'C&onnect';

   until True; // break

 except
   if not SQLConnection1.Connected then
     SQLConnection1AfterDisconnect(SQLConnection1)
   else
    SQLConnection1AfterConnect(SQLConnection1);
   raise;
 end;
 finally
   Cursor := crDefault;
 end;
end;

Как так, что даже под IDE в демке никаких исключений не возникает вообще ? Что может на это повлиять, кроме как сам код и набор свойств SQLConnection1 во время коннекта ? А я их сверял, даже прямо перед коннектом в runtime скидывал состояние компонента в файл а потом сверял со своим - все сходится:

object SQLConnection1: TSQLConnection
 ConnectionName = 'OpenOdbc:Prompt'
 DriverName = 'OpenOdbc'
 GetDriverFunc = 'getSQLDriverODBC'
 LibraryName = 'D:\Temp\OpenODBC_3_019_at_2004-08-13\Demos\DbExplor\dbxoodbc.dll'
 LoginPrompt = False
 Params.Strings = (
   'Database=DSN=MYODBCDBMySQL')
 VendorLib = 'myodbc3.dll'
 Left = 64
 Top = 464
end


Juice   (2005-10-27 14:17:00) [1]

Вопрос снят. Демка в uses подключалась к исходникам библиотеки dbxoodbc а я понятное дело ее напрямую использовал. Перекомпилировал библиотеку и все ОК.


Наверх

Титульная страница Поиск, карта сайта Написать письмо