3

我有这个代码:

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

当我插入到这个表中时,我有一个名为的 auto_increment int 主键列gameID,并且我在 sql 语句中声明我想要gameIDin 输出。我的问题是,当我在代码中编写这一行时: int id = (int)cmd.ExecuteScalar(); 插入的参数在表中出现两次(2 行具有相同的信息。),但是当我删除它时就可以了。

我需要这一行,所以我可以在其他表中使用这个 id。

4

2 回答 2

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()将执行插入查询并返回受影响的行数。

asExecuteScalar()将返回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();
于 2013-07-27T17:05:35.920 回答
1

像这样修改你的命令

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...)
SELECT SCOPE_IDENTITY()

但我个人更喜欢编写一个存储过程并将主键作为该 sp 的输出参数返回。

于 2013-07-27T17:11:34.760 回答