10

これが許容できる操作かどうかはわかりません。ASP.NET コードからの単一のトランザクションとして、SQL Server 2008 データベースからレコードを選択して削除する必要があります。.NET コードは、最初に選択されたデータを取得できる必要があることに注意してください。

そのようなもの:

SELECT * FROM [tbl] WHERE [id] > 6;
DELETE FROM [tbl] WHERE [id] > 6

私はSQL Fiddleで試していますが、もしそうなら:

SELECT * FROM [tbl]

何も削除されていないかのように、完全なテーブルを取得します。

EDIT以下に要求されているように、レコードを取得するための完全な .NET コードは次のとおりです。

string strSQLStatement = "SELECT * FROM [tbl] WHERE [id] > 6;" +
    "DELETE FROM [tbl] WHERE [id] > 6";

using (SqlCommand cmd = new SqlCommand(strSQLStatement, connectionString))
{
    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //Read values
            val0 = rdr.GetInt32(0);
            val3 = rdr.GetInt32(3);
            //etc.
        }
    }
}
4

4 に答える 4

26

これにより、選択と削除が同時に行われます。

delete from [tbl] output deleted.* WHERE [id] > 6
于 2013-06-23T05:51:34.147 に答える
1

両方の操作が同じトランザクションに参加している限り、同じトランザクションで選択と削除を行うことができます。

この投稿を見てください .netのトランザクション

于 2013-06-23T04:52:30.740 に答える
1

互換性のあるプロバイダーでトランザクションを実現する「最も簡単な」方法 (SQL Server はうまく機能します!) は、TransactionScopeを使用することです。すべてが正しく登録されるように、接続を開く前にスコープが作成されていることを確認してください。

SelectStuffおよびメソッドの内容はDeleteStuffあまり重要ではありません。同じ接続を使用するだけで、手動で接続やトランザクションを台無しにせず、SQL 操作を実行するのが最善です。

// Notes
// - Create scope OUTSIDE/BEFORE connection for automatic enlisting
// - Create only ONE connection inside to avoid DTC and "advanced behavior"
using (var ts = new TransactionScope())
using (var conn = CreateConnection()) {
    // Make sure stuff selected is MATERIALIZED:
    // If a LAZY type (Enumerable/Queryable) is returned and used later it
    // may cause access to the connection outside of when it is valid!
    // Use "ToList" as required to force materialization of such sequences.
    var selectedStuff = SelectStuff(conn);

    DeleteStuff(conn);

    // Commit
    ts.Complete();

    // Know stuff is deleted here, and access selected stuff.
    return selectedStuff; 
}
于 2013-06-23T05:07:47.237 に答える
0

複数の SQL ステートメントからの戻り値は、最後に実行されたステートメントの結果であり、この場合はDELETE. から返される行がないDELETEため、val0およびを読み取るものはありませんval3

ここで考えられる解決策は 2 つあります。

  1. コードを変更して、明示的にトランザクションを開始し、 を実行しSELECT、値を読み取ってからDELETE、または

  2. SELECTテーブルに入れ#temp、 を実行してDELETEからSELECT#tempテーブルから、必要なことを行で行い、次にDROPth を実行します。

于 2013-06-23T05:18:35.937 に答える