1

まず、私はセキュリティ担当者であり、開発者ではありません。私がやろうとしていることをもっと簡単に行う方法があれば、私は驚かないでしょう。C#で何かをするのはこれが初めてなので、優しくしてください。

私は、監査管理へのコンプライアンスを追跡するためのデータベースに取り組んでいます。データベースは MS SQL 2008 で、私が C# で書いている Web アプリ フロント エンドを備えています。私は、ユーザーがテスト結果でコントロールを更新したり、要件やその他のほとんどを変更したりできるページに取り組んでいます。このページで情報が更新されると、Controls テーブルのレコードを更新する前に、Controls テーブルの既存のデータを History テーブルに書き込もうとしています。Historyまた、誰がいつ更新を行ったかを(表に) 記録しようとしています。ここで私は問題に直面しています。SELECTステートメントにステートメントをネストしINSERTてデータをプルすることはできますが、更新された日付と時刻、およびそれを更新したユーザーを追加する方法がわかりません。

これは現在、明らかな理由で機能しない私のクエリです。作業している列とパラメーターを理解していただくためです。

INSERT INTO History (BUName, ControlFWName, ControlID, ControlDesc, 
                     TestPlan, TestFreq, NextTest, ControlCatName,
                     AuditorNotes, AuditorNoteTime, TestResults, ArtifactID1, 
                     ArtifactID2, ArtifactID3, ArtifactID4, 
                     WhoChanged, WhenChanged) 
                     SELECT BUName, ControlFWName, ControlID, ControlDesc, 
                            TestPlan, TestFreq, NextTest, ControlCatName, 
                            AuditorNotes, AuditorNoteTime, TestResults, ArtifactID1, 
                            ArtifactID2, ArtifactID3, ArtifactID4 
                     FROM Controls 
                     WHERE BUName = @BUName 
                       AND ControlFWName = @ControlFWName 
                       AND ControlID = @ControlID

その挿入ステートメントにWhoChangedand列を追加するにはどうすればよいですか? それらは、とWhenChangedだけの変数にパラメーター化されます。 DateTime.NowUser.Identity.Name

さらにコードが必要な場合は、お知らせください。

4

2 に答える 2

2

C#で何かをするのはこれが初めてなので、優しくしてください。

しかし、これは T-SQL に関する質問であり、C# に関する質問ではありません。

パラメータをクエリに追加するだけです。

INSERT INTO history 
            (buname, controlfwname,  controlid, controldesc, 
             testplan, testfreq, nexttest, controlcatname, 
             auditornotes, auditornotetime, testresults, 
             artifactid1, artifactid2, artifactid3, artifactid4, 
             whochanged, whenchanged) 
SELECT buname, controlfwname, controlid, controldesc, 
       testplan, testfreq, nexttest, controlcatname, 
       auditornotes, auditornotetime, testresults, 
       artifactid1, artifactid2, artifactid3, artifactid4, 
       @WhoChanged, @WhenChanged 
FROM   controls 
WHERE  buname = @BUName 
       AND controlfwname = @ControlFWName 
       AND controlid = @ControlID 

なぜ重要なのかは明らかではありませんが、ここに C# の部分があります。

string sql = @"INSERT INTO history 
             (buname, controlfwname,  controlid, controldesc, 
             testplan, testfreq, nexttest, controlcatname, 
             auditornotes, auditornotetime, testresults, 
             artifactid1, artifactid2, artifactid3, artifactid4, 
             whochanged, whenchanged) 
SELECT buname, controlfwname, controlid, controldesc, 
       testplan, testfreq, nexttest, controlcatname, 
       auditornotes, auditornotetime, testresults, 
       artifactid1, artifactid2, artifactid3, artifactid4, 
       @WhoChanged, @WhenChanged 
FROM   controls 
WHERE  buname = @BUName 
       AND controlfwname = @ControlFWName 
       AND controlid = @ControlID";

// use the using statement to ensure that unmanaged resources are disposed and the connection is closed
using(var con = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(sql, con))
{
    DateTime now = DateTime.Now;
    string user = HttpRequest.Current.User.Identity.Name;
    cmd.Parameters.AddWithValue("@WhoChanged", user);
    cmd.Parameters.AddWithValue("@WhenChanged", now);
    // ...
    con.Open();
    int affectedRecords = cmd.ExecuteNonQuery();
}
于 2013-05-16T21:09:47.407 に答える