Android Studio中直连Microsoft SQL Server 2012失败求助
Android连接SQL Server 2012失败?这里有几个关键排查点
我来帮你捋捋Android应用连接SQL Server失败的问题,结合你的代码和常见的坑点,整理几个必须检查的方向:
1. 先解决最基础的网络与权限问题
- 添加网络权限:在
AndroidManifest.xml里必须加上互联网权限,否则应用连不上网络:
如果你用的是Android 10及以上版本,还要注意如果应用在后台运行,可能需要额外的<uses-permission android:name="android.permission.INTERNET" />ACCESS_NETWORK_STATE权限,但先确保基础的INTERNET权限已添加。 - 确认服务器可访问:
- 你的安卓设备(或模拟器)必须和SQL Server所在机器在同一网络,或者服务器有公网IP且开放了1433端口(防火墙要放行这个端口)。
- 要是用Android模拟器测试本地SQL Server,别用
localhost,改用模拟器的回环地址10.0.2.2。
2. 修正JDBC连接字符串与登录配置
你的连接字符串可能缺了必要参数,或者登录配置有问题:
- 检查连接字符串格式,建议补充字符集参数,避免编码问题:
String connString = "jdbc:jtds:sqlserver://你的实际IP:1433/DBname;charset=UTF-8;"; - 如果你的SQL Server是命名实例(比如默认的
SQLEXPRESS),必须加上实例参数:String connString = "jdbc:jtds:sqlserver://你的实际IP:1433/DBname;instance=SQLEXPRESS;charset=UTF-8;"; - 确认SQL Server的登录模式:必须设置为混合模式(SQL Server和Windows身份验证),如果是纯Windows身份验证,JDBC连接会失败,要用SQL Server账号(你代码里的username和password)登录。
- 验证账号权限:确保这个账号有权限访问
DBname数据库,并且能查询t1表。
3. 主线程不能做耗时操作!
你直接在主线程里执行JDBC操作了!Android从API 11开始就禁止在主线程进行网络/数据库这类耗时操作,会抛出NetworkOnMainThreadException,这大概率是你连接失败的核心原因之一。
必须把数据库操作放到子线程里,比如用普通Thread封装,下面是修改后的代码示例:
public void query2() { Log.i("Android"," SQL Server Connect Example."); // 开启子线程执行数据库操作 new Thread(new Runnable() { @Override public void run() { Connection conn = null; ResultSet rs = null; Statement stmt = null; try { String driver = "net.sourceforge.jtds.jdbc.Driver"; Class.forName(driver); // JDBC4+ 不需要显式调用newInstance() // 替换成你的实际连接参数 String connString = "jdbc:jtds:sqlserver://10.0.2.2:1433/DBname;charset=UTF-8;"; String username = "你的SQL账号"; String password = "你的SQL密码"; conn = DriverManager.getConnection(connString, username, password); Log.w("Connection","open"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from t1"); // 子线程不能直接更新UI,要回到主线程 if (rs.next()) { final String data = rs.getString(1); runOnUiThread(new Runnable() { @Override public void run() { txtData.setText(data); } }); } } catch (Exception e) { // 打印完整异常堆栈,方便排查问题 Log.e("Error connection", "连接失败", e); final String errorMsg = "Error in Connection: " + e.getMessage(); runOnUiThread(new Runnable() { @Override public void run() { txtData.setText(errorMsg); } }); } finally { // 确保资源关闭,避免内存泄漏 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (Exception e) { Log.e("Resource close", "关闭资源失败", e); } } } }).start(); }
4. 确认JTDS驱动正确导入
- 如果是用Gradle构建,直接在
app/build.gradle的dependencies块里添加依赖,比手动放jar包更可靠:implementation 'net.sourceforge.jtds:jtds:1.3.1' - 手动导入jar包的话,要确保jar包放在
app/libs目录下,并且右键选择Add As Library,让Android Studio识别这个依赖。
最后一个关键检查:启用SQL Server的TCP/IP协议
打开SQL Server配置管理器,找到SQL Server网络配置 -> 你的实例的协议,确保TCP/IP是启用状态,然后双击TCP/IP,在IP地址选项卡中确认TCP端口是1433。
按照这些步骤排查,应该能解决你的连接问题。
内容的提问来源于stack exchange,提问作者Mostafa Azadi
相关产品推荐
相关产品推荐

