我有这段代码:
string conStr = ConfigurationManager.ConnectionStrings["BackgammonGame"].ConnectionString;
SqlConnection con = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
con.Open();
cmd.CommandText = ("INSERT INTO Game (playerA, playerB) OUTPUT INSERTED.gameID VALUES (@playerA, @playerB)");
cmd.Parameters.Add("@playerA", SqlDbType.NVarChar).Value = firstPlayer;
cmd.Parameters.Add("@playerB", SqlDbType.NVarChar).Value = secondPlayer;
cmd.ExecuteNonQuery();
int id = (int)cmd.ExecuteScalar();
con.Close();
当我插入此表时,我有一个名为gameID
的auto_increment int主键列,我在sql语句中声明我希望输出中有gameID
。
我的问题是,当我在代码中写入这一行时:int id = (int)cmd.ExecuteScalar();
表中插入的参数apear两次(2行具有相同的信息。),但是当我删除它时,它没问题。
我需要这一行,所以我可以在其他表中使用这个id。
答案 0 :(得分:2)
使用此更改命令文本并尝试
cmd.CommandText = ("INSERT INTO Game (playerA, playerB) VALUES (@playerA,@playerB);
SELECT SCOPE_IDENTITY()");
SCOPE IDENTITY
返回最后插入行的标识值。因此,它将使用插入查询
修改强>
您正在执行两次查询
cmd.ExecuteNonQuery(); // Avoid this
int id = (int)cmd.ExecuteScalar();// This is enough
在这两种情况下,您的查询都会被执行,并导致插入两次。
ExecuteNonQuery()
将执行插入查询,并将返回受影响的行数。
ExecuteScalar()
将返回select scope_identity()
staement的结果,该结果是插入行的标识列。
这是您的代码
con.Open();
cmd.CommandText = ("INSERT INTO Game (playerA, playerB) VALUES (@playerA,@playerB);
SELECT SCOPE_IDENTITY()");
cmd.Parameters.Add("@playerA", SqlDbType.NVarChar).Value = firstPlayer;
cmd.Parameters.Add("@playerB", SqlDbType.NVarChar).Value = secondPlayer;
int id = Convert.ToInt32(cmd.ExecuteScalar());
con.Close();
答案 1 :(得分:1)
像这样修改你的命令
INSERT INTO YourTable(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...)
SELECT SCOPE_IDENTITY()
但我个人更喜欢编写存储过程并将主键作为该sp的输出参数返回。