Android端如何通过编程校验SQL Server登录信息与连接有效性
实现步骤
1. 前置配置
- 首先在
AndroidManifest.xml中添加网络权限,Android 4.4默认禁止应用网络访问,必须声明:
<uses-permission android:name="android.permission.INTERNET" />
- 确认服务端SQL Server已经开启TCP/IP协议,默认1433端口已放通防火墙,允许外部设备访问。
2. 核心连接校验逻辑
Android 4.4禁止主线程执行网络IO操作,所有连接校验逻辑必须放在子线程中执行,以下是适配Android 4.4的实现方案:
核心代码示例
// 校验参数的异步任务,入参为IP、用户名、密码 private class CheckDbConnectionTask extends AsyncTask<String, Void, ConnectionResult> { @Override protected ConnectionResult doInBackground(String... params) { String ip = params[0]; String username = params[1]; String password = params[2]; // 可选参数:如果支持用户自定义端口、实例名、数据库名可改为动态传入 int port = 1433; String dbName = "你的默认业务库名"; // 无指定库需求可直接移除该参数 Connection conn = null; try { // 旧版本Android必须显式加载jtds驱动,避免类找不到异常 Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 拼接jtds连接URL String connUrl = String.format("jdbc:jtds:sqlserver://%s:%d;databaseName=%s;useUnicode=true;characterEncoding=utf-8", ip, port, dbName); // 尝试建立连接 conn = DriverManager.getConnection(connUrl, username, password); return new ConnectionResult(true, "连接成功,凭证有效"); } catch (ClassNotFoundException e) { return new ConnectionResult(false, "驱动加载失败,请检查APP编译配置"); } catch (java.net.UnknownHostException e) { return new ConnectionResult(false, "IP地址不可达,请检查IP填写是否正确、设备与数据库网络是否互通"); } catch (java.net.SocketTimeoutException e) { return new ConnectionResult(false, "连接超时,请检查端口是否开放、防火墙是否允许访问"); } catch (java.sql.SQLInvalidAuthorizationSpecException e) { return new ConnectionResult(false, "用户名或密码错误,请重新填写"); } catch (java.sql.SQLException e) { return new ConnectionResult(false, "连接失败:" + e.getMessage()); } finally { // 校验完成立即关闭连接,避免占用数据库资源 if (conn != null) { try { conn.close(); } catch (SQLException ignore) {} } } } @Override protected void onPostExecute(ConnectionResult result) { // 回到主线程更新UI反馈结果 if (result.isSuccess) { // 连接成功逻辑:可将配置加密存储到本地 Toast.makeText(SettingActivity.this, result.msg, Toast.LENGTH_SHORT).show(); } else { // 连接失败逻辑:对应提示用户修改配置 Toast.makeText(SettingActivity.this, result.msg, Toast.LENGTH_SHORT).show(); } } } // 连接结果实体类 private static class ConnectionResult { boolean isSuccess; String msg; public ConnectionResult(boolean isSuccess, String msg) { this.isSuccess = isSuccess; this.msg = msg; } }
3. 调用方式
用户点击「校验连接」按钮时,取输入框参数执行异步任务即可:
String inputIp = etIp.getText().toString().trim(); String inputUsername = etUsername.getText().toString().trim(); String inputPwd = etPwd.getText().toString().trim(); // 基础非空校验 if (TextUtils.isEmpty(inputIp) || TextUtils.isEmpty(inputUsername)) { Toast.makeText(this, "IP和用户名不能为空", Toast.LENGTH_SHORT).show(); return; } // 启动校验任务 new CheckDbConnectionTask().execute(inputIp, inputUsername, inputPwd);
注意事项
- jtds 1.2.4默认兼容SQL Server 2000~2014版本,若SQL Server版本高于2014,需在连接URL中添加
ssl=request参数适配加密连接。 - 用户填写的数据库敏感信息存储到本地时需做加密处理,禁止明文存储在SharedPreferences等路径。
- 若SQL Server使用命名实例或动态端口,需让用户补充填写实例名,在连接URL中添加
instance=实例名参数即可。
内容的提问来源于stack exchange,提问作者Saher Al-Sous
相关产品推荐
相关产品推荐

