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

在C#中调用带参数且通过游标返回值的存储过程并存储到DataTable

没问题!看你的存储过程应该是DB2的对吧?毕竟用到了DYNAMIC RESULT SETS和游标返回的语法。下面我给你一步步讲怎么在C#里调用它,还能把返回的游标数据存进DataTable里:

1. 先准备好DB2驱动

首先得确保你的项目里引用了DB2的.NET驱动,现在常用的是NuGet包IBM.Data.DB2.Core,直接在NuGet包管理器里搜索安装就行。如果是旧版本的DB2,可能用的是IBM.Data.DB2,根据你的环境调整。

2. 完整代码实现

下面是封装好的方法,直接就能用,我加了详细注释:

using System.Data;
using IBM.Data.DB2.Core; // 若用旧驱动,替换为 IBM.Data.DB2

// 假设你的连接字符串已经定义好
private string _db2ConnectionString = "Server=你的数据库地址;Database=库名;UID=用户名;PWD=密码;Port=50000;";

public DataTable FetchAssignedRoles(int userId)
{
    // 初始化要返回的DataTable
    var rolesTable = new DataTable();

    // 使用using确保资源自动释放,避免内存泄漏
    using (var conn = new DB2Connection(_db2ConnectionString))
    {
        conn.Open();

        // 指定调用存储过程
        using (var cmd = new DB2Command("GETASSIGNEDROLES", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            // 添加存储过程需要的输入参数,参数名要和存储过程里的V_USER_ID严格匹配
            cmd.Parameters.Add(new DB2Parameter("V_USER_ID", DB2Type.Integer))
                .Value = userId;

            // 执行命令,获取游标对应的结果集
            using (var reader = cmd.ExecuteReader())
            {
                // 直接把读取器的数据填充到DataTable里
                rolesTable.Load(reader);
            }
        }
    }

    return rolesTable;
}
3. 关键细节要注意
  • 参数匹配:DB2对存储过程的参数名大小写可能敏感,一定要和你存储过程里的V_USER_ID完全一致,别写错了。
  • 游标自动处理:因为你的存储过程声明了DYNAMIC RESULT SETS 1,而且游标是WITH RETURN TO CLIENT,所以ExecuteReader()会直接拿到这个游标对应的结果集,不需要手动去处理游标对象,非常省心。
  • 资源释放:所有的连接、命令、读取器都用using包裹,这样即使中间出异常,资源也会自动释放,不会留隐患。
4. 常见问题排查

如果遇到连接失败,先检查:

  • DB2驱动版本和数据库版本是否兼容
  • 连接字符串里的服务器地址、端口(默认50000)、用户名密码是否正确
  • 数据库服务器是否允许你的应用程序IP访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:36