PDA

View Full Version : پروسیجری با خروجی رکورد



yavari
یک شنبه 09 مهر 1385, 14:34 عصر
سلام

میخوام پروسیجری بنویسم که رکوردای یه محدوده رو خروجی بده ضمن اینکه تعداد کل رکوردهای یافته شده رو هم داشته باشم! میشه همچین کاری کرد ؟ :متفکر:
اینم چند نمونه ای که نوشتم اما متاسفانه هیچکدوم جوابی رو که میخوام نمیده ! :گریه:
ممنون میشم راهنمائیم کنید !


CREATE PROCEDURE dbo.procGetPagedAllUseres
(
@CurrentPage int,
@PageSize int,
@TotalRecords int output
)
AS

SET NOCOUNT ON

--Create variable to identify the first and last record that should be selected
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)
--Select one page of data based on the record numbers above
SELECT *
FROM
Useres
WHERE
Radif > @FirstRec
AND
Radif < @LastRec
--Return the total number of records available as an output parameter
SELECT @TotalRecords = COUNT(*) FROM Useres
GO




CREATE PROCEDURE dbo.procGetPagedAllUseres
(
@CurrentPage int,
@PageSize int,
@TotalRecords int output
)
AS

SET NOCOUNT ON

--Create a temp table to hold the current page of data
--Add an ID column to count the records
CREATE TABLE #TempTable
(
ID int IDENTITY PRIMARY KEY,
Radif int
)
--Fill the temp table with the News data
INSERT INTO #TempTable
(
Radif
)
SELECT Radif
FROM Useres

--Create variable to identify the first and last record that should be selected
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)
--Select one page of data based on the record numbers above
SELECT *
FROM
#TempTable
WHERE
Radif > @FirstRec
AND
Radif < @LastRec
--Return the total number of records available as an output parameter
SELECT @TotalRecords = COUNT(*) FROM #TempTable
GO

Farhad.B.S
یک شنبه 09 مهر 1385, 18:33 عصر
فکر نمیکنم مشکلی داشته باشه، فقط برای بازگردوندن تعداد رکورد ها از یک متغیر استفاده کردی و اون رو به خروجی نفرستادی...
در واقع این :


SELECT @TotalRecords = COUNT(*) FROM #TempTable

باید به این :


SELECT COUNT(*) AS TotalRecords FROM #TempTable

تغییر پیدا کنه.
بدین صورت دو resultset به خروجی فرستاده میشه که توسط ADO به طور مجزا قابل استفاده هستش.

Kamyar.Kimiyabeigi
دوشنبه 10 مهر 1385, 08:32 صبح
برای برگردوندن تعداد رکوردهای select شده خود sql یک متغیر داره که می تونین از اون بعد از select استفاده کنین


SELECT @@ROWCOUNT

yavari
دوشنبه 10 مهر 1385, 21:13 عصر
سلام
ضمن عرض تشکر از آقا فرهاد و آقا کامیار !
اما مشکل من حل نشد ،:خجالت: روش شما روهم امتحان کردم اما چیزی که هست اینه که روش کار من بدون پروسیجر ، روالی هست که کدشو پائین گذاشتم
اما یه جورائی خیلی دلم میخواد کاری که این روال برام انجام میده رو از پروسیجر بخونم
در ضمن ، مشکل پروسیجرائی که تو پست 1 گذاشتم اینه که کلیه رکودای تیبلمو بهم نشون میده !:گریه:
ممنون میشم راهنمائیم کنید !
با تشکر

Private Function GetPagedAllNews(ByVal CurrentPage As Integer, ByVal PageSize As Integer, ByVal TotalRecords As Integer) As DataSet
Dim ds As DataSet = New DataSet
Dim FirstRec As Byte = (CurrentPage - 1) * PageSize
Dim LastRec As Byte = (CurrentPage * PageSize + 1)
strselect = "SELECT * FROM USERES WHERE Radif>" & FirstRec & "AND Radif<" & LastRec
Dim dad As SqlDataAdapter = New SqlDataAdapter(strselect, Cnn)
dad.Fill(ds)
Dim sqlCO As String = "SELECT count(*) FROM Useres"
Dim ole As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Useres ", Cnn)
Cnn.Open()
Dim CmdSelect As SqlCommand = New SqlCommand(sqlCO, Cnn)
pnPageNavigate.TotalRecords = CmdSelect.ExecuteScalar
Return ds
End Function

Kamyar.Kimiyabeigi
سه شنبه 11 مهر 1385, 07:52 صبح
CREATE PROCEDURE test @prm_out INT OUTPUT
AS
SELECT * FROM users WHERE field1 BETWEEN 1 AND 2
SELECT @prm_out = @@ROWCOUNT

yavari
سه شنبه 11 مهر 1385, 15:34 عصر
CREATE PROCEDURE test @prm_out INT OUTPUT
AS
SELECT * FROM users WHERE field1 BETWEEN 1 AND 2
SELECT @prm_out = @@ROWCOUNT



سلام

CREATE PROCEDURE Kamyar @CurrentPage int,
@PageSize int,@TotalRecords INT OUTPUT
AS
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)
SELECT * FROM Useres WHERE Radif BETWEEN @FirstRec AND @LastRec
SELECT @TotalRecords = @@ROWCOUNT

نه ، جواب نمیده ! :گریه: :گریه: :گریه:
متاسفانه نمی دونم چرا هیچوقت TotalRecords من از صفر تجاوز نمیکنه !!! برا همینه که بجای محدود کردن رکوردا همشونو نشون میده !!!
به نظر شما کجای کارم میلنگه ؟ :متفکر:

whitehat
سه شنبه 11 مهر 1385, 15:48 عصر
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)
دو خط بالا را به


Set @FirstRec=(@CurrentPage - 1) * @PageSize
Set @LastRec=(@CurrentPage * @PageSize + 1

تغییر دهید

titbasoft
سه شنبه 11 مهر 1385, 19:20 عصر
من فرصت نکردم کامل تاپیک رو بخونم اما قبل از خوندن پارامترهای output و return حتما باید datareader رو ببندید در غیر این صورت مقدار صفر برگردونده میشه.

yavari
پنج شنبه 13 مهر 1385, 13:03 عصر
سلام

ممنونم از کلیه دوستان خصوصا titbasoft و آقا کامیار
بالاخره مشکلم حل شد !

بازم ممنون

yavari
جمعه 14 مهر 1385, 06:52 صبح
سلام دوستان

شرمنده ، فراموش کردم تاپیک رو به نتیجه برسونم !


CREATE PROCEDURE dbo.procGetPagedAllUseres
@CurrentPage int,
@PageSize int,@TotalRecords INT OUTPUT
AS
DECLARE @FirstRec int, @LastRec int
Set @FirstRec = (@CurrentPage - 1) * @PageSize
Set @LastRec = (@CurrentPage * @PageSize + 1)
SELECT * FROM Useres WHERE Radif BETWEEN @FirstRec AND @LastRec
--SELECT @TotalRecords = @@ROWCOUNT
SELECT @TotalRecords = COUNT(*) FROM Useres
GO

Private Function GetPagedAllUseres(ByVal CurrentPage As Integer, ByVal PageSize As Integer, ByVal TotalRecords As Integer) As DataSet
Dim ds As DataSet = New DataSet
' Create Instance of Connection and Command Object
Dim myCommand As SqlCommand = New SqlCommand("procGetPagedAllUseres", myConnection)
' Mark the Command as a SPROC
myCommand.CommandType = CommandType.StoredProcedure
myCommand.Parameters.Add("@CurrentPage", CurrentPage)
myCommand.Parameters.Add("@PageSize", PageSize)
myCommand.Parameters.Add(New SqlParameter("@TotalRecords", SqlDbType.Int))
myCommand.Parameters("@TotalRecords").Direction = ParameterDirection.Output
'Create a new SqlDataAdapter object for the Doctor table
Dim da As SqlDataAdapter = New SqlDataAdapter(myCommand)
' Populate the ds with the data
da.Fill(ds)
Cnn.Close()
pnPageNavigate.TotalRecords = Convert.ToInt32(myCommand.Parameters("@TotalRecords").Value)
Return ds
End Function

بازم ممنون
موفق باشید