我试图同时将两个新威胁插入两个表中。在sql管理工作室内运行时的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中触发时将其保留,因为它是实际工作的代码。 我认为这是范围标识,它在我的浏览器中返回错误。 我不知道该怎么办,请帮忙。感谢。
答案 0 :(得分: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);
将它们作为一个命令,如下所示:
SqlCommand MyOnlyLoad = new SqlCommand("INSERT INTO TraadTabel VALUES (@TradNavn, @KategoriID) GO INSERT INTO Beskeder VALUES (@Besked, SELECT IDENT_CURRENT(IndlaegID)+1, @BrugerNavn) ", conn);
然后将其余代码作为一个命令处理。
希望,这将是有效的。
答案 1 :(得分:0)
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();
}
}
答案 2 :(得分: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();
}
}
答案 3 :(得分:0)
谢谢大家....我尝试了不同的方法。似乎没有什么对我有用。 我已经决定尝试重新编写代码。从头开始。 有时它有效。有时它没有。