从表中获取auto_increment id

时间:2013-07-27 16:57:29

标签: c# sql .net auto-increment

我有这段代码:

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。

2 个答案:

答案 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的输出参数返回。