dbExpress, biblioteki i głupie błędy

0

Moje pytanie w dziale Newbe http://4programmers.net/Forum/viewtopic.php?id=162955 od ponad tygodnia leży odłogiem, więc pozwalam sobie zamieścić pytanie tu, licząc, że światłe umysły wskażą mi kierunek ominięcia betonowej ściany, o którą aktualnie rozbijam głowę.
To jest przykład z książki "Delphi 2005 Adama Boducha (do tego miejsca wszystko działało OK).
Poniżej przedstawiam maksymalnie odchudzony kod, który równie skutecznie wywala błąd. Zainstalowałem MySQL v. 5.1.45, Delphi2009. Podgląd baz w mysqlcc wygląda normalnie, łączę się z nimi bez problemu.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WideStrings, DBXMySql, DB, SqlExpr, StdCtrls;

type
  TForm1 = class(TForm)
    SQLConnection1: TSQLConnection;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SQLConnection1.GetTableNames(ListBox1.Items);
end;

end.

Błąd występuje w automatycznie dołączanym module DBXDynalink:

function TDBXDynalinkCommand.DerivedExecuteQuery: TDBXReader;
var
  ReaderHandle: TDBXReaderHandle;
  ByteReader: TDBXDynalinkByteReader;
begin
  ReaderHandle := nil;

    if FCommandHandle = nil then
    Open;

  // Cheaper than using the property access which will cause a parameter row
  // to be allocated.  Also allows delegate driver to delegate the ParameterRow.
  //
  if ((FParameters = nil) or (FParameters.Count = 0)) and (not isPrepared) then
    CheckResult(FMethodTable.FDBXCommand_ExecuteImmediate(FCommandHandle, TDBXWideString(GetText), ReaderHandle))
  else
    CheckResult(FMethodTable.FDBXCommand_Execute(FCommandHandle, ReaderHandle));   <======= tu się wywala
  if ReaderHandle = nil then
  begin
    Result := nil;
  end else begin
    ByteReader := TDBXDynalinkByteReader.Create(FDBXContext, ReaderHandle, FMethodTable);
    Result := TDBXDynalinkReader.Create(FDBXContext, ReaderHandle, FMethodTable, ByteReader);
  end;
end;

Analizując zamieszczone w książce obrazki zauważyłem, że w połączeniu TSQLConnection (rys.14.13) używana jest biblioteka LibraryName=dbexpmysql.dll, natomiast po wybraniu ConnectionName=MySQLConnection, podpowiadana jest dbexpmys.dll.

Błąd występuje w linii:
CheckResult(FMethodTable.FDBXCommand_Execute(FCommandHandle, ReaderHandle));
poniżej podaję odczytane wartości parametrów.

Zachowanie przy różnych kombinacjach active=true/false oraz po zmianie biblioteki jest następujące:


1. connected=true, dbxmysql.dll
Project1.exe raised exception class EAccesViolation with message:
'Acces violation at adress 00C4E89C in module 'dbxmys.dll. Read of adress 00000000'

wartości parametrów:
FCommandHandle=$C84160
ReaderHandle=nil

2. connected=false, dbxmysql.dll

Project1.exe raised exception class EAccesViolation with message:
'Acces violation at adress 00D7E89C in module 'dbxmys.dll. Read of adress 00000000'

wartości parametrów:
FCommandHandle=$DB4160
ReaderHandle=nil

3. connected=false, dbxmys.dll

Project1.exe raised exception class EAccesViolation with message:
'Acces violation at adress 00D7E89C in module 'dbxmys.dll. Read of adress 00000000'

wartości parametrów:
FCommandHandle=$DB4160
ReaderHandle=nil

4. connected=true, dbxmys.dll

Project1.exe raised exception class EAccesViolation with message:
'Acces violation at adress 00C4E89C in module 'dbxmys.dll. Read of adress 00000000'

wartości parametrów:
FCommandHandle=$C84160
ReaderHandle=nil


Jak więc widać, niezależnie od zadeklarowanej biblioteki, błąd sygnalizuje zawsze dbxmys.dll, również fakt odłączenia od bazy zmienia tylko adres.
Będę wdzięczny za wszelkie wskazówki. Wydaje mi się, że właśnie dbExpress jest technologią, której powinienem używać - ale na razie najbardziej podstawowe instrukcje nie chcą działać :(

0

Może się pomyliłeś i ustawiłeś:

ConnectionName = MSSQLConnection zamiast MySQLConnection
DriverName = MSSQL zamiast MySQL

bo u mnie pokazuje prawidłowo.

0

Niestety nie:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 206
  ClientWidth = 339
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 248
    Top = 32
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object ListBox1: TListBox
    Left = 48
    Top = 24
    Width = 121
    Height = 33
    ItemHeight = 13
    TabOrder = 1
  end
  object SQLConnection1: TSQLConnection
    ConnectionName = 'MySQLConnection'
    DriverName = 'MySQL'
    GetDriverFunc = 'getSQLDriverMYSQL'
    LibraryName = 'dbxmys.dll'
    LoginPrompt = False
    Params.Strings = (
      'DriverName=MySQL'
      'HostName=127.0.0.1'
      'Database=delphi'
      'User_Name=root'
      'Password=haslotest'
      'ServerCharSet='
      'BlobSize=-1'
      'ErrorResourceFile='
      'LocaleCode=0000'
      'Compressed=False'
      'Encrypted=False')
    VendorLib = 'libmysql.dll'
    Connected = True
    Left = 160
    Top = 152
  end
end
0

Widzę, że brakuje pomysłów, więc może dwa pytania.

  1. Jeżeli u mnie nie działa, a u innych tak, więc czymś się różnimy. Może to kwestia bibliotek? Czy mogę prosić o sprawdzenie:
    c:\CodeGear\RAD Studio\6.0\bin\libmySQL.dll rozmiar 2 359 296
    c:\CodeGear\RAD Studio\6.0\bin\dbxmys.dll rozmiar 234 496
    c:\CodeGear\RAD Studio\6.0\bin\dbxmysql.dll <===== TAKIEJ BIBLIOTEKI NIE MAM !!! właśnie to zauważyłem, a mimo to, komunikaty o błędach są prawie identyczne.
    Może kwestia lokalizacji (gdzieś coś trzeba skopiować?)

  2. Jaka technologia dostępu jest wg Was najlepsza dla baz danych, zakładając perspektywicznie MySQL, MSSQL lub Oracle na serwerze lokalnym lub w Internecie? Myślałem, że właśnie dbExpress jest najlepszym wyborem

0

U mnie nie ma pliku
dbxmysql.dll
w Delphi 7.

Na razie podłącz się do innej bazy danych i na niej się ucz. Po co ci My SQL skoro nie generujesz kodu php? Chcesz umieścić exe na serwerze? To wymaga serwera VPS z systemem windows.

0

dbExpress jest szybki bo jednokierunkowy. Jeżeli planujesz używać DBGrida to sobie odpuść dbExpress (wprawdzie da się podłączyć DBGrida ale przy wyświetlaniu powyżej 30 rekordów zaczyna mulić okrutnie).
Za pomocą ADO na pewno podłączysz się do MSSQL i Oracle, do MySql chyba też.

0
pytek napisał(a)

dbExpress jest szybki bo jednokierunkowy. Jeżeli planujesz używać DBGrida to sobie odpuść dbExpress (wprawdzie da się podłączyć DBGrida ale przy wyświetlaniu powyżej 30 rekordów zaczyna mulić okrutnie).
Za pomocą ADO na pewno podłączysz się do MSSQL i Oracle, do MySql chyba też.

To się ogranicza liczbę wyświetlanych rekordów na sztywno (poza standardem SQL) np w interbase na końcu daje się komendę "rows a to b" i wyświetla tylko rekordy zwrócone przez to zapytanie od numeru a do b.

0

Hurra!
Po wymianie MySQL na 5.0 i wymianie libmySQL.dll na odpowiednie, nagle wróciła świadomość :D

Będę wciąż wdzięczny za sugestie dotyczące środowiska. Uczę się Delphi, więc po stronie klienta powinna być taka aplikacja. Serwer może być osadzony na serwerze sieci lokalnej lub w Internecie, oczywiście optymalnie byłaby obsługa MySQL, MSSQL lub Oracle jako najważniejszych silników.

1 użytkowników online, w tym zalogowanych: 0, gości: 1