Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExecuteOnQuery更新不存储更改_C#_Sql Server_Executenonquery - Fatal编程技术网

C# ExecuteOnQuery更新不存储更改

C# ExecuteOnQuery更新不存储更改,c#,sql-server,executenonquery,C#,Sql Server,Executenonquery,我正在尝试使用ExecuteOnQuery()更新数据库中的一些字段 当尝试更新时,我没有收到任何错误或警告,它会返回一个受影响的行计数 问题是,我只能针对当前请求,查看更改。如果我重新加载页面或通过SMS,更改不会显示在数据库中 他有一点代码 string Sql = "UPDATE AccessUser SET [" + Field + "] = '" + Database.SqlEscapeInjection(Value) + "' WHERE AccessUserID = " +

我正在尝试使用ExecuteOnQuery()更新数据库中的一些字段

当尝试更新时,我没有收到任何错误或警告,它会返回一个受影响的行计数

问题是,我只能针对当前请求,查看更改。如果我重新加载页面或通过SMS,更改不会显示在数据库中

他有一点代码

    string Sql = "UPDATE AccessUser SET [" + Field + "] = '" + Database.SqlEscapeInjection(Value) + "' WHERE AccessUserID = " + User.ID;
    Response.Write("<br>" + Sql + "<br>");

    IDataReader Se = Database.CreateDataReader("SELECT * FROM AccessUser WHERE AccessUserID = " + User.ID);
    while (Se.Read())
    {
        Response.Write((string)Se[Field] + "<br>");
    }

    int affectedrows = Database.ExecuteNonQuery(Sql, Database.CreateConnection());

    Response.Write("<br>NUMMER: " + affectedrows + "<br>");
    IDataReader S = Database.CreateDataReader("SELECT * FROM AccessUser WHERE AccessUserID = " + User.ID);
   while (S.Read())
   {
       Response.Write((string)S[Field] + "<br>");
   }
与其他查询方法的结果相同

我也试过这个。什么也没发生

   using (SqlConnection cn = new SqlConnection(SQLString))
        {
            SqlTransaction Trans;
            try
            {

                cn.Open();
                Trans = cn.BeginTransaction();
                IDbCommand command = cn.CreateCommand();
                command.Transaction = Trans;
                command.CommandText = "UPDATE AccessUser SET [" + Field + "] = @ParamValue WHERE AccessUserID = @UserId";
                Database.AddStringParam(command, "@ParamValue", Value);
                Database.AddInt32Param(command, "@UserId", User.ID);

                //Execute command
                int affectedRecords = command.ExecuteNonQuery();
                Response.Write("<br>NUMMER: " + affectedRecords + "<br>");
                Response.Write(cn.ServerVersion );
                Trans.Commit();
                cn.Close();
            }
            catch (Exception e)
            {
                Response.Write("<span style='color:red;'>" + e.Message + "</span>");
            }
        };
在我的逻辑中,这告诉我变革已经完成。 然而,现在,后来,我得到了这个(不得不把它砍掉,Stackoverflow不喜欢它)

-并再次将内容更新回原始内容。 如何检查这是否是某种事务回滚?或者别的什么。
请原谅英语。

您可能正在使用事务。当您使用事务时,您必须在完成事务后提交它,否则它将自动回滚-因此,在您的情况下,您执行更新,不会出现错误。然后使用相同的SQL连接进行检查,一切看起来都正常。然后在某个时候,您离开事务范围,事务自动回滚,恢复数据库中的更改。

请使用.Hi Albireo-如问题中所述,我通常使用绑定参数,在这种情况下,绑定参数也不起作用。此语法纯粹用于调试目的。添加了带有绑定参数的示例,这将导致完全相同的行为。请使用SQL Server profiler检查查询是否确实在目标数据库上执行,并检查是否有任何BEGIN TRAN调用。在上一个示例中,ExecuteOnQuery完成时“affectedRecords”的值是多少?这将有助于调试。可能您有一个
TransactionScope()
在更高的级别上包装它?@Jonasm
TransactionScope
是一个好主意,它也可能在更高的级别上-您使用的是ASP.NET,它可以在整个web服务方法甚至页面本身上具有事务范围。事务系统实际上是独立于数据库的,它甚至可以处理很多其他事情,而不仅仅是数据库。还有一些方法可以使用属性(
TransactionAttribute
和其他属性)来控制它。试着找些参考资料。@Jonasm这很奇怪。。。是否有可能是其他人同时在修改表?也许某个地方有一个后台工作人员,或者一个触发器或者其他什么东西,它正在改变你手中的值?如果可以的话,请尝试使用SQL事件探查器或其他工具来监视所有发送到服务器的SQL命令。最后一件事-查找一个instead而不是update触发器。@Jonasm好的,这听起来不像MS SQL事务回滚(它可能应该是“rollback Tran Starting”或类似的内容)。相反,看起来好像您正在再次手动更新该行。这可能是由于某些O/RM试图将更改同步到数据库,或者正如StuartLC所建议的,是一个更新触发器(尽管我不确定这是否会显示在SQL profiler中)。SQL探查器行中应该有一些连接ID-它是否为两个更新显示相同的值?如果是,这可能弱暗示这两个更新是在同一个连接上完成的。
   using (SqlConnection cn = new SqlConnection(SQLString))
        {
            SqlTransaction Trans;
            try
            {

                cn.Open();
                Trans = cn.BeginTransaction();
                IDbCommand command = cn.CreateCommand();
                command.Transaction = Trans;
                command.CommandText = "UPDATE AccessUser SET [" + Field + "] = @ParamValue WHERE AccessUserID = @UserId";
                Database.AddStringParam(command, "@ParamValue", Value);
                Database.AddInt32Param(command, "@UserId", User.ID);

                //Execute command
                int affectedRecords = command.ExecuteNonQuery();
                Response.Write("<br>NUMMER: " + affectedRecords + "<br>");
                Response.Write(cn.ServerVersion );
                Trans.Commit();
                cn.Close();
            }
            catch (Exception e)
            {
                Response.Write("<span style='color:red;'>" + e.Message + "</span>");
            }
        };
Audit Login:
-- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
RPC:Completed:
exec sp_executesql N'UPDATE [AccessUser] SET [AccessUserUpdatedOn] = @p1 WHERE (([AccessUserID] = @p2) AND ((@p3 = 1 AND [AccessUserParentID] IS NULL) OR ([AccessUserParentID] = @p4)) AND ((@p5 = 1 AND [AccessUserUserName] IS NULL) OR ([AccessUserUserName] = @p6)) AND ((@p7 = 1 AND [AccessUserPassword] IS NULL) OR ([AccessUserPassword] = @p8)) AND ((@p9 = 1 AND [AccessUserName] IS NULL) OR ([AccessUserName] = @p10)) AND ((@p11 = 1 AND [AccessUserDepartment] IS NULL) OR ([AccessUserDepartment] = @p12)) AND ((@p13 = 1 AND [AccessUserEmail] IS NULL) OR ([AccessUserEmail] = @p14)) AND ((@p15 = 1 AND [AccessUserPhone] IS NULL) OR ([AccessUserPhone] = @p16)) AND ((@p17 = 1 AND [AccessUserFax] IS NULL) OR ([AccessUserFax] = @p18)) AND ((@p19 = 1 AND [AccessUserGroups] IS NULL) OR ([AccessUserGroups] = @p20)) AND ((@p21 = 1 AND [AccessUserType] IS NULL) OR ([AccessUserType] = @p22)) AND ((@p23 = 1 AND [AccessUserValidFrom] IS NULL) OR ([AccessUserValidFrom] = @p24)) AND ((@p25 = 1 AND [AccessUserValidTo] IS NULL) OR ([AccessUserValidTo] = @p26)) AND ((@p27 = 1 AND