PDA

View Full Version : خروجی SP به عنوان یک عدد و ذخیره آن در متغییر



M.kavyani
جمعه 11 آذر 1384, 22:04 عصر
با سلام خدمت دوستان
من میخواهم با ستفاده از قبل از انجام ثبت اطلاعت ببینم که این شخص قبلا" ثبت نام کرده است یا نه؟ به این منظور من از SP استفاده کردم که اگر اطلاعات رو پیدا کرد عدد 1 رو بر میگردونه و اگر اطلاعاتی رو پیدا نکرد عدد صفر رو بر میگردونه. راستش نمی دونم چه جوری این صفر و یک را داخل یک متغییر از نوع Int یا Bolean بریزم؟! در مجموع کدی رو که برای برگدوندن یک عدد از DB بعد از اجرای SP بدونم.
من از کد زیر در SP استفاده کردم:



CREATE PROCEDURE ReturnTest
@Name Nvarchar(50),
@LastName nvarchar(50)
AS
SELECT * From MEM Where (Name=@Name) And( LastName=@LastName)
Select Case(Select Count(*) From MEM ) When 0 Then 0 Else 1 End
GO
و در VB.Net هم از کد زیر:


Dim r as integer
r = objcommand.ExecuteNonQuery

از دستور زیر هم استفاده کردم


[
LTR]r = CInt(objcommand.ExecuteScalar)[/LTR]
در پناه حق موفق باشید.

asilverisis
شنبه 12 آذر 1384, 01:14 صبح
سلام

شما باید اول SP رو توی SQL Analyzer تست بکنی ببین جواب میده یا نه
من که SP شما رو تست کردم جواب نداد چون دو مجموعه جواب برمی گردونه نه یک مقدار خاص
دوما چه پیدا بشه چه نشه 1 بر میگردونه

من فکر میکنم از SP زیر استفاده کنی بهتر باشه

یه تستی کنی بد نیست



CREATE PROCEDURE Search (@CusId nchar (5) ) AS

Declare @Found bit

IF (Select Count ( * ) From Customers Where CustomerID = @CusId) > 0

SET @Found =1

ELSE

SET @Found=0

Select @Found as Founded
GO

M.kavyani
یک شنبه 13 آذر 1384, 23:32 عصر
با سلام خدمت دوست عزیز
شما درست میگید. نمیدونم چرا اینطور شده شاید دستور رو اشتباه تایپ کردم. ولی SP شما درست کار مینه. ولی مشکل من همچنان به قوت خود باقیست. مشکل اصلی من اینه که میخوام اون 0 یا 1 رو توی یه متغییر ذخیره کنم؟ نه توی یه گرید!

Hamedm
دوشنبه 14 آذر 1384, 10:10 صبح
سلام

من میخواهم با ستفاده از قبل از انجام ثبت اطلاعت ببینم که این شخص قبلا" ثبت نام کرده است یا نه؟ به این منظور من از SP استفاده کردم که اگر اطلاعات رو پیدا کرد عدد 1 رو بر میگردونه و اگر اطلاعاتی رو پیدا نکرد عدد صفر رو بر میگردونه.
برای این کار باید از یک FUNCTION استفاده کنی نه SP. البته استفاده از SP هم غلط نیست ولی بنظر من استفاده از FUNCTION معقول تره.

در پناه حق موفق باشید و پرتوان

asilverisis
دوشنبه 14 آذر 1384, 11:35 صبح
سلام
بله آقا حامد درست می گن من هم اول خواستم همین رو بگم ولی وقتی دیدم خودت با SP کار کردی
گفتم همون روش رو ادامه بدم
حالا برای اینکه این مقدار رو بخونی
این SP دقیقا یک Select بر میگردونه یعنی مثل یک جدول تک فیلدی
حالا اون رو توی یه Datatable لود کن توسط Dataadapter بعد مقدار فیلد 0 رو بخون




Datatable1.Rows(0)(0)

M.kavyani
دوشنبه 14 آذر 1384, 12:00 عصر
با سلام خدمت آقا حامد و دیگر دوست عزیز
دوست عزیز از بایت پاسختون ممنون. ولی چون هردو براین تاکید دارید که استفاده از Function بهتره پس
ممنون میشم در همین مورد اگر یه مثال کوچیک بزنید. البته اگر امکان داره!( استفاده از Function)
منتظر پاسختون هستم.

M.kavyani
دوشنبه 14 آذر 1384, 22:27 عصر
یک اشکال در فرستادن جواب پیش اومد و اینکه نوشته نشده که بحث جدید ارسال شده و من برای رفع این اشکال این متن را نوشتم و سند کردم.
شرمنده

habedijoo
سه شنبه 15 آذر 1384, 09:42 صبح
سلام به همگی

دوست عزیز به نکات زیر دقت کن مشکلت حل میشه .
1- اولا که همان SP بهترین راه برای این کار است . بهتره به جای پاک کردن صورت مسئله دنبال جواب بگردی .
2- وقتی می خواهی که روال ذخیره شده (SP) یک مقداری برگردونه باید یک پارامتر خروجی براش تعریف کنی .
3 - در نهایت اینکه ExecuteNonQuery تعدا سطرهای تحت تاثیر قرار گرفته را بر می گرداند .

در زیر یه نمونه روال ذخیره شده می نویسم . توی برنامه فقط کافیه اونو صدا بزنی

[code]
CREATE PROCEDURE Sample1
@check int = null output
AS
set @check = (select count(*) from customers)
-- select * from customers
select @check
[code/]

توی برنامه ات هم از ExecuteScalar باید استفاده کنی .

اگر باز هم مشکلی بود ما در خدمتیم .

M.kavyani
سه شنبه 15 آذر 1384, 12:53 عصر
با سلام خدمت دوست عزیز
ممنون. :تشویق:
دوست عزیز من نخواستم صورت مساله را پاک کنم فقط اینکه مونده بودم چه جوری اینکار رو انجام و وقتی دو دوست در این تاپیک میگن که استفاده از Function بهتر و معقول تره ادم ترجیح میده که از Function استفاده کنه. در مجموع از بابات پاسخ زیبا و کاملتون ممنون. برم تستش کنم ببینم جواب میده یا نه.
در پناه حق موفق و کامروا باشید