簡體   English   中英

我如何獲得選擇的行和行數

[英]How i can get select rows and rows count

嗨,大家好,我正在嘗試為某些實體public static List<someClass> somePageingFunc(int curentPage,int pageSize,int out maxCount)我具有簽名功能,例如此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消息=在這種情況下不能使用帶有返回值的RETURN語句。 當我刪除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退出並同時指示狀態。 不能僅在查詢批處理中使用它。

對於您的用例,我可能會做以下兩件事之一:

  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) ...

如果此處或原始表中的COUNT(*)很大,則可以用sys.partitions表中的此類查詢代替。 除了具有高度事務性的表外,它通常是准確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM