PDA

View Full Version : فراخوانی و دریافت مقدار از stored procedure



saba106
یک شنبه 23 تیر 1392, 11:34 صبح
سلام
من procedure زیر رو نوشتم که داخل بانک insert میکنه و کلید اصلی رو برمیگردونه توی محیط sql درست برگردونده میشه

ALTER PROCEDURE [dbo].[InsertInvHdr]

@Type int, @Qty bigint, @Dest nvarchar(Max), @SanadNum bigint, @StartDate varchar(10), @Controller nvarchar(250),
@Tager nvarchar(250),@Packing nvarchar(250),@StartTime varchar(8),@NaylonNum int,@IsCompleted nvarchar(10),
@EndDate varchar(10),@EndTime varchar(8),@Status nvarchar(20)


AS
BEGIN
insert into table1 values (@Type,@Qty,@Dest,@SanadNum,@StartDate,@Controller ,@Tager,@Packing,@StartTime,@NaylonNum,@IsComplete d,@EndDate,@EndTime,@Status)


select SCOPE_IDENTITY() as id
END

ولی در زمان فراخوانی توی ویزوال وقتی دستور زیر رو میزنم مقدار درست رو برنمیگردونه

pkID = cmd.ExecuteNonQuery();

آیا کدی که استفاده کردم اشتباهه؟

veniz2008
یک شنبه 23 تیر 1392, 12:13 عصر
سلام.
sp شما درست هست ولی با ExecuteNonQuery نمیشه نتیجه یک select برگشتی رو دریافت کرد. چند تا راه دارید که سعی میکنم دو تا راه را بهتون پیشنهاد کنم.
1. سعی کنید زمانیکه قراره یک مقدار (نه یک رکورد) برگشت داده بشه از پارامترهای خروجی استفاده کنید. یعنی در همین کوئری که نوشتید یک پارامتر خروجی تعریف کنید و آخرین کلید رو داخلش بریزید و مقدار رو در سی شارپ دریافت کنید. به این شکل sp رو اصلاح کنید :

ALTER PROCEDURE [dbo].[InsertInvHdr]

@Type int, @Qty bigint, @Dest nvarchar(Max), @SanadNum bigint, @StartDate varchar(10), @Controller nvarchar(250),
@Tager nvarchar(250),@Packing nvarchar(250),@StartTime varchar(8),@NaylonNum int,@IsCompleted nvarchar(10),
@EndDate varchar(10),@EndTime varchar(8),@Status nvarchar(20),

-- define output parameter
@result int output

AS
BEGIN
insert into table1 values (@Type,@Qty,@Dest,@SanadNum,@StartDate,@Controller ,@Tager,@Packing,@StartTime,@NaylonNum,@IsComplete d,@EndDate,@EndTime,@Status)

select @result = SCOPE_IDENTITY() as id
END
در سمت سی شارپ، علاوه بر کدهایی که نوشتید و پارامترهای ورودی رو فرستادید، کافیه همین پارامتر result@ رو هم به شکل زیر و در ادامه پارامترهای ورودی تعریف کنید :

cmd.Parameters.Add("@result", SqlDbType.Int);
cmd.Parameters["@result"].Direction = ParameterDirection.Output;
بعد از اجرای کامند (بعد از ExecuteNonQuery) مقدار پارامتر خروجی رو بصورت زیر دریافت کنید :

int res = Convert.ToInt32(cmd.Parameters["@result"].Value);
برای اطمینان از دریافت مقدار صحیح میتونید اونو چاپ کنید :

MessageBox.Show(res.ToString());
راه دوم (که برای این مساله پیشنهاد نمیکنم) اینه که از پارامتر خروجی استفاده نشه یعنی همون sp ای که خودتون نوشتید، ولی در سمت سی شارپ، علاوه بر کدهایی که نوشتید، باید از یک SqlDataAdapter و DataTable استفاده کنید و نتیجه select برگشتی رو با این SqlDataAdapter بگیرید و داخل دیتاتیبل بریزید.
کافیه بعد از کدهای خودتون، این چند خط رو بنویسید :

DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(dt);
MessageBox.Show(dt.Rows[0][0].ToString());
پیشنهاد من همون راه اول هست چراکه بهینه تر هست و نیازی به استفاده از شی های SqlDataAdapter و شی DataTable (که از رم سیستم استفاده میکنه) نیست.
موفق باشید.