You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中直连Microsoft SQL Server 2012失败求助

Android连接SQL Server 2012失败?这里有几个关键排查点

我来帮你捋捋Android应用连接SQL Server失败的问题,结合你的代码和常见的坑点,整理几个必须检查的方向:

1. 先解决最基础的网络与权限问题

  • 添加网络权限:在AndroidManifest.xml里必须加上互联网权限,否则应用连不上网络:
    <uses-permission android:name="android.permission.INTERNET" />
    
    如果你用的是Android 10及以上版本,还要注意如果应用在后台运行,可能需要额外的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:59:09