我如何能得到选择行和行计数
本文关键字:选择 何能得 | 更新日期: 2023-09-27 18:08:30
大家好,我试着为一些实体创建页面,我有签名的功能这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)
{
}
I get exception Message =带有返回值的RETURN语句不能在此上下文中使用。当我删除返回@MaxCount所有工作正常,但我没有得到MaxCount
更新代码并使用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;
RETURN在存储过程中用于退出并同时指示状态。不能在查询批处理中使用。
对于您的用例,我可能会做以下两件事之一:
- 在批处理中使用两个查询。你可以使用阅读器。在批处理中的多个结果集之间移动。
- 使用两个独立的SqlCommands
稍微复杂一点,但您也可以向结果集中添加额外的列,例如
SELECT top(@NumOfRows) B.*, A.TotalRows
FROM (SELECT TotalRows = COUNT(*) FROM tbMediaItems) A
CROSS JOIN ( SELECT RowNum = ROW_NUMBER() OVER (ORDER BY Artist) ...
虽然这里或原始版本中的COUNT(*)
可以替换为系统上的这种类型的查询。如果您的表非常大,则分区表。除了事务性非常强的表之外,它在大多数情况下是准确的。