如何避免对每个查询重复使用mysql_real_connect()?

时间:2011-05-27 23:31:02

标签: mysql delphi dll mysql-connector lazarus

我通过我在Lazarus / Freepascal制作的连接器查询我的数据库。它使用libmysql中的MySQL 5.0。据我所知,我可以调用的函数与MYSQL C Connector的函数相同。

数据库不用于远程访问;它是一个管道可访问的数据库,我试图使用仅内存表(无MyISAMInnoDB)优化本地读取。速度是主要焦点。

客户端应用程序使用名为MQL4(用于金融市场)的有限脚本语言编写,并使用我的库重复查询数据库并返回结果进行分析。

问题是:每次发送新查询时,我都被迫销毁并重新创建与数据库的连接。

如果我不销毁并重新创建连接,我将收到读取访问冲突,因为我的连接器库丢失了由*MYSQL分配的mysql_real_connect()值。

我会通过我的客户端应用程序传递此值,但不幸的是,它使用的语言只能处理LongIntDoubleString数据类型。

我尝试将值通过我的客户端应用程序转换为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.

1 个答案:

答案 0 :(得分:1)

迈克,我建议使用ZEOS 6.6.6连接到MySQL。

这样你就不必在低级代码中捣乱,但你可以使用标准的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/

祝你好运。