Android Studio连接SQL Server无法显示数据问题求助
Android连接SQL Server:解决
net.sourceforge.jtds.jdbc.Driver错误及数据加载失败问题 核心问题排查与修复
1. 驱动类找不到与连接URL格式错误
你遇到的net.sourceforge.jtds.jdbc.Driver错误,主要来自两个原因:
- 连接URL格式错误:代码中
ConnectionURL开头写成了jdbc;jtds,正确格式应为jdbc:jtds(冒号而非分号);同时参数中存在多余空格(如databasename =、password=),会导致解析失败。 - 驱动依赖未正确配置:即使安装了旧版JDBC驱动,若未在项目中正确引入,依然会找不到驱动类。
2. 数据库配置混淆
代码中database = "ExperimentTable",但查询语句是Select * from ExperimentTable——这里大概率是把表名当成了数据库名,需要确认SQL Server中实际的数据库名称,替换此处的ExperimentTable。
3. 主线程网络操作的不安全做法
使用StrictMode.ThreadPolicy.Builder().permitAll()强制允许主线程做网络操作,会导致ANR风险,建议改用异步任务执行数据库操作。
修正后的代码
ConnectionHelper类
package com.example.connectandroid_sql; import android.annotation.SuppressLint; import android.os.StrictMode; import android.util.Log; import java.sql.Connection; import java.sql.DriverManager; public class ConnectionHelper { String uName, pass, iP, port, database; @SuppressLint("NewAPI") public Connection connectionClass() { iP = "136.158.28.124"; // 替换为实际的数据库名称,而非表名 database = "你的数据库名称"; uName = "sa"; pass = "admin"; port = "1433"; Connection connection = null; String ConnectionURL = null; // 仅临时调试用,发布版请移除并改用异步操作 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); try{ Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 修正URL格式,移除参数中的多余空格 ConnectionURL = "jdbc:jtds:sqlserver://" + iP + ":" + port + ";databasename=" + database + ";user=" + uName + ";password=" + pass + ";"; connection = DriverManager.getConnection(ConnectionURL); } catch (Exception ex){ Log.e("Error",ex.getMessage()); } return connection; } }
MainActivity类(改用AsyncTask执行异步操作)
package com.example.connectandroid_sql; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class MainActivity extends AppCompatActivity { Connection connect; TextView tx1, tx2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tx1 = findViewById(R.id.textView); tx2 = findViewById(R.id.textView2); } public void getTextFromSQL(View v){ new LoadSQLDataTask().execute(); } // 异步任务执行数据库查询,避免主线程阻塞 private class LoadSQLDataTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { try{ ConnectionHelper connectionHelper = new ConnectionHelper(); connect = connectionHelper.connectionClass(); if (connect != null){ String query = "Select * from ExperimentTable"; Statement st = connect.createStatement(); ResultSet rs = st.executeQuery(query); while (rs.next()){ // 在UI线程更新控件 runOnUiThread(() -> { tx1.setText(rs.getString(2)); tx2.setText(rs.getString(3)); }); } return "数据加载成功"; } else { return "连接失败,请检查配置"; } } catch (Exception ex){ Log.e("Error", ex.getMessage()); return "加载出错:" + ex.getMessage(); } finally { // 关闭连接,避免资源泄漏 try { if (connect != null) connect.close(); } catch (Exception e) { e.printStackTrace(); } } } @Override protected void onPostExecute(String result) { Log.d("SQLResult", result); } } }
额外配置与验证步骤
- 添加驱动依赖:在app模块的
build.gradle中添加jtds驱动依赖(替换为你使用的版本):
dependencies { implementation 'net.sourceforge.jtds:jtds:1.3.1' }
- SQL Server配置验证:
- 确认SQL Server已启用TCP/IP协议,1433端口在防火墙中开放
- 确认
sa账户已启用,密码正确,且拥有目标数据库的访问权限 - 确认远程连接已在SQL Server中开启
- 次要错误处理:
Invalid File Path for libcolorx-loader.so:属于系统或第三方库的警告,可通过清理项目缓存(Build -> Clean Project)、更新Android Studio版本解决E/Perf: perftest packageName...:是系统性能测试相关的日志,不影响业务逻辑,可忽略
内容的提问来源于stack exchange,提问作者JazzIQ
相关产品推荐
相关产品推荐

