0

大家好,我正在尝试为某些实体创建分页,我有这样的签名功能public static List<someClass> somePageingFunc(int curentPage,int pageSize,int out maxCount) 我不能使用存储过程我是 sql 新手请告诉我我做错了什么

string comandStr = "DECLARE @MaxCount int SELECT @MaxCount= Count (*) FROM tbMediaItems"+
                                    " SELECT top(@NumOfRows) * FROM ( SELECT RowNum = ROW_NUMBER() OVER ("+
                                    "ORDER BY Artist), * FROM tbMediaItems) AS a WHERE RowNum > (@NumOfRows * (@CurrentPage - 1)) RETURN @MaxCount";
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = comandStr;
                cmd.CommandType = CommandType.Text;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@NumOfRows", SqlDbType.Int).Value = pageSize;
                cmd.Parameters.Add("@CurrentPage", SqlDbType.Int).Value = curentPage;
                cmd.Parameters.Add("@Result", SqlDbType.Int).Direction = 

ParameterDirection.ReturnValue;
try
                {
                    //SqlDataReader reder = cmd.ExecuteReader();
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var ss = reader[0];
                        var bb = reader[1];
                    }
                    maxCount = Convert.ToInt32(cmd.Parameters["@Result"].Value);
                }
                catch (Exception ex)
                {

                }

我得到 Exeption Message = A RETURN statement with a return value cannot be used in this context。当我删除 RETURN @MaxCount 一切正常但我没有得到 MaxCount

4

2 回答 2

2

更新您的代码并用于ParameterDirection.Output获取返回值:

cmd.Parameters.Add("@Result", SqlDbType.Int).Direction = 
ParameterDirection.ReturnValue;

 cmd.Parameters.Add("@Result", SqlDbType.Int).Direction  = 
 ParameterDirection.Output;

编辑1:

您可以按如下方式创建存储过程:

CREATE PROC [dbo].[procGetMaxCount]
@NumOfRows int,
@CurrentPage int,
@Result int OUTPUT  
AS    
BEGIN   
    SELECT @Result= Count (*) FROM tbMediaItems
                      SELECT top(@NumOfRows) * FROM ( SELECT RowNum = ROW_NUMBER() OVER (ORDER BY Artist), * FROM tbMediaItems) AS a WHERE RowNum > (@NumOfRows * (@CurrentPage - 1))                                       
END

并将您的 .cs 文件更新为:

 string comandStr="procGetMaxCount";

cmd.CommandType = CommandType.StoredProcedure;

于 2013-04-11T08:11:39.427 回答
1

RETURN在存储过程中用于退出并同时指示状态。您不能仅在查询批处理中使用它。

对于您的用例,我可能会做以下两件事之一:

  1. 批量使用两个查询。您可以使用 reader.NextResult 批量在多个结果集之间移动。
  2. 使用两个独立的SqlCommands

稍微复杂一点,但您也可以在结果集中添加一个额外的列,例如

SELECT top(@NumOfRows) B.*, A.TotalRows
FROM (SELECT TotalRows = COUNT(*) FROM tbMediaItems) A
CROSS JOIN ( SELECT RowNum = ROW_NUMBER() OVER (ORDER BY Artist) ...

尽管如果您的表非常大,可以用sys.partitions 表上的这种类型的查询COUNT(*)替换此处或您原来的内容。除了非常高的事务性表之外,它大部分是准确的。

于 2013-04-11T08:23:03.000 回答