PDA

View Full Version : سوال: مشکل با فراخوانی یک sp که عملیات تراکنش را انجام میده



moferferi
پنج شنبه 25 تیر 1388, 19:15 عصر
سلام
من یک sp دارم یک باهاش عملیات تراکنش را انجام میدم.
وقتی که با یک کوئری در خود sql ازش استفاده میکنم مشکلی نداره و کار میکنه


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



--
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO

ALTER PROCEDURE [dbo].[myTransAction]
@newcustid nchar(5),
@newcompname nvarchar(40),
@oldcustid nchar(5)

as
declare @inserr int
declare @delerr int
declare @maxerr int
set @maxerr=0
begin transaction

--add a customer
insert into customers(customerid,companyname)
values(@newcustid,@newcompname)

--save error number returned from insert statment
set @inserr=@@error
if @inserr>@maxerr
set @maxerr=@inserr
--delete a customer
delete from customers where customerid=@oldcustid

--save error number returned from delete statment
set @delerr=@@error
if @delerr>@maxerr
set @maxerr=@delerr
--if an error occurred,roll back
if @maxerr<>0
begin
rollback
print 'transaction rolled back'
end
else
begin
commit
print 'tranaction committed'
end

print 'insert error number:'+cast(@inserr as nvarchar(8))
print 'delete error number:'+cast(@delerr as nvarchar(8))
return @maxerr






ولی وقتی اونا از طریق سی شارپ اجرا میکنم خطا میده.

AminSobati
پنج شنبه 25 تیر 1388, 20:01 عصر
سلام، پیغام خطا؟!

bahman_akbarzadeh
جمعه 26 تیر 1388, 00:08 صبح
شايد SP رو به عنوان يه آبجكت معتبر نشناسه.
چون تو #C مشكل داره و از خود SQL Server كار ميكنه.
پس شيوه فراخوني مورد داره.
البته شايد ...

moferferi
جمعه 26 تیر 1388, 22:14 عصر
سلام.
پیغام خطا
Object reference not set to an instance of an object.

من با این کد sp خودم را اجرا میکنم

conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
cmd.CommandText = "myTransAction3";

cmd.Parameters.AddWithValue("@newcustid", textBox1.Text);
cmd.Parameters.AddWithValue("@newcompname", textBox2.Text);
cmd.Parameters.AddWithValue("@oldcustid", textBox3.Text);
SqlParameter ouparm = cmd.Parameters.Add("@anzwer", SqlDbType.Int, 4);
ouparm.Direction = ParameterDirection.Output;
//MessageBox.Show(cmd.Parameters["@anzwer"].Value.ToString());
textBox4.Text=cmd.Parameters["@anzwer"].Value.ToString();

// cmd.ExecuteReader();
SqlDataReader rdr = cmd.ExecuteReader();
conn.Close();

اینم sq


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go





--
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO

alter PROCEDURE [dbo].[myTransAction3]
@newcustid nchar(5),
@newcompname nvarchar(40),
@oldcustid nchar(5),
@anzwer int=0 output

as
declare @inserr int
declare @delerr int
declare @maxerr int

set @maxerr=0
begin transaction

--add a customer
insert into customers(customerid,companyname)
values(@newcustid,@newcompname)

--save error number returned from insert statment
set @inserr=@@error
if @inserr>@maxerr
set @maxerr=@inserr

--delete a customer
delete from customers where customerid=@oldcustid

--save error number returned from delete statment
set @delerr=@@error
if @delerr>@maxerr
set @maxerr=@delerr

--if an error occurred,roll back
if @maxerr<>0
begin
rollback
end
else
begin
commit
end
set @anzwer=@maxerr






sp وقتی که خروجی نداشته باشه درست کار میکنه .ولی من میخوام که @anzwer که یک متغیر خروجیه را مقدارش را بعد از اجرای برنامه ببینم ولی این خطا را میده
حالا از نظر شما مشکل با sq یا کد سی شارپ؟

یه سوال دیگه هم دارم کلا عملیات تراکنش را در خود سی شارپ مدیریت کنم یا به همین شکلی که الان به کار میبرم بهتره؟

bahman_akbarzadeh
جمعه 26 تیر 1388, 23:21 عصر
روي كدوم خط در كدتون ارور ميده؟
اگه روي ExecuteReader باشه، اشكال از SP هست.
در ضمن، تراكنش در خود SP بهتر از #C هست.