在C#中读取SQL Server存储过程输出CURSOR参数的问题
在C#中调用带输出游标参数的SQL Server存储过程
别担心,.NET完全支持读取SQL Server存储过程输出的游标,你只是选错了参数的SqlDbType而已!
正确的参数设置
你需要将游标输出参数的SqlDbType指定为SqlDbType.Cursor——这是专门对应SQL Server游标的类型,之前尝试的Udt和Structured是用于用户定义类型和表值参数的,完全不匹配。
下面是修正后的参数创建代码:
// 构建输入日期参数 SqlParameter testDateParameter = new SqlParameter("@TestDate", SqlDbType.DateTime) { Direction = ParameterDirection.Input, Value = theValue // 这里替换成你的实际日期值 }; // 构建输出游标参数 SqlParameter tableDataParameter = new SqlParameter("@TableData", SqlDbType.Cursor) { Direction = ParameterDirection.Output };
完整的调用示例
参数设置好后,你可以通过SqlCommand.ExecuteReader()直接读取游标的结果集,记得用using语句确保资源正确释放:
string connectionString = "你的SQL Server连接字符串"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("[MySchema].[TestTable_MGR_RetrieveLaterThanDate]", conn)) { cmd.CommandType = CommandType.StoredProcedure; // 添加参数到命令对象 cmd.Parameters.Add(testDateParameter); cmd.Parameters.Add(tableDataParameter); // 执行命令并读取游标数据 using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 按字段名或索引读取数据,示例读取test_date字段 DateTime dateValue = reader.GetDateTime(reader.GetOrdinal("test_date")); // 处理其他字段... Console.WriteLine($"读取到日期: {dateValue}"); } } } }
额外建议:尽量避免使用游标
正如你提到的,游标在SQL Server中性能通常较差,而且增加了代码复杂度。如果可以修改存储过程,推荐直接返回查询结果集,而不是用游标输出:
修改后的存储过程:
ALTER PROCEDURE [MySchema].[TestTable_MGR_RetrieveLaterThanDate] @TestDate DATETIME AS BEGIN SET NOCOUNT ON; -- 直接返回结果集,无需游标 SELECT * FROM MySchema.TestTable WHERE @TestDate <= test_date; END
对应的C#调用会更简洁,不需要处理游标参数,直接执行ExecuteReader()读取结果即可,代码可读性和性能都会更好。
内容的提问来源于stack exchange,提问作者Link Marston
相关产品推荐
相关产品推荐

