0

を使用して明示的な SQL 更新コマンドで SQL Server データベースを更新していますExecuteNonQuery()。ただし、更新値が以前の更新と一致する場合 (たとえば、同じ行に対して列を 1 から 2 に変更し、次に 1 に戻し、次に 2 に戻す)、ExecuteNonQuery1 が返されても更新は行われません。

ExecuteQuery2 つの連続する select ステートメントが同一である場合にも同様の問題があることに気付きました。変数を一意の値に設定してから追加することでこれを修正しました

AND the_unique_value = the_unique_value

セレクトへ。ただし、これを更新プログラムに追加しても機能しません。

更新用の .NET コードは次のとおりです。

(メモTheValueTheKeyは文字列です)

SqlConnection conn = new SqlConnection(SomeConnectionString);
conn.Open();
try
{
    SqlCommand cmd = new SqlCommand
    ("update my_table "
     + "set the_value = '" + TheValue + "' "
     + "where the_key = '" + TheKey + "'"
    , conn);
    ReturnValue = cmd.ExecuteNonQuery();
}
catch (Exception e)
{
    ReturnValue = -2;
}
conn.Close();

これは 3 回呼び出されます。毎回、TheKey「1」です。

初回TheValueは「1」です。ReturnValueが 1 に設定され、更新が成功します。

2回目TheValueは「2」です。ReturnValueが 1 に設定され、更新が成功します。

3 回目は、TheValue再び「1」です。SQL コマンドは、最初に使用したものと同じになりました。ReturnValue1 に設定されていますが、更新は行われません。

各更新に異なる SQL コマンドがあることを確認するためだけに使用されるダミー値を保持するテーブルに列を追加できますが、「不要な」データでテーブルを変更したくありません。より良い作業がないために、更新を毎回「コミット」する別の方法はありますか?

4

3 に答える 3

1

SQLコードを次のように変更します...

using (SqlConnection  conn = new SqlConnection("My Connection")) //just do a using block here
{
    SqlCommand cmd = new SqlCommand();

    //you should never use string concatination here... ever..
    cmd.CommandText = "update myTable set foo = @foo where bar = @bar";
    cmd.Parameters.Add("@foo", "foo");
    cmd.Parameters.Add("@bar", "bar");


    conn.Open();
    cmd.Connection = conn;
    cmd.ExecuteNonQuery();

}

何かが一致した場合、返される数は 1 になります。もちろん、コマンド内のデータが同じであれば同じデータになります。

于 2012-10-09T15:59:27.507 に答える
0

トランザクション中にデータベースに情報を保持したい場合は、実際にcommitコマンドを使用する必要があります。コミットしないと、データベースの情報は更新されません。そのための追加情報を含む追加の行は必要ありません。

于 2012-10-09T15:53:23.073 に答える
0

SQL Server はそれとは何の関係もないことが判明しました。問題は、更新を行った .NET 関数への AJAX 呼び出しが実際には関数を呼び出さず、呼び出しに関連付けられた「成功」コードを実行したことでした。呼び出しに一意の値を持つダミーパラメーターを追加すると、それが修正されました。

于 2012-10-10T13:26:40.587 に答える