我正在尝试使用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在数据库上运行查询,没有任何问题。
非常感谢任何帮助。谢谢!
答案 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?)并希望它能够快速修复之外,你无能为力。