簡體   English   中英

過程或函數sp_Procedure期望未提供參數@RecordCount

[英]Procedure or function sp_Procedure expects parameter @RecordCount which was not supplied

我在c#中使用3層體系結構。 我已經創建數據庫分頁。 但是在SQL Server中訪問存儲過程時出現錯誤:

“過程或函數sp_Procedure期望未提供參數@RecordCount。”

ALTER PROCEDURE [dbo].[sp_Procedure]

@PageIndex INT = 1,
@PageSize INT = 10,
@RecordCount INT output,
@Mode varchar(25)
AS

IF (@Mode='DisplayDataPaging')
BEGIN
  SET NOCOUNT ON;
  SELECT ROW_NUMBER() OVER
  (
        ORDER BY [CustomerID] ASC
  )AS RowNumber
  ,[CustomerID]
  ,[CompanyName]
  ,[ContactName]
 INTO #Results
  FROM [Customers]

  SELECT @RecordCount = COUNT(*)
  FROM #Results

  SELECT * FROM #Results
  WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

  DROP TABLE #Results
END
GO

業務邏輯類代碼:

public DataSet GetAllJobs(BussinessObj objBussiness)
                {
                    DataSet ds = new DataSet();
                    IDbCommand selectCommand = null;
                    SqlParameter[] param = new SqlParameter[4];
                    param[0] = new SqlParameter("@Mode", "DisplayDataPaging");
                    param[1] = new SqlParameter("@PageIndex", objBussiness.PageIndex);
                    param[2] = new SqlParameter("@PageSize", objBussiness.PageSize);
                    param[3] = new SqlParameter("@RecordCount", SqlDbType.Int, 4);
                    param[3].Direction = ParameterDirection.Output;
                    ds = objDataAccess.ExecuteDataset(_spName, param);
                    objBussiness.RecordCount = Convert.ToInt32((param[3]).Value);
                    return ds;
                }

aspx.cs文件代碼:

BussinessObj objBussinessObj = new BussinessObj();
    BussinessLgc objBussinessLogic = new BussinessLgc();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.GetCustomersPageWise(1);
        }
    }

    protected void PageSize_Changed(object sender, EventArgs e)
    {
        this.GetCustomersPageWise(1);
    }

    private void GetCustomersPageWise(int pageIndex)
    {
        objBussinessObj.PageIndex = pageIndex;
        objBussinessObj.PageSize = int.Parse(ddlPageSize.SelectedValue);
        objBussinessLogic.GetAllJobs(objBussinessObj);            
        int recordCount = Convert.ToInt16(objBussinessObj.RecordCount.ToString());
        this.PopulatePager(recordCount, pageIndex);
    }

    protected void Page_Changed(object sender, EventArgs e)
    {
        int pageIndex = int.Parse((sender as LinkButton).CommandArgument);
        this.GetCustomersPageWise(pageIndex);
    }

    private void PopulatePager(int recordCount, int currentPage)
    {
        double dblPageCount = (double)((decimal)recordCount / decimal.Parse(ddlPageSize.SelectedValue));
        int pageCount = (int)Math.Ceiling(dblPageCount);
        List<ListItem> pages = new List<ListItem>();
        if (pageCount > 0)
        {
            pages.Add(new ListItem("First", "1", currentPage > 1));
            for (int i = 1; i <= pageCount; i++)
            {
                pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPage));
            }
            pages.Add(new ListItem("Last", pageCount.ToString(), currentPage < pageCount));
        }
        rptPager.DataSource = pages;
        rptPager.DataBind();
    }

正如您發現的那樣,很難使用輸出參數。 (至少我是這樣認為的。)從存儲過程的外觀來看,@ RecordCount唯一要做的就是為您提供返回行的計數。 有一種更簡單的方法可以做到這一點。

從存儲的proc中,我將刪除參數@RecordCount。 然后在您的代碼中...

public DataSet GetAllJobs(BussinessObj objBussiness)
            {
                DataSet ds = new DataSet();
                IDbCommand selectCommand = null;
                SqlParameter[] param = new SqlParameter[4];
                param[0] = new SqlParameter("@Mode", "DisplayDataPaging");
                param[1] = new SqlParameter("@PageIndex", objBussiness.PageIndex);
                param[2] = new SqlParameter("@PageSize", objBussiness.PageSize);
                ds = objDataAccess.ExecuteDataset(_spName, param);
                objBussiness.RecordCount = ds.tables(0).rows.count;
                return ds;
            }

如您所知,DataSet可以包含一個DataTables數組。 您存儲的proc僅返回一個記錄集或一個表。 因此,這使您可以訪問該表:

ds.tables(0) 

這使您可以訪問該表中的所有行:

ds.tables(0).rows 

這將為您提供表中的行數。

ds.tables(0).rows.count 

讓我知道這是否適合您。

謝謝!


更改

@RecordCount INT output

@RecordCount int=null output

暫無
暫無

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

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