我有一个.NET Web API(C#),我可以在那里获取和发布数据(显然)。当我发出GET请求时,它返回它应该的所有数据。如果sql命令有效,我已经使我的方法/函数返回bool。因此,当我发出PUT或POST请求时,它返回true(这意味着它有效)。
然后,如果我发出GET请求或者我在SQL Management Studio中全部选择SELECT,则数据尚未保存。但删除工作。
这确实有效,但突然停了下来。
这是我的添加/ POST方法:
public bool Add(string id, byte[] bytes)
{
SqlCommand Command = new SqlCommand("INSERT INTO [ag_Images] ([Id], [Data]) VALUES (@Id, @Data)");
Command.Parameters.AddWithValue("@Id", id);
Command.Parameters.AddWithValue("@Data", bytes);
return _Sql.Execute(Command);
}
它将SqlCommand传递给:
SqlTransaction _Transaction;
public bool Execute(SqlCommand Command)
{
SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["AptestDB"].ConnectionString);
using (conn)
{
try
{
conn.Open();
_Transaction = conn.BeginTransaction("SQL_Execution");
Command.CommandType = CommandType.Text;
Command.Connection = conn;
Command.Transaction = _Transaction;
try
{
Command.ExecuteNonQuery();
_Transaction.Commit();
return true;
}
catch
{
_Transaction.Rollback();
return false;
}
}
catch
{
return false;
}
}
}
以上不起作用。但是,这样做(SQL Management Studio)
DECLARE @Id VARCHAR(50)
DECLARE @Data VARBINARY(MAX)
SET @Id = '00000000-0000-0000-0000-000000000000'
SET @Data = CAST('' AS VARBINARY)
UPDATE [ag_Images] SET [Data] = @Data WHERE [Id] = @Id
UPDATE
我已经删除了SqlTransaction,到目前为止一切正常。
即使插入操作不成功,save方法也可以返回true - 在某些条件下(即触发器,约束),ExecuteNonQuery值可以为-1,这可能意味着(除非NOCOUNT打开,在这种情况下返回值始终为-1) )没有行影响/插入。
修改代码不再骗你了:
var rowsInserted = Command.ExecuteNonQuery();
if (rowsInserted > 0)
{
_Transaction.Commit();
return true;
}
else
{
_Transaction.Rollback();
return false;
}
要么
var rowsInserted = Command.ExecuteNonQuery();
_Transaction.Commit(); //with -1 result, no changes are done anyway
return rowsInserted > 0;
如果是我:
更新如果以后删除交易不满意,我注意到初始代码的另一个问题。如果删除它有效,我现在怀疑实际问题是由于在Execute方法调用中覆盖了对象引用而导致事务处于挂起状态:
_Transaction = conn.BeginTransaction("SQL_Execution");
如果有2个或更多线程竞争这个,则确保了麻烦。
为什么不在方法本身中声明Transaction:
var _Transaction = conn.BeginTransaction("SQL_Execution");