execute后的事务计数指示缺少了commit或rollback transaction

kkao0001 2010-11-10 04:32:35
发些前台代码 SqlConnection con = baseoperate.getcon();
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
SqlCommand sqlcom = new SqlCommand("GoodsOutput", con);
sqlcom.Transaction = tran;
sqlcom.CommandType = CommandType.StoredProcedure;
sqlcom.Parameters.AddWithValue("@出仓单号", MOdanhao.Text);
sqlcom.Parameters.AddWithValue("@出仓日期", MOdate.Value);
sqlcom.Parameters.AddWithValue("@操作人员代码", MOperson.Text);
sqlcom.Parameters.AddWithValue("@物料代码", Convert.ToString(row.Cells[0].Value));
sqlcom.Parameters.AddWithValue("@数量", Convert.ToInt32(row.Cells[1].Value));
sqlcom.Parameters.AddWithValue("@备注", MOremark.Text);
sqlcom.Parameters.Add(new SqlParameter("@return",SqlDbType.Int));
sqlcom.Parameters["@return"].Direction=ParameterDirection.ReturnValue;
sqlcom.ExecuteNonQuery();
if (int.Parse(sqlcom.Parameters["@return"].Value.ToString())==0)
{
tran.Rollback();
MessageBox.Show("数量不足");
return;
}
sqlcom.Dispose();





GoodsOutput存储过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GoodsOutput] @出仓单号 nchar(20),@出仓日期 datetime,@操作人员代码 nchar(10),
@物料代码 nchar(16),@数量 int,@备注 nchar(20)
AS
begin transaction
declare @序号 int,@number int
if not exists(select * from Output)
set @序号=1
else
set @序号=(select max(序号) from Output)+1
set @number=(select 库存量 from material where 物料代码=@物料代码)-@数量
if @number<0
begin
rollback
return 0
end
else
begin
insert into Output values(@序号,@出仓单号,@出仓日期,@操作人员代码,@备注,@物料代码,@数量)
update material set 库存量=库存量-@数量 where 物料代码=@物料代码
commit
return 1
end

}



把存储过程的事务去掉就不会出错,添加上去就出错。 求个解决方法 (不能取消事务)
...全文
173 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkao0001 2010-11-10
  • 打赏
  • 举报
回复
谢谢了 我先想一下
wdzr_826 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cdglynn 的回复:]

要不在存储过程里控制事务,要不在应用程序里控制事务,事务不能嵌套吧。
[/Quote]
正解,你那样写会有问题,而且不便于维护,不便于理清事务逻辑。
特别 2010-11-10
  • 打赏
  • 举报
回复
楼主可能要使用事务保存点,要不然rollback或者commit会回滚所有事务或者提交所有事务(这一点我不确定)
所以会出现这个问题
主要是事务嵌套引起的

解决方法:
1.如楼上所说,不要在存储过程等地方使用事务,而在调用的地方使用事务,
2.参考http://topic.csdn.net/t/20020411/16/638961.html
cdglynn 2010-11-10
  • 打赏
  • 举报
回复
要不在存储过程里控制事务,要不在应用程序里控制事务,事务不能嵌套吧。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧