ورود

View Full Version : مشکل در پاس دادن پارامتر به Stored Procedure



saminjoon
دوشنبه 10 آذر 1393, 23:53 عصر
سلام به همه دوستان
من برای صفحه بندی کردن گریدویو به صورتی که میخواستم , یک کد پیدا کردم که با Stored Procedure کار میکنه
اولین باره من با Stored Procedure کار میکنم برای همین برام کمی نامفهومه
یک روزه تمام دارم سعی میکنم یک پارامتر بذارم توش موفق نمیشم:عصبانی++:
من کد فراخوانی Stored Procedure و خود Stored Procedure رو میذارم و بعد مشکلمو میگم


Private Sub GetCustomersPageWise(pageIndex As Integer)
Dim catp As String
'----------------------------
If drpx.selectedindex = 0 Then
catp = ""
Else
catp = " and userID=" & Session("id")
End If
'-------------------------------------------
Using con As New SqlConnection(constring)
Using cmd As New SqlCommand("users", con)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@PageIndex", pageIndex)
cmd.Parameters.AddWithValue("@PageSize", Integer.Parse("30"))
cmd.Parameters.AddWithValue("@hfcat", catp)
cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4)
cmd.Parameters("@RecordCount").Direction = ParameterDirection.Output
con.Open()
Dim idr As IDataReader = cmd.ExecuteReader()
mygridview.DataSource = idr
mygridview.DataBind()
idr.Close()
con.Close()
Dim recordCount As Integer = Convert.ToInt32(cmd.Parameters("@RecordCount").Value)
Me.PopulatePager(recordCount, pageIndex)
End Using
End Using
End Sub


و این هم Stored Procedure که تو بانک نوشتم

USE [mydatabase]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[users]
(
@PageIndex INT = 1,
@PageSize INT = 10 ,
@hfcat nvarchar(500),

)
AS
BEGIN
SET NOCOUNT ON;

SELECT ROW_NUMBER() OVER
(order by id desc )
AS RowNumber ,[id] ,[title]
INTO #Results
FROM [user]

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


حالا مشکل من اینه که میخوام فقط متغیر @hfcat در شرط قرار بگیره یعنی : FROM [user] where @hfcat ، ولی خطا میده
میشه لطفا راهنماییم کنید؟

حمیدرضاصادقیان
سه شنبه 11 آذر 1393, 06:10 صبح
سلام
اگر از نسخه 2012 استفاده می کنید . نیازی به استفاده ا زاین کد نیست.
برای صفحه بندی میتونید از دستور offset Fetch استفادده کنید.
شرحش در MSDN موجود هست.

saminjoon
سه شنبه 11 آذر 1393, 08:22 صبح
ولی متاسفانه sql server من نسخه 2008 هست
اینجا چکار میتونم بکنم؟

حمیدرضاصادقیان
سه شنبه 11 آذر 1393, 22:53 عصر
سلام
اولا این دو خط اضافیه
qlDbType.Int, 4) cmd.Parameters("@RecordCount").Direction = ParameterDirection.Output


به خاطر اینکه در کد نوشتید Set nocount on . یعنی تعداد رکوردهارو برنگرددون. پس نیازی به این دوخط نیست.
در مورد شرط نیز میشه

SELECT ROW_NUMBER() OVER (order by id desc )
AS RowNumber ,[id] ,[title]
INTO #Results
FROM [user]
where title=@hfcat



درواقع این متغیر شما به عنوان یک مقدار در جلوی یک فیلد قرار میگیره و میگیم که چیزهایی رو برای ما نمایش بده که مثلا فیلد Title ما برابر مقدار متغیر ما باشه.

saminjoon
چهارشنبه 12 آذر 1393, 00:48 صبح
سلام
اولا این دو خط اضافیه
qlDbType.Int, 4) cmd.Parameters("@RecordCount").Direction = ParameterDirection.Output


به خاطر اینکه در کد نوشتید Set nocount on . یعنی تعداد رکوردهارو برنگرددون. پس نیازی به این دوخط نیست.
در مورد شرط نیز میشه

SELECT ROW_NUMBER() OVER (order by id desc )
AS RowNumber ,[id] ,[title]
INTO #Results
FROM [user]
where title=@hfcat



درواقع این متغیر شما به عنوان یک مقدار در جلوی یک فیلد قرار میگیره و میگیم که چیزهایی رو برای ما نمایش بده که مثلا فیلد Title ما برابر مقدار متغیر ما باشه.

سلام
ممنون از توضیحاتتون :لبخندساده:
ولی من میخوام کل title=@hfcat رو با یک پارامتر پاس بدم ، چون ممکنه اصلا نخوام این شرط برقرار بشه و فقط گاهی این شرط باشه...

حمیدرضاصادقیان
چهارشنبه 12 آذر 1393, 07:58 صبح
خوب اینطوری بنویسید

where @hfcat is null or title=hfcat