问题描述
|
我正在通过在Lazarus / Freepascal中制作的连接器查询数据库。它使用
MySQL 5.0
中的libmysql
。据我所知,我可以调用的功能与“ 2”的功能相同。
该数据库不可用于远程访问;它是一个管道可访问的数据库,我正在尝试使用仅内存表(没有MyISAM
或InnoDB
)优化本地读取。速度是主要重点。
客户端应用程序使用称为MQL4的受限脚本语言编写(用于金融市场),并使用我的库重复查询数据库并返回结果以供分析。
问题是:每次发送新查询时,我都必须销毁并重新创建与数据库的连接。
如果不销毁并重新创建连接,则会出现读取访问冲突,因为我的连接器库丢失了mysql_real_connect()
分配的*MYSQL
值。
我会通过客户端应用程序传递此值,但不幸的是,它是以只能处理LongInt
,Double
和String
数据类型的语言编写的。
我试图通过我的客户端应用程序将该值传递给LongInt
,然后在我的库中将其返回给*MYSQL
,但这没有用。
老实说,我不明白为什么我的图书馆会少付5英镑的价值。
这是我的图书馆代码:
{$CALLING STDCALL}
library D1Query;
{$mode objfpc}{$H+}
uses
cmem,Windows,SysUtils,mysql50;
var
sock: PMYSQL;
qmysql: st_mysql;
type
VArray = array[0..100] of Double;
PArray = ^VArray;
procedure InitSQL; stdcall;
begin
sock := mysql_real_connect(PMysql(@qmysql),\'.\',\'root\',\'password\',\'data\',3306,\'mysql\',CLIENT_MULTI_STATEMENTS);
if sock = nil then begin
OutputDebugString(PChar(\' Couldn\'\'t connect to MySQL.\'));
OutputDebugString(PChar(mysql_error(@qmysql)));
halt(1);
end;
end;
procedure DeInitSQL; stdcall;
begin
mysql_close(sock);
end;
function SQL_Query(QRY: PChar; output: PArray): integer; stdcall;
var
rowbuf: MYSQL_ROW;
recbuf: PMYSQL_RES;
i: integer;
nfields: LongWord;
begin
if (mysql_query(sock,QRY) < 0) then begin
OutputDebugString(PChar(\' Query failed \'));
OutputDebugString(PChar(\' \' + mysql_error(sock)));
end;
recbuf := mysql_store_result(sock);
nfields := mysql_num_fields(recbuf);
rowbuf := mysql_fetch_row(recbuf);
if (rowbuf <> nil) then begin
for i:=0 to nfields-1 do
output^[i] := StrToFloatDef(rowbuf[i],-666);
end;
mysql_free_result(recbuf);
Result := i;
end;
exports
SQL_Query,InitSQL,DeInitSQL;
begin
end.
解决方法
迈克,我建议使用ZEOS 6.6.6连接到MySQL。
这样,您就不必在低级代码中乱搞,但是您可以使用标准的ZEOS控件:TZConnection TZQuery等。
这是Lazarus中ZEOS的使用方法:http://wiki.lazarus.freepascal.org/Zeos_tutorial
您可以下载ZEOS软件包
此处:http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/zeosdbo-6.6.6-stable/ZEOSDBO-6.6.6-stable.zip/download
下载zip文件并安装lazarus软件包。
可以在以下位置找到帮助文件:http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/zeosdbo-6.6.6-stable/
祝好运。