PDA

View Full Version : حرفه ای: گرفتن یک مقدار بازگشتی از پروسیجر در برنامه



soha_smb
چهارشنبه 27 فروردین 1393, 09:46 صبح
با سلام
من یه پروسیجر برای inseart دارم به این شکل

ALTER PROCEDURE [dbo].[Topic]
@Subject nvarchar(150),
@Msg nvarchar(200),
@Status bit =null,
@AddedBy int,
@ID int
as
BEGIN
INSERT INTO Topic
(Subject,Msg,AddedBy )
VALUES (@Subject,@Msg,@AddedBy)
return SCOPE_IDENTITY()
END

حالا تو برنامه میام و واسه inseart از همین پروسیجر استفاده می کنم (البته برنامه 3لایه است)
تااینجا هیچ مشکلی نیست
حالا می خوام که بعد از درج رکود مقدار IDENTITY که تو پروسیجر هست رو بدست بیارم
اینجاشو به مشکل برخوردم که تو برنامه چطوری اونو بگیرم

mRizvandi
چهارشنبه 27 فروردین 1393, 13:28 عصر
در برنامه نویس سه لایه پیشنهاد این هست که بعد از اجرای اس پی مربوط به Insert خود همون رکورد رو Select کنید و برگردونید. یعنی به جای اینکه یک داده برگردونید کل رکورد رو برگردونید.
در هر صورت شما می تونید مقدار برگشتی رو از اجرای اس پی داشته باشید.
مقدار برگشتی رو از خروجی adapter بگیرید.

alireza_s_84
چهارشنبه 27 فروردین 1393, 13:39 عصر
با سلام
من یه پروسیجر برای inseart دارم به این شکل

ALTER PROCEDURE [dbo].[Topic]
@Subject nvarchar(150),
@Msg nvarchar(200),
@Status bit =null,
@AddedBy int,
@ID int
as
BEGIN
INSERT INTO Topic
(Subject,Msg,AddedBy )
VALUES (@Subject,@Msg,@AddedBy)
return SCOPE_IDENTITY()
END

حالا تو برنامه میام و واسه inseart از همین پروسیجر استفاده می کنم (البته برنامه 3لایه است)
تااینجا هیچ مشکلی نیست
حالا می خوام که بعد از درج رکود مقدار IDENTITY که تو پروسیجر هست رو بدست بیارم
اینجاشو به مشکل برخوردم که تو برنامه چطوری اونو بگیرم

کلا هنگام استفاده از SP ما با دو نوع پارامتر سر و کار داریم. یکی پارامترهای خروجی و دیگری پارامترهای ورودی.
SqlServer مقادیر برگشتی یک SP رو توی پارامتر خروجی بنام @RETURN_VALUE قرار میده که شما میتونید هنگام تعریف SqlCommand یک پارامتر خروجی با این نام تعریف کنید و بعد از عملیات با خوندن مقدار این پارامتر Id رکورد جدید رو بدست بیارین. برای مثال من از تابع زیر برای Insert استفاده میکنم و با فراخونی این تابع اگر عملیات موفقیت آمیز باشه نتیجه برگشتی به من Id رکرود جدید و در صورت شکست عملیات مقدار 1- برگشت داده میشه:
private static int RunCommand(SqlCommand cmd) {
using (SqlConnection Cnn = InitConnection())
{
try
{
Cnn.Open();
cmd.Connection = Cnn;
SqlParameter returnValue = new SqlParameter("@RETURN_VALUE", -1);
returnValue.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(returnValue);
cmd.ExecuteNonQuery();
return (int)returnValue.Value;
}
catch (Exception ex)
{
Log.WriteError(MethodInfo.GetCurrentMethod(), ex.Message);
return -1;
}
}
}