【问题标题】:Delphi - ZEOS MySQL - access deniedDelphi - ZEOS MySQL - 访问被拒绝
【发布时间】:2016-02-24 01:33:32
【问题描述】:

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

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

在使用 TZEosConn 7.1.4-stable 的 Delphi 中,为 DB 服务器键入正确的主机名,正确的用户名和密码...(参数 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:对不起我的英文和格式

【问题讨论】:

  • 你可以在这里看看我的回答。不要只阅读“表格许可”部分。另一部分与那个无关。permission。也许有帮助。
  • @moskito-x 感谢您的回答,我认为表权限没有问题,因为来自我的本地 PC(相同的主机名 IP 地址,但不同的应用程序)-在 mysql 工作台上工作相同,不幸的是,Zeos组件在Delphi中无法使用同样的东西......问题是,正如我所说,zeos组件在用户名之后添加“错误”主机名 - 即user@11-22-33-44.provider.com和正确的用户名必须是 user@%
  • 没有 user@% 。你总能得到连接来自的主机。
  • 这是来自 MySQL WorkBench 的图片,一切正常:i67.tinypic.com/11l0bkh.png
  • 请记住:您的连接正常。只有用户没有SELECT命令的权限

标签: mysql delphi zeos


【解决方案1】:

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

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

  • 第二:你有授予选项吗?这可能会导致 ZEOS 组件出现问题。

    上使用。 TO 'root'@'%'

    使用 GRANT 选项将 mydb.* 上的所有权限授予 '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,而 Internet 服务器通常使用其他的,例如 UTF-8。

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

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

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

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

我给出了许多调查途径,希望对你有所帮助。

【讨论】:

    【解决方案2】:

    我认为您必须在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2017-11-01
      • 2018-08-31
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2010-10-04
      相关资源
      最近更新 更多