数据无法保存在MSSQL中

问题描述 投票:1回答:1

我有一个.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,到目前为止一切正常。

c# sql-server asp.net-web-api
1个回答
1
投票

即使插入操作不成功,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;

如果是我:

  • 我会检查SQL事件探查器,该命令实际到达SQL服务器。
  • 我会跟踪/记录ExecuteNonQuery的结果,并尝试将其与其他活动相关联。如果是时间问题......
  • 当您说调试时,您的意思是所有托管调试助手都已激活?

更新如果以后删除交易不满意,我注意到初始代码的另一个问题。如果删除它有效,我现在怀疑实际问题是由于在Execute方法调用中覆盖了对象引用而导致事务处于挂起状态:

_Transaction = conn.BeginTransaction("SQL_Execution");

如果有2个或更多线程竞争这个,则确保了麻烦。

为什么不在方法本身中声明Transaction:

var _Transaction = conn.BeginTransaction("SQL_Execution");
© www.soinside.com 2019 - 2024. All rights reserved.