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握手逻辑更稳定。
方法三:修复代码中的语法与逻辑小问题
虽然不是直接引发错误的原因,但修复后能避免后续潜在问题:
- 修正
execlambda的语法错误:
原代码中resultSet -是笔误,应该改为resultSet ->:
val tableExists = exec(buildString { append("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Barcode'") }) { resultSet -> resultSet.next() }
- 检查表时添加
TABLE_SCHEMA = 'dbo':避免不同schema下同名表导致误判。
额外注意事项
- 确保你的MSSQL服务器允许非SSL连接(在服务器配置中确认
Force Encryption未开启) - 测试时可以暂时关闭防火墙,确认网络连接本身无问题
内容的提问来源于stack exchange,提问作者KeremE.
相关产品推荐
相关产品推荐

