我有这个代码:
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();
插入的参数在表中出现两次(2 行具有相同的信息),但是当我删除它时就可以了。
我需要这一行,这样我就可以在其他表中使用这个 id。
最佳答案
用这个改变你的命令文本并尝试
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()
状态的结果,即插入行的标识列。
这是你的代码
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();
关于c# - 从表中获取 auto_increment id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17900305/