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

Android连接MSSQL执行表操作时触发numMsgsRcvd断言错误求助

问题分析与解决方案

你遇到的java.lang.AssertionError: numMsgsRcvd:1 should be less than numMsgsSent:1是MSSQL JDBC驱动在Android环境下的SSL握手兼容性问题——即使连接URL设置了encrypt=false,驱动仍会尝试初始化SSL通道,和Android系统的Conscrypt SSL库产生冲突,导致断言失败。

以下是针对性的解决方法:

方法一:调整JDBC连接参数,强制禁用SSL相关逻辑

修改连接URL,添加额外参数强制关闭SSL握手的不必要流程:

private val url =
    "jdbc:sqlserver://[IP Address];databaseName=dbName;user=user3;password=password2;encrypt=false;trustServerCertificate=true;sslProtocol=TLSv1.2;disableStatementPooling=true;sendStringParametersAsUnicode=false"

关键新增参数说明:

  • sslProtocol=TLSv1.2:指定兼容Android的SSL协议版本
  • disableStatementPooling=true:关闭驱动的语句池,避免连接复用中的SSL状态问题
  • sendStringParametersAsUnicode=false:优化Android上的字符串传输兼容性

方法二:降级MSSQL JDBC驱动版本

高版本MSSQL JDBC驱动(如你用的12.8.0.jre11)对Android的SSL支持存在兼容性问题,降级到更稳定的旧版本:
在依赖版本中修改:

mssqlJdbc = "9.4.1.jre11"

这个版本经过大量Android环境验证,SSL握手逻辑更稳定。

方法三:修复代码中的语法与逻辑小问题

虽然不是直接引发错误的原因,但修复后能避免后续潜在问题:

  1. 修正exec lambda的语法错误:
    原代码中resultSet -是笔误,应该改为resultSet ->:
val tableExists = exec(buildString {
    append("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Barcode'")
}) { resultSet ->
    resultSet.next()
}
  1. 检查表时添加TABLE_SCHEMA = 'dbo':避免不同schema下同名表导致误判。

额外注意事项

  • 确保你的MSSQL服务器允许非SSL连接(在服务器配置中确认Force Encryption未开启)
  • 测试时可以暂时关闭防火墙,确认网络连接本身无问题

内容的提问来源于stack exchange,提问作者KeremE.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:53:10