dbxmys30.dll中的Delphi 2007 DBX访问冲突

时间:2010-12-20 21:55:15

标签: delphi delphi-2007

我正在尝试使用Delphi 2007中的dbexpress组件连接到MySQL数据库但是在读取“模块'dbxmys30.dll中的地址0B86E258处的访问冲突'时会出现错误。读取地址00000000”。

我有一个TSQLConnection使用MySQL驱动程序和设置连接到MySQL 5.1数据库。我可以毫无问题地将其设置为活动状态。

当我尝试使用任意数量的组件从数据库获取数据时出现问题。更具体地说,我有一个TSQLTable对象。我将SQLConnection参数设置为我创建的TSQLConnection,并将表名设置为我的数据库中的表。当我尝试将Active设置为true时,我收到错误。这在设计模式和运行时都会发生。尝试从数据库中获取数据的任何其他dbx组件也会发生这种情况。

我正在使用MySQL 5.1客户端和服务器运行Windows 7 64位。我可以使用MySQL Query Browser在数据库上运行查询,没有任何问题。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

您的版本不兼容,您使用的“libmysql.dll”版本与构建dbx驱动程序的版本不兼容。 embarcadero论坛上的This thread建议使用版本“5.0.27”,this thread建议使用“5.0.24”。我成功的最新版本是'5.1.11'。

顺便说一下,因为'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;

答案 1 :(得分:0)

Access Violation ... read of address 00000000表示某些内容试图取消引用 nil 指针。你有dbxmys30.dll的源代码吗?如果是这样,这将非常容易调试。如果没有,除了提交错误报告(谁创建了dbxmys30.dll,BTW?)并希望它能够快速修复之外,你无能为力。