1

ExecuteNonQuery() を使用して、データベース内のいくつかのフィールドを更新しようとしています。

更新しようとすると、エラーや警告は表示されず、影響を受ける行数が 1 つ返されます。

問題は、現在のリクエストに対してのみ変更を確認できることです。ページをリロードするか、SMSS を通過すると、変更がデータベースに表示されません。

ちょっとしたコードです。

    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>");
   }

ご覧のとおり、最初に現在の値を出力し、その後更新クエリを実行し、その後再び値を出力します。(通常はバインドされたパラメーターを使用することを通知する必要がありますが、デバッグのためにそれらを破棄してこれを作成しました。)

結果は次のとおりです: Jonas NUMMER: 1 Mikkel

ページを更新したり、データベースを調べたりしても、行は変更されていません。何をすべきか?:D

編集: システム「Dynamicweb-CMS」のドキュメントには、トランザクションではないことが記載されています : http://developer.dynamicweb-cms.com/api8/Dynamicweb~Dynamicweb.Database~ExecuteNonQuery(String,IDbConnection,IDbTransaction).html私が実際にそうしているように、私はただできるはずです。奇妙なもの。

編集2:「バインドされたパラメータOCD」を持つ人を喜ばせるために

    using (IDbConnection connection = Database.CreateConnection())
    {
        IDbCommand command = connection.CreateCommand();
        command.CommandText = "UPDATE AccessUser SET [" + Field + "] = @ParamValue WHERE AccessUserID = @UserId";
        Database.AddStringParam(command, "@ParamValue", Value);
        Database.AddInt32Param(command, "@UserId", User.ID);

        //Execute command
        command.ExecuteNonQuery();
        connection.Close();
    }

他のクエリ方法と同じ結果。

これも試しました。何も起こりません。

   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>");
            }
        };

プロファイラーを実行したところ、更新ステートメントが表示されました。updateステートメントの後、以下が送信されます

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

私の論理では、これは変更がコミットされたことを示しています。今、しかし、その後、私はこれを手に入れました(それを切り詰めなければなりませんでした、Stackoverflowはそれを好きではありませんでした)

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 

-そして、コンテンツを再び元の状態に更新します。これがある種のトランザクション ロールバックであるかどうかを確認するにはどうすればよいですか? または他の何か。英語を許してください。

4

1 に答える 1

3

おそらくトランザクションを使用しています。トランザクションを使用している場合は、完了時にトランザクションをコミットする必要があります。そうしないと、自動的にロールバックされます。そのため、あなたの場合は更新を行い、エラーは発生しません。次に、同じ SQL 接続を使用してチェックすると、すべて問題ないように見えます。その後、ある時点でトランザクション スコープを離れると、トランザクションは自動的にロールバックされ、DB の変更が元に戻ります。

于 2014-02-07T12:55:08.090 に答える