繁体   English   中英

从后面的C#代码插入sql时出错

[英]Error, when inserting into sql from C# code behind

我试图同时将一些新威胁插入两个表中。 在sql Management Studio中运行时,该sql语句就像一个超级按钮。 但是,当我尝试做一个aspx页面时,用C#codebehind对sql语句进行编码,它会返回类似不能插入空的内容。 我尝试了不同的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中触发时实际起作用的代码。 我认为正是作用域标识在我的浏览器中返回了错误。 我不知道该怎么办,请帮忙。 谢谢。

代替:

 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); 

使它们成为一个命令,如下所示:

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

然后将其余代码作为一个命令处理。

希望会成功。

SCOPE_IDENTITY是最后插入的记录的自动生成的ID值。 因此,您无需将其传递给insert命令。 您可以在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();
    }
}

我建议您改用存储过程。 以后再处理它们也会更容易。 这样您就可以按原样使用原始语句。 存储过程如下:

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();
        }
    }

谢谢大家...。我尝试了不同的方法。 似乎对我没有任何帮助。 我决定尝试再次编写代码。 从头开始。 有时可以。 有时它不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM