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