1

設定:

  • asp.net MVC
  • SQL サーバー 2008 R2

送信するメッセージのリストを取得する手順があります。結果レコードを更新して、誤って同じレコードを 2 回プルしないようにしたい。どのようにアプローチしてもSSMS、正しいメッセージのリストが生成されます。ただし、同じ手順でレコードを更新すると、C# では結果が得られません。

私はこのようなものを使ってみDataAdapterました:

var da = new SqlDataAdapter(cmd);
da.Fill(table);

そしてDataReaderこのように:

var dataReader = cmd.ExecuteReader();
table.Load(dataReader);
dataReader.Close();

my に入力してDataTableも、どちらも結果に影響を与えないようです。

私の手順は次のようになります。

ALTER PROCEDURE [dbo].[MnxNoticeGetMessages] 
@sessionId uniqueidentifier = null
AS
BEGIN
SET NOCOUNT ON;

DECLARE @Output TABLE (messageid uniqueidentifier)

INSERT INTO @Output
SELECT messageid FROM MnxTriggerEmails WHERE dateSent is null 

SELECT * FROM MnxTriggerEmails WHERE messageid IN (SELECT messageid FROM @Output)

UPDATE MnxTriggerEmails SET dateSent=GETDATE() 
    WHERE messageid IN (SELECT * FROM @Output)
END

これにより、SSMSではなく で結果が生成されC#ます。

このようにコメントアウトするとUPDATE(他の変更はありません):

--UPDATE MnxTriggerEmails SET dateSent=GETDATE() 
--    WHERE messageid IN (SELECT * FROM @Output)

と の両方SSMSで期待される結果が得られC#ます。

私は何が欠けていますか?これは何が原因でしょうか?レコードを更新し、同時に結果を取得するにはどうすればよいですか?

4

1 に答える 1

1

あなたのコードは問題ないようです。それはうまくいくはずです。spを2回呼び出しているように聞こえます。1 回目は日付を変更し、2 回目は結果を返しません。これにより、ssms が目的の結果を生成し、c# が空になります。

投稿していないコードを確認し、DataTable にデータを入力する前にもう一度その呼び出しを行うかどうかを確認してください。

于 2013-09-25T20:35:10.493 に答える