首先检查数据库服务器是否在运行,ping一下服务器IP地址看能不能连通;然后验证连接字符串里的用户名密码是否正确,别输错了;再看看防火墙有没有挡住端口,比如SQL Server默认1433端口要放行;如果还是不行,重启一下Delphi程序和数据库服务试试,很多时候就是卡住了;最后用数据库管理工具单独连一下,看是不是Delphi端的ADO组件问题。
论坛用户经验分享
我之前Delphi连SQL Server老是报'连接失败',折腾半天发现是连接字符串里Server=localhost改成Server=127.0.0.1就好了,还有时候ODBC驱动过期了,得去微软官网下载最新版重装。另一个问题是数据库名写错了,检查ConnectionString里的Initial Catalog是不是对的。报错'登录失败'一般就是账号权限不够,去SQL Server Management Studio给用户加db_owner权限就行。
老程序员贴士
Delphi数据库异常排查顺序:1.网络连通性,用telnet服务器端口测试;2.驱动问题,FireDAC用TFDConnection测试连接,ADO用TADOConnection的Connected属性;3.异常捕获,在try..except里print出Error.Message和Error.NativeError,SQL Server常见NativeError 18456是认证失败。修复:更新Windows和Delphi补丁,检查TNSNAMES.ORA文件如果用Oracle。
实际案例修复
项目里Delphi连MySQL报'无法连接到服务器',原因是MySQL服务没启动,任务管理器里启动mysqld.exe;连接字符串用TADOConnection时,Provider=SQLOLEDB,Data Source=服务器名;失败后别急着改代码,先用Navicat工具连数据库确认OK,再回Delphi调试。报错'超时'就把CommandTimeout设大点,比如5000毫秒。
常见报错解决方案
Delphi FireDAC连数据库'Connection lost',检查KeepConnection=dmAlways;'Invalid connection string'直接复制粘贴检查空格;Oracle连不上,TNS Listener没启动,cmd里lsnrctl start。报错10061是服务器拒绝连接,远程桌面去服务器开远程访问权限。
一步步排查法
1.确认数据库类型,SQL/Access/Oracle不同连接方式;2.测试简单连接代码:ADOQuery1.ConnectionString := 'Provider=...'; ADOQuery1.Active := True; 3.日志记录错误,用ShowMessage(e.Message); 4.如果是远程,VPN连上再试;5.重装MDAC组件,很多老Delphi项目需要。
FAQ
Q: Delphi连数据库突然断开怎么办?
A: 加心跳检测,每隔一段时间执行简单SELECT,失败就重连;用TADOTimer定时检查Connected属性。
Q: 报错'Provider cannot be found'怎么修?
A: 安装对应OLEDB提供程序,SQL Server去官网下SQL Native Client。
Q: 连接字符串怎么写最稳?
A: 用INI文件存,加密密码,示例:Server=192.168.1.100;Database=mydb;Uid=user;Pwd=pass;。
Q: 多线程下连接异常多?
A: 每个线程建独立连接池,别共享TADOConnection。