我通过我在Lazarus / Freepascal制作的连接器查询我的数据库。它使用libmysql
中的MySQL 5.0
。据我所知,我可以调用的函数与MYSQL C Connector
的函数相同。
数据库不用于远程访问;它是一个管道可访问的数据库,我试图使用仅内存表(无MyISAM
或InnoDB
)优化本地读取。速度是主要焦点。
客户端应用程序使用名为MQL4(用于金融市场)的有限脚本语言编写,并使用我的库重复查询数据库并返回结果进行分析。
问题是:每次发送新查询时,我都被迫销毁并重新创建与数据库的连接。
如果我不销毁并重新创建连接,我将收到读取访问冲突,因为我的连接器库丢失了由*MYSQL
分配的mysql_real_connect()
值。
我会通过我的客户端应用程序传递此值,但不幸的是,它使用的语言只能处理LongInt
,Double
和String
数据类型。
我尝试将值通过我的客户端应用程序转换为LongInt
,然后将其转换回我的库*MYSQL
,但这不起作用。
老实说,我不明白为什么我的图书馆会失去*MYSQL
的价值。
这是我的图书馆代码:
{$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.
答案 0 :(得分:1)
这样你就不必在低级代码中捣乱,但你可以使用标准的ZEOS控件: TZConnection TZQuery 等。
以下是拉撒路的ZEOS Howto: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/
祝你好运。