Нарушение доступа к DBX в Delphi 2007 в dbxmys30.dll - PullRequest
2 голосов
/ 21 декабря 2010

Я пытаюсь использовать компоненты dbexpress в Delphi 2007 для подключения к базе данных MySQL, но получаю сообщение об ошибке «Нарушение доступа по адресу 0B86E258 в модуле« dbxmys30.dll ». Чтение адреса 00000000».

У меня есть TSQLConnection с использованием драйверов MySQL и настройки для подключения к базе данных MySQL 5.1. Я могу установить его активным без проблем.

Проблема возникает, когда я пытаюсь получить данные из базы данных, используя любое количество компонентов. Чтобы быть более конкретным, у меня есть объект TSQLTable. Я установил для параметра SQLConnection значение TSQLConnection, которое создал, и установил имя таблицы для таблицы в моей базе данных. Когда я пытаюсь установить Active в true, я получаю ошибку. Это происходит как в режиме разработки, так и во время выполнения. Это также произойдет с любым другим компонентом dbx, который пытается получить данные из базы данных.

Я использую 64-разрядную версию Windows 7 с клиентом и сервером MySQL 5.1. Я могу без проблем выполнять запросы к базе данных с помощью MySQL Query Browser.

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

У вас несовместимость версий, используемая вами версия libmysql.dll несовместима с версией, для которой построен драйвер dbx. В этой теме на форумах Embarcadero предлагается использовать версию '5.0.27', а в этой теме предлагает '5.0.24'.Последняя версия, которой я пользовался, была '5.1.11'.

BTW, потому что 'libmysql.dll' не содержит информации о версии, мне надоело отслеживать, какая dll была какой версией, и мне пришлось написатьэта маленькая вещь:

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FLastFile: string;
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  shellapi;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
  Width := 350;
  Height := 110;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Handle, False);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  R: TRect;
begin
  Canvas.TextOut(40, 16, 'Drop libmysql.dll to find out version');
  R := Rect(14, 40, ClientWidth, ClientHeight);
  DrawText(Canvas.Handle, PChar(FLastFile), Length(FLastFile), R, DT_LEFT);
end;

function GetVersion(ClientDll: PChar): UINT;
const
  FUNC          = 'mysql_get_client_version';
  FUNCTIONNOTFOUND = '%s: ''%s'' in ''%s''.';
  UNABLETOLOADLIB  = 'Unable to load library (''%s''): ''%s''.';
var
  LibHandle: HMODULE;
  GetClientVersionFunc: function: Integer;
begin
  Result := 0;
  LibHandle := LoadLibrary(ClientDll);
  if LibHandle <> 0 then begin
    try
      @GetClientVersionFunc := GetProcAddress(LibHandle, FUNC);
      if @GetClientVersionFunc <> nil then begin
        Result := GetClientVersionFunc;
      end else
        raise EOSError.CreateFmt(FUNCTIONNOTFOUND,
            [SysErrorMessage(GetLastError), FUNC, ClientDll]);
    finally
      FreeLibrary(LibHandle);
    end;
  end else
    raise EOSError.CreateFmt(UNABLETOLOADLIB, [ClientDll,
        SysErrorMessage(GetLastError)]);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  len: Integer;
  DropName: string;
  Ver: UINT;
begin
  len := DragQueryFile(Msg.Drop, 0, nil, 0) + 1;
  SetLength(DropName, len);
  len := DragQueryFile(Msg.Drop, 0, PChar(DropName), len);
  SetLength(DropName, len);
  try
    try
      Ver := GetVersion(PChar(DropName));
    except
      FLastFile := '';
      raise;
    end;
    if Boolean(Ver) then
      FLastFile := DropName + #10 +'[' + IntToStr(Ver) + ']  -  ' +
          IntToStr(Ver div 10000) + '.' + IntToStr((Ver div 100) mod 100)
          + '.' + IntToStr(Ver mod 100)
    else
      FLastFile := '';
  finally
    Invalidate;
    DragFinish(Msg.Drop);
    Msg.Result := 0;
  end;
end;
0 голосов
/ 21 декабря 2010

Access Violation ... read of address 00000000 означает, что что-то пытается разыменовать указатель nil .У вас есть источник для dbxmys30.dll?Если так, это будет очень легко отладить.Если нет, то вы ничего не можете сделать, кроме как подать отчет об ошибке (который создал dbxmys30.dll, кстати?) И надеетесь, что это быстро исправят.

...