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

标签 delphi delphi-2007

我尝试使用 Delphi 2007 中的 dbexpress 组件连接到 MySQL 数据库,但收到错误消息“模块 'dbxmys30.dll' 中地址 0B86E258 处的访问冲突。读取地址 00000000”。

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

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

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

任何帮助将不胜感激。谢谢!

最佳答案

您存在版本不兼容问题,您使用的“libmysql.dll”版本与构建 dbx 驱动程序所针对的版本不兼容。 This thread embarcadero 论坛建议使用版本“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;

关于dbxmys30.dll 中的 Delphi 2007 DBX 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4494333/

相关文章:

Delphi 2007,Indy 10 - 用于单向传输数据 block 的最简单的 TCP/IP 设置是什么

delphi - 如何在 64 位窗口上调整大小时更新表单?

delphi - OnKeyPress 事件中如何转换 Ctrl + 快捷键?

delphi - 使用复杂记录时有关“无效指针操作”的建议

Delphi Devart SecureBridge POST 请求

delphi - 如何扩展枚举类型?

delphi - 在Delphi中播放视频文件的最佳方式是什么?

delphi - 如何检查列表框是否为空?

forms - FormCreate和Hide之后不会触发FormShow事件;不隐藏任务栏上的图标

delphi - 如何从键=值对字符串中获取电子邮件地址?