1

我正在尝试从 Delphi 7 应用程序连接到网络上的 mysql 数据库服务器(5.6 版)...

使用 Mysql Workbench,它可以正常工作,我可以使用我的测试用户(在 Delphi 7 中不工作的同一用户)运行选择查询...

在使用 TZEosConn 7.1.4-stable 的 Delphi 中,为数据库服务器键入正确的主机名,正确的用户名和密码...(参数 loginprompt = false)当我将“已连接”更改为 true 时,一切正常...

但是当我试图执行一个简单的查询时:

zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';'; zq.ExecSQL;

其中zq是 TZQuery,x是整数,

我收到此错误:**EZSQLException .. SELECT Command denied for @my_internet_hostname **

当我登录 MySQL Workbench 时,我看到具有通配符会话的同一用户,例如 mydbuser@% ,相同的选择工作正常

所以我认为,问题出在 ZEOS 组件中,它会自动添加我的互联网提供商主机名......

在 mysql 服务器上,我允许使用通配符主机名(简单地说 - '%' - 所以所有主机都可以访问我的 MYSql DB)

有人可以建议我,我的 ZEOS 组件有什么问题???

PS:对不起我的英语和格式

4

2 回答 2

0

我认为您必须在 TZConnection 组件的属性中添加一些行:

在打开与您的 TZConnection 组件的连接之前,请尝试以下操作:

function openConnection(BD, User, Host, Pass: string; DBConnection: TZConnection): boolean;
begin
    Result:= false;
    if DBConnection = nil then exit;

    DBConnection.HostName := Host; // Host name to connect
    DBConnection.Protocol := 'mysql-5';
    DBConnection.Port     := 3306; //default port
    DBConnection.Database := DB; // your database name
    DBConnection.User     := User;
    DBConnection.Password := Pass;
    DBConnection.Properties.clear;
    DBConnection.Properties.Add('CLIENT_MULTI_STATEMENTS=1');
    DBConnection.Properties.Add('controls_cp=GET_ACP');

    try
        DBConnection.Connect;
        Result:= DBConnection.Connected;    
    except
        On e:Exception do
        begin
            Result:= false;
            ShowMessage(e.Message);
        end;
    end;
end;
于 2016-02-24T10:54:42.480 回答
0

您的 MySQL 服务器是否来自互联网?

  • 首先:您的互联网提供商是否允许您通过管道/套接字连接直接访问 MySQL 数据库?由于安全问题,通常互联网提供商不允许这样做。(如果你问他们,他们可以为此打开一个特殊的 IP/端口)。

  • 第二:你有赠款选择吗?这可能会导致 ZEOS 组件出现问题。

    授权使用TO 'root'@'%'

    mydb使用 GRANT 选项将 .* 上的所有权限授予'root'@'%'

如果我没记错的话,在我改变这样的特权之后。它使用本地网络 mysql 服务器(通过 EasyPHP 和 WAMP 测试)。

我还建议您使用DSN 字符串进行连接:检查以下连接方式:

http://synopse.info/forum/viewtopic.php?id=1547

var
  dsn : string;
begin
  dsn := 'zdbc:mysql://192.168.2.60:3306/world?username=root;password=dev';

您可以将它用于您的 ZEOSConnexion 初始化,同时注意使用的字符集是什么:iso-8859-1、iso-8859-15、utf-8、ansi。因为Delphi 7 使用 ANSI,而互联网服务器经常使用其他类似 UTF-8 的服务器。

无论如何,我在您的代码中看到一个错误:

zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';';
zq.ExecSQL;

ExecSQL 用于 UPDATE、INSERT、DELETE 命令,通常对于返回记录的选择命令,使用 open 命令更方便:

zq.Close;
zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';';
zq.Open;

我提供了许多调查途径,希望对您有所帮助。

于 2016-02-24T09:03:04.237 回答