Android登录界面连接MS SQL Server失败,求问题排查与优化方案
一、当前报错的直接原因
从错误日志:
E/ERROR: Unknown server host name 'Unable to resolve host "myipaddresstestDatabasetestDatabase": No address associated with hostname'.
可以看出数据库连接的主机名解析失败,结合代码先排查以下核心问题:
Driver类名拼写错误
你定义的Driver路径是net.sourceforge.jtds.jtbc.Driver,正确的jTDS驱动类名应为net.sourceforge.jtds.jdbc.Driver(注意是jdbc而非jtbc),这个错误会导致驱动加载失败,直接影响连接建立。ConnectionHelper类的CONN()方法实现问题
代码中调用了ConnectionHelper.CONN()但未给出该类实现,报错里的畸形主机名myipaddresstestDatabasetestDatabase说明该方法可能未正确使用你定义的url变量,存在硬编码错误或拼接逻辑问题。确保CONN()方法正确实现:// 建议把变量名Class改成driverClass,避免和关键字冲突 Class.forName(driverClass); Connection conn = DriverManager.getConnection(url, username, password);网络与数据库配置问题
- 确认Android设备能ping通SQL Server所在IP,端口(默认1433)是否开放
- 检查SQL Server是否开启远程连接、启用TCP/IP协议
- 服务器防火墙是否放行该端口的入站请求
二、当前代码的其他隐患
SQL注入风险
直接将用户输入的emailId拼接进SQL语句:String query = "Select * from testDatabase where UserId='" + emailId + "'";这会导致严重的SQL注入攻击,正确做法是使用参数绑定:
String query = "Select * from testDatabase where UserId=?"; PreparedStatement ps = connect.prepareStatement(query); ps.setString(1, emailId); // 绑定参数StrictMode不当使用
你在onCreate中设置了StrictMode.ThreadPolicy.Builder().permitAll(),但已经用AsyncTask处理后台操作,完全不需要这个设置,反而会隐藏线程违规问题,建议删除。AsyncTask已过时
Android API 30及以上版本中AsyncTask已被废弃,推荐使用Kotlin协程或Java ExecutorService处理后台任务。严重安全问题
在Android客户端直接连接SQL Server并硬编码数据库账号密码,会导致敏感信息被反编译获取,这是客户端直连数据库的致命缺陷。
三、更优实现方案
强烈不建议在Android客户端直接连接SQL Server,正确架构如下:
- 搭建后端服务(如Spring Boot、ASP.NET Core),由后端负责连接SQL Server,提供登录接口(例如POST请求
/api/login)。 - Android端通过Retrofit/OkHttp发送HTTP请求,传递用户名和密码到后端接口。
- 后端接口验证用户信息(查询数据库、比对加密存储的密码,推荐用BCrypt加密),返回登录结果及身份凭证(如JWT Token)。
- Android端根据返回结果处理页面跳转,后续请求携带Token完成身份验证。
该方案优势:
- 避免数据库敏感信息暴露在客户端
- 统一处理业务逻辑与安全验证
- 降低客户端与数据库耦合,便于后续扩展维护
内容的提问来源于stack exchange,提问作者Jesse Tee

