【发布时间】:2015-05-04 18:29:17
【问题描述】:
我有一个存储过程,我将在其中根据条件选择一些行,并且我需要在同一个存储过程中更新这些行的状态。 例如
Create Procedure [dbo].[myProcedure]
As
BEGIN
BEGIN TRAN T1
SET NOCOUNT ON
SELECT TOP 5 * INTO #TempTable FROM myTable WHERE ENABLED = 1;
UPDATE myTable SET [Status] = 'Locked' From myTable Inner Join on #TempTable myTable.id = #TempTable.id;
SELECT * FROM #TempTable;
DROP Table #TempTable;
COMMIT TRAN T1
END
当我在 SQL 中调试时,存储过程工作正常。我正在像这样通过 C# 访问 StoredProcedure。
private ProcessData[] ReadFromDb(string StoredProcedure, SqlConnection Connection)
{
List<ProcessData> Data = new List<ProcessData>();
SqlCommand Command = new SqlCommand(StoredProcedure, Connection);
Command.CommandType = System.Data.CommandType.StoredProcedure;
try
{
Command.CommandTimeout = CONNECTION_TIMEOUT;
using (SqlDataReader Reader = Command.ExecuteReader())
{
while (Reader.Read())
{
Data.Add(new ProcessData()
{
Id = Reader["Id"];
...
});
}
}
}
catch (Exception ex)
{}
}
问题是我在 C# 中获取了所需的行,但存储过程中的更新查询不起作用。 谁能给我一些建议我哪里出错了。
【问题讨论】:
-
是"From myTable Inner Join myTable.id = #TempTable.id;"你的真实代码
-
您忽略了
catch (Exception ex){}中的异常。如果COMMIT TRAN T1因任何原因失败,您将获得这些行,但更新将被回滚。我怀疑这是正在发生的事情。 -
我正在处理实际代码中的异常,但我没有收到任何异常。在代码中,我得到了选定的行。更新查询不更新值。如果我在 SQL 更新查询中调试存储过程工作正常
标签: c# .net sql-server stored-procedures system.data