0

複数のユーザーが同時に SQL Server DB の行を更新できるようにする ASP.NET 4.0 C# Web アプリケーションがあります。私は、USER1 の最後のページ更新以降に USER2 が更新した行を USER1 が更新するのを止める簡単なシステムを考え出そうとしています。

私が抱えている問題は、Web アプリケーションが行を更新すべきではないと思っていても、常に行を更新することです。しかし、クエリを手動で実行すると、必要だと思われる場合にのみ更新されます。

これは C# での私の SQL クエリです。

SQLString = "update statuses set stat = '" + UpdaterDD.SelectedValue +
            "', tester = '" + Session["Username"].ToString() +
            "', timestamp_m = '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") +
            "' where id IN (" + IDs + ") and timestamp_m < '" + PageLoadTime + "';";

そして、これが「現実世界」の例です:

SQLString = "update statuses set stat = 'PASS', tester = 'tester007',
             timestamp_m = '2013-01-23 14:20:07.221' where id IN (122645) and
             timestamp_m < '2013-01-23 14:20:06.164';"

私の考えは、ユーザーが最後にページをロードしてから他のユーザーがこの行を変更していない場合にのみ更新されるということでした。PageLoadTimeでわかるように、SQL Server DB と同じ形式にフォーマットしましたDateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")が、まだ何かが正しくありません。

2つの異なる結果が得られる理由を誰かが知っていますか? 私がやりたいことは可能ですか?

4

1 に答える 1

0

問題は、ページの読み込み時間が正しく設定されていないか、DB呼び出しの直前に設定されていることだと思います。デバッグの場合、挿入を許可または禁止することがわかっている値をハードコーディングしてみてください。

これがあなたが持っているもののパラメータ化されたバージョンです。また、値を渡す代わりに、DBサーバーにタイムスタンプを現在の時刻に設定させています。DBサーバーとWebサーバーの時刻が同期していない可能性がある場合は、自分で設定してください。

パラメータ化を使用すると、日付/時刻の形式が正しいかどうかを心配する必要はありません。stat、tester、timestamp_mのDBタイプがわからないため、パラメーターDBタイプを追加するには調整が必要になる場合があります。

string sql = "update statuses set stat = @stat, tester = @tester" +
        ", timestamp_m = getdate()" +
        " where id IN (" + IDs + ") and timestamp_m < @pageLoadTime";

SQLConnection conn = getMeASqlConnection();

SQLCommand cmd = new SQLCommand(sql, conn);

cmd.Parameters.Add("@stat", System.Data.SqlDbType.NVarChar).Value = UpdaterDD.SelectedValue;
cmd.Parameters.Add("@tester", System.Data.SqlDbType.NVarChar).Value = Session["Username"].ToString();
// Here, pageLoadTime is a DateTime object, not a string
cmd.Parameters.Add("@pageLoadTime", System.Data.SqlDbType.DateTime).Value = pageLoadTime;
于 2013-01-24T00:51:16.710 に答える