[英]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.