我正在尝试从Delphi 7应用程序连接到网络上的mysql数据库服务器(版本5.6)...
使用 Mysql 工作台,它可以正常工作,我可以与我的测试用户(在 Delphi 7 中不起作用的同一用户)一起运行选择查询......
在德尔福,使用TZEosConn 7.1.4-stable,为数据库服务器输入正确的主机名,正确的用户名和密码... (参数登录提示 = 假)当我将"连接"更改为 true 时,一切正常......
但是当我尝试执行一个简单的查询时:
zq..SQL。文本:='从数据库中选择字段。表中 id='+inttostr(x)+';';zq.执行;
其中 zq 是 TZQuery,x 是整数,
我收到此错误:**EZSQLException.. SELECT 命令被拒绝@my_internet_hostname **
当我登录MySQL工作台时,我看到同一个用户具有通配符会话,例如mydbuser@%,相同的选择工作正常
所以我认为,问题出在 ZEOS 组件中,它会自动添加我的互联网提供商主机名......
在mysql服务器上,我允许使用通配符主机名(简单地 - '%' - 所以所有主机都可以访问我的MYSql DB)
有人可以建议我,我的 ZEOS 组件有什么问题吗???
PS:对不起我的英语和格式
你的MySQL服务器来自互联网吗?
-
首先:您的互联网提供商是否允许您使用管道/套接字连接直接访问MySQL数据库?通常,由于安全问题,互联网提供商不允许这样做。(如果您询问他们,他们可以为此打开一个特殊的 IP/端口)。
-
第二:你有授权选项吗? 这可能会导致 ZEOS 组件出现问题。
授予使用 上的 。TO 'root'@'%'
使用授予选项将
mydb
.* 上的所有权限授予"根"@"%"
如果我记得不错,在我像这样更改权限后,它是使用本地网络mysql Server(测试了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 用于更新、插入、删除命令,通常对于返回记录的选择命令,使用 open 命令更方便:
zq.Close;
zq.SQL.Text:='SELECT field FROM database.TABLE where id='+inttostr(x)+';';
zq.Open;
我给出了很多调查路径,希望对您有所帮助。
我认为您必须在 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;