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

Kotlin Exposed调用SQL Server存储过程返回空结果集问题

问题分析与解决

核心问题

你的代码存在两个关键错误,导致无法正确获取存储过程的返回结果:

  • 参数完全不匹配:存储过程需要@CompOffId和@IsStartFullLeave两个参数,但你调用时传入的是@BranchId,参数名、数量、对应值完全不符。
  • 结果集字段读取错误:存储过程返回的列名为number,但你代码里尝试读取Name和Value这两个不存在的字段,自然读不到数据。

修正后的代码

// 可根据需求定义结果数据类,或直接返回Int
data class ValidationResult(val number: Int)

val result = withContext(Dispatchers.IO) {
    transaction {
        exec(
            "EXEC HRMS.ValidateCompOff @CompOffId=?, @IsStartFullLeave=?",
            params = listOf(compOffId, isStartFullLeave), // 替换为你的实际参数值
            explicitStatementType = StatementType.SELECT
        ) { rs ->
            val resultList = mutableListOf<ValidationResult>()
            while (rs.next()) {
                resultList.add(ValidationResult(rs.getInt("number")))
            }
            resultList
        }
    }
}

简化优化方案

由于存储过程仅返回单个数值,可直接读取结果而非转成列表:

val result = withContext(Dispatchers.IO) {
    transaction {
        exec(
            "EXEC HRMS.ValidateCompOff @CompOffId=?, @IsStartFullLeave=?",
            params = listOf(compOffId, isStartFullLeave),
            explicitStatementType = StatementType.SELECT
        ) { rs ->
            if (rs.next()) {
                rs.getInt("number")
            } else {
                // 处理异常情况,比如抛出提示
                throw IllegalStateException("存储过程未返回预期结果")
            }
        }
    }
}

验证注意事项

  1. 替换代码中的compOffId和isStartFullLeave为你实际要传入的参数值,确保和SQL Server测试时的参数一致。
  2. 确认存储过程调用名称正确,你原代码里的[Stored Procedure Name]要替换为实际的HRMS.ValidateCompOff。

内容的提问来源于stack exchange,提问作者jaymin patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:45:56