PDA

View Full Version : سوال: چطور خروجی یک پروسیجر به int تبدیل کنم؟



abyar_fm
شنبه 04 شهریور 1391, 10:30 صبح
سلام دوستان!:لبخندساده:
در LINQ یک پروسیجر دارم که خروجی که داره از نوع int هست.یعنی یک فیلد از نوع int رو برام باید برگردونه،اما وقتی تو برنامه فراخوانیش میکنم و میریزمش تو یه متغیر از نوع Int اشکال میگیره!تبدیلش هم نمیکنه!:گریه:
اصلا جنس خروجی پروسیجرها در محیط linq چیه؟ همون پروسیجر رو در حالت معمولی به روش (ADO) ازش خروجی گرفتم اما اینجا مشکل دارم.

navid_8x
یک شنبه 05 شهریور 1391, 18:43 عصر
میشه کد رو بزارین تا ببینیم؟

Amirpooyan
یک شنبه 05 شهریور 1391, 23:32 عصر
خب اون Stored Procedure که شما داری چطوری مقدار int رو بر میگردونه؟ یا حداقل کد Stored Procedure رو میذاشتی، تا سریع و کوتاه جوابت رو میگرفتی.
من چند حالت برای دریافت مقدار از Stored Procedure مثال میزنم، بعد میگم چرا شما احتمالا به مشکل بر خوردید.

حالت اول: استفاده از Output Parameter

CREATE PROCEDURE [dbo].[GetServerDateTime]
@OutVal DateTime OUTPUT
AS
BEGIN
SELECT @OutVal = GetDate()
END

برای این حالت باید شما کدی شبیه به این بنویسید:

using (DBDataContext db = new DBDataContext())
{
DateTime? dt = null;

var q = db.GetServerDateTime(ref dt);
Console.WriteLine(dt);
}

نکته قابل تذکر اینکه پارامتر ارسالی (در این مثال dt)، حتما باید از نوع Nullable و با مقدار اولیه باشه.

Amirpooyan
یک شنبه 05 شهریور 1391, 23:40 عصر
حالت دوم: استفاده از Return (فقط قابل استفاده برای مقادیر صحیح یا Integers)

CREATE PROCEDURE [dbo].[GetEmployeeCount]
AS
BEGIN
DECLARE @Ret INT
SELECT @Ret = COUNT(*) FROM Employee
RETURN @Ret
END

برای این حالت باید کدی شبیه به این بنویسید:

using (DBDataContext db = new DBDataContext())
{
//return int
var q = db.GetEmployeeCount();
Console.WriteLine(q);
}

Amirpooyan
یک شنبه 05 شهریور 1391, 23:54 عصر
و اما حدس من از مشکل شما، شما نمی تونید بیان یه همچین کدی تو Stored Procedure تون بنویسید:

SELECT COUNT(*) FROM Employee

و بعدش بخواهید به سادگی مقدار دریافتی رو تو یه متغیر ذخیره کنید! :چشمک: بخاطر اینکه در LINQ to SQL یک Stored Procedure میتونه خروجی ISingleResult<T> یا IMultipleResults<T> داشته باشه! افتاد الان؟

Amirpooyan
دوشنبه 06 شهریور 1391, 00:00 صبح
البته بجز روش های بالا از یک روش دیگه برای دریافت مقادیر Scalar استفاده کرد، که گفتم بد نیست اشاره کنم که شاید خالی از فایده نباشه.

روش سوم: استفاده از توابع Scalar Values:

CREATE FUNCTION [dbo].[GetEmployeeCount_fn]()
RETURNS int
AS
BEGIN
DECLARE @ResultVar int
SELECT @ResultVar = Count(*) FROM Employee
RETURN @ResultVar
END

و اینم کد مربوطه اش:

using (DBDataContext db = new DBDataContext())
{
var q = db.GetEmployeeCount_fn();
Console.WriteLine(q);
}

abyar_fm
سه شنبه 07 شهریور 1391, 00:17 صبح
درود بر شما!
ممنونم از پاسختون .اما منظور من این کد مقابل هست که به این صورته:
که پروسیجر رودر SQL به این شکل نوشتم: id_bime نوع int در جدول تعریف شده است.


create proc Stp_Select_IdBime
@name_bime nvarchar(50)
as
select id_bime from bime where Name_b=@name_bime


DataClasses1DataContext db=new DataClasses1DataContext ()
int id_bime=db.Stp_Select_IdBime(Cmb_Bime.text);


پیغام خطا :
Unable to Cast Object of type 'singleResult'1

البته این فقط یه مثال از حالت استفاد من بود که نوع فیلدها وشکل STP مشابه این مثال میباشد.
در ضمن من LINQ مقداری آماتور هستم. برای پروژه پایانی دانشگاهم دارم استفاده میکنم.مرسی بازم پاسخ بنده رو بفرمایین.
سپاس

Amirpooyan
سه شنبه 07 شهریور 1391, 01:32 صبح
خب شما همون اشتباهی رو کردید، که من در پست شماره پنج راجبش توضیح دادم، یه نگاهی بهش بندازید.

در صورتیکه فیلد id_bime شما از انواع صحیح یا Integers باشه، شما می تونید از هر سه حالتی که توی این تاپیک شرح دادم استفاده کنید. مثلاً:
CREATE PROCEDURE [dbo].[Stp_Select_IdBime]
@name_bime nvarchar(50)
AS
BEGIN
DECLARE @Ret INT
SELECT @Ret = [id_bime] FROM [bime] WHERE [Name_b] = @name_bime
RETURN @Ret
END

و کد #C شما روی Stored Procedure ی که در بالا نوشتم جواب میده.

در ضمن چند تا نکته بگم که به سوال شما ربط نداره، اما ممکنه کمکتون بکنه:

1- شما بدون این Stored Procedure و با یک Query LINQ to SQL به مقدار مورد نظرتون یعنی id_bime دسترسی داشته باشید:

DataClasses1DataContext db = new DataClasses1DataContext();
var q = db.bime.where(b => b.Name_b == Cmb_Bime.text).First().id_bime;


2- اگه حدسم درست باشه، کنترل Cmb_Bime باید کنترل ComboBox باشه، اگه شما DataSource رو توسط LINQ to SQL اینطوری پر کنی:

DataClasses1DataContext db = new DataClasses1DataContext();
Cmb_Bime.DataSource = db.bime;
Cmb_Bime.DisplayMember = "name_bime";
Cmb_Bime.ValueMember = "id_bime";

هر وقت به مقدار id_bime نیاز داشتی کافیه:
int id_bime = (int)Cmb_Bime.SelectedValue;

و دیگه نیازی به به Stored Procedure و یا Query اضافی برای id_bime نداری.

tooraj_azizi_1035
چهارشنبه 08 شهریور 1391, 13:15 عصر
برگرداندن مقدار از یک SP:
http://www.farsimsdn.somee.com/Default.aspx?id=131

abyar_fm
شنبه 11 شهریور 1391, 19:04 عصر
اگه بخوام به جای یه مقدار صحیح مقدار از نوع دیگه مثلاfloate یا double برگردونم باید stp چه جوری بنویسم؟

abyar_fm
یک شنبه 12 شهریور 1391, 17:31 عصر
واقعا مرسی اگه کسی جواب سوال دوم منو بده، به پاسخش خیلی احتیاج دارم.:خجالت:از پاسخ های قبلی دوستان واقعا کمال استفاده رو بردم.
خواهش میکنم لطفا بجوابه یه نفر؟!!

abyar_fm
یک شنبه 12 شهریور 1391, 17:40 عصر
مرسی اگر یکی جواب سوال دوم منو هم بده ،الان به پاسخش خیلی احتیاج دارم .گفتم دارم پروژه پایانی انجام میدم.واقعا از پاسخ های قبلی دوستان کمال استفاده رو بردم خواهش میکنم این رو هم یکی بجوابه.
متشکرم.

abyar_fm
شنبه 18 شهریور 1391, 22:21 عصر
واقعا مرسی اگه کسی جواب سوال دوم منو بده، به پاسخش خیلی احتیاج دارم.:خجالت:از پاسخ های قبلی دوستان واقعا کمال استفاده رو بردم.
خواهش میکنم لطفا بجوابه یه نفر؟!!
چرا اینجا هیچ کس جواب نمیده.لطفا یه نگاه بندازید به سوالم.حداقل بگید نمیدونید.
ممنونم ازتون.لطف میکنید بجوابید.

hossein_BMI
پنج شنبه 23 شهریور 1391, 19:34 عصر
نمی دونم:ناراحت:

واقعا نمیدونم.
اما من هم همین مشکل شما را دارم. اگه خودتون به جواب رسیدید لطفا برای استفاده بنده اعلام کنید.