C#执行SQL语句的困惑,各位给说说!

Water Lee 2019-07-06 10:45:02
下面这段SQL是用来修改[StockCheck_Area]表中 [AreaApplied]字段的值,原意是先查询要修改值是这个值是不是 1,如果是就返回字符串‘HaveAppled’,如果不是就进行修改,然后返回‘true’。
在发现问题前,我看了很多便逻辑,没发现问题,但在C#中使用c#提供的事务执行时,每次返回的都是‘HaveAppled’,而奇怪的是返回‘HaveAppled’不应该执行的 UPDATE语句却执行了。多次断点查看传参也没有问题,直接将代码复制到SQL查询分析器执行也没有问题,都能返回预期的值,但通过C#事务执行就不行。
再后来,我在SQL语句前面加了 begion tran ,后面加了commit tran。然后在C#中执行时不使用事务,结果,靠,结果就可以了。
没明白是什么原因,有那位可以解释一下,至少下次能避免,就这么一个问题,我搞了一早上,时间成本太高了.
declare @applied bit
set @applied=(
Select AreaApplied
from StockCheck_Area with(updlock)
where StockCheckID=@StockCheckID
and GoodsAreaID=@GoodsAreaID)

if (@applied=0)
begin
UPDATE [StockCheck_Area]
SET [AreaApplied] = 1
WHERE [StockCheckID] = @StockCheckID
and [GoodsAreaID] = @GoodsAreaID

Select 'true'
end
else
begin
Select 'HaveAppled'
end
----上面在C#中以事务方式执行不能返回预期结果
begin tran
declare @applied bit
set @applied=(
Select AreaApplied
from StockCheck_Area with(updlock)
where StockCheckID=@StockCheckID
and GoodsAreaID=@GoodsAreaID)

if (@applied=0)
begin
UPDATE [StockCheck_Area]
SET [AreaApplied] = 1
WHERE [StockCheckID] = @StockCheckID
and [GoodsAreaID] = @GoodsAreaID

Select 'true'
end
else
begin
Select 'HaveAppled'
end
commit tran
--在C#中不使用事务,直接执行以上加了 tran的代码却能返回预期结果
...全文
185 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Water Lee 2019-07-07
  • 打赏
  • 举报
回复
不是代码的问题,是调用时的逻辑有问题,导致代码执行了两遍,应该算是组件之间的藕合问题吧。
吉普赛的歌 2019-07-06
  • 打赏
  • 举报
回复
对于疑难杂症, 最好的办法是直接开一个跟踪( sqlprofiler ), 跟踪实际执行的 sql 。 跟踪到了, 直接把相关的sql 和 参数拿到数据库那边去执行, 这样就非常清楚了。
  • 打赏
  • 举报
回复
能把原因发出来吗
Water Lee 2019-07-06
  • 打赏
  • 举报
回复
好吧,没人回答的还无法结贴,只好挂着了。
Water Lee 2019-07-06
  • 打赏
  • 举报
回复
已找到问题原因,和这段代码没有直接关系,也没有答,做无满意结果结了。

110,538

社区成员

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

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

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