0

同時に 2 つのテーブルに新しい脅威を挿入しようとしています。SQL管理スタジオ内で実行する場合のSQLステートメントは、魅力のように機能します。しかし、C#コードビハインドでsqlステートメントをコーディングしてaspxページを実行しようとすると、空を挿入できないようなものが返されます。さまざまな SQL ステートメントを試しましたが、何も機能していないようです。

元の声明は次のとおりです。

DECLARE @BrugerNavn NVARCHAR(50) = 'Bent'
DECLARE @Besked NVARCHAR(MAX) = 'Bents besked'
DECLARE @TraadNavn NVARCHAR(50) = 'Bents tråd'
DECLARE @KategoriID INT = 1

INSERT INTO TraadTabel
VALUES (@TraadNavn, @KategoriID)

INSERT INTO Beskeder
VALUES (@Besked, SCOPE_IDENTITY(), @BrugerNavn)

私のC#コードは次のとおりです:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string BrugerNavn = txtBrugerNavn.Text;
    string TradNavn = txtTraadNavn.Text;
    string Besked = txtBesked.Text;
    int KategoriID = int.Parse(Request.QueryString["id"]);

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["SimpeltForumConnectionString"].ConnectionString);
    SqlCommand FirstLoad = new SqlCommand("INSERT INTO TraadTabel VALUES (@TradNavn, @KategoriID)", conn);
    //SqlCommand SecondLoad = new SqlCommand("INSERT INTO Beskeder VALUES (@Besked, SCOPE_IDENTITY(), @BrugerNavn)", conn);
    SqlCommand SecondLoad = new SqlCommand("INSERT INTO Beskeder VALUES (@Besked, SELECT IDENT_CURRENT(IndlaegID)+1, @BrugerNavn)", conn);

    FirstLoad.CommandType = CommandType.Text;
    FirstLoad.Parameters.AddWithValue("@TradNavn", TradNavn);
    FirstLoad.Parameters.AddWithValue("@KategoriID", KategoriID);
    SecondLoad.Parameters.AddWithValue("@Besked", Besked);
    SecondLoad.Parameters.AddWithValue("@BrugerNavn", BrugerNavn);

    using (conn)
    {
        conn.Open();
        FirstLoad.ExecuteNonQuery();
        SecondLoad.ExecuteNonQuery();
    }
}

ご覧のとおり、「SCOPE_IDENTITY()」行をコメントアウトして残しました。これは、SQL Management Studio 内からトリガーされたときに実際に機能するコードであるためです。そして、ブラウザでエラーを返すのはスコープ ID だと思います。どうすればいいのかわからないので、助けてください。ありがとう。

4

4 に答える 4

0

それ以外の:

 SqlCommand FirstLoad = new SqlCommand("INSERT INTO TraadTabel VALUES (@TradNavn, @KategoriID)", conn);
 SqlCommand SecondLoad = new SqlCommand("INSERT INTO Beskeder VALUES (@Besked, SELECT IDENT_CURRENT(IndlaegID)+1, @BrugerNavn)", conn); 

次のように、それらを1つのコマンドとして作成します。

    SqlCommand MyOnlyLoad = new SqlCommand("INSERT INTO TraadTabel VALUES (@TradNavn, @KategoriID) GO INSERT INTO Beskeder VALUES (@Besked, SELECT IDENT_CURRENT(IndlaegID)+1, @BrugerNavn) ", conn);

次に、残りのコードを1つのコマンドとして処理します。

うまくいけば、それはうまくいくでしょう。

于 2012-10-04T10:53:05.700 に答える
0

代わりにストアド プロシージャを使用することをお勧めします。後でそれらを処理するのも簡単になります。元のステートメントをそのまま使用することができます。ストアド プロシージャは次のようになります。

CREATE PROCEDURE Insert_TraadTabel_AND_Beskeder                    
 -- Add the parameters for the stored procedure here                          
 DECLARE @BrugerNavn NVARCHAR(50), 
DECLARE @Besked NVARCHAR(MAX),
DECLARE @TraadNavn NVARCHAR(50),
DECLARE @KategoriID INT         

AS                            
BEGIN                            
 -- SET NOCOUNT ON added to prevent extra result sets from                            
 -- interfering with SELECT statements.                            
 SET NOCOUNT ON; 

INSERT INTO TraadTabel
VALUES (@TraadNavn, @KategoriID)

INSERT INTO Beskeder
VALUES (@Besked, SCOPE_IDENTITY(), @BrugerNavn) 
END

コードは次のようになります。

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        using (conn)
        {
            SqlCommand command;
            command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "Insert_TraadTabel_AND_Beskeder";
            command.Parameters.Add("@TradNavn", SqlDbType.NVarChar).Value = txtTraadNavn.Text;
            command.Parameters.Add("@KategoriID", SqlDbType.Int).Value = int.Parse(Request.QueryString["id"]);
            command.Parameters.Add("@Besked", SqlDbType.NVarChar).Value = txtBesked.Text;
            command.Parameters.Add("@BrugerNavn", SqlDbType.NVarChar).Value = txtBrugerNavn.Text;
            command.ExecuteNonQuery();
        }
    }
于 2012-10-04T12:50:08.237 に答える
0

SCOPE_IDENTITY最後に挿入されたレコードの自動生成された ID 値です。したがって、挿入コマンドに渡す必要はありません。ADO.NET で取得して、次のコマンドのパラメーターとして使用できます。使用できますSELECT CAST(scope_identity() AS int)

using (var con = new SqlConnection(WebConfigurationManager.ConnectionStrings["SimpeltForumConnectionString"].ConnectionString)) {
    con.Open();
    int newID;
    var sql = "INSERT INTO TraadTabel VALUES (@TradNavn, @KategoriID);SELECT CAST(scope_identity() AS int);";
    using (var insertCommand1 = new SqlCommand(sql, con)) {
        insertCommand1.Parameters.AddWithValue("@TradNavn", TradNavn);
        insertCommand1.Parameters.AddWithValue("@KategoriID", KategoriID);
        newID = (int)insertCommand1.ExecuteScalar();
    }
    sql = "INSERT INTO Beskeder VALUES (@Besked, @newID, @BrugerNavn);";
    using (var insertCommand2 = new SqlCommand(sql, con)) {
        insertCommand2.Parameters.AddWithValue("@newID", newID);
        insertCommand2.Parameters.AddWithValue("@Besked", Besked);
        insertCommand2.Parameters.AddWithValue("@BrugerNavn", BrugerNavn);
        var affectedRecords = insertCommand2.ExecuteNonQuery();
    }
}
于 2012-10-04T10:55:18.010 に答える
0

ありがとう....私はさまざまなアプローチを試みました。私には何もうまくいかないようです。コードを最初からやり直すことにしました。ゼロから始める。時々それはうまくいきます。そうでない場合もあります。

于 2012-10-04T23:16:22.470 に答える