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

问题描述

| 我正在通过在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/ 祝好运。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...