![](/img/trans.png)
[英]Procedure or function 'SP' expects parameter '@param', which was not supplied
[英]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.