c# - 从表中获取 auto_increment id

标签 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(); 插入的参数在表中出现两次(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/

相关文章:

c# - 数据注释 : Recursively validating an entire object graph

c# - WPF、XNA、SlimDX ... 对类似 CAD 的桌面应用程序的建议? (C#)

c# - 需要了解简短的 ASP.NET 源代码

mysql - 如何在我的文本中编写包含不需要空格的查询?

sql - 如何根据条件加入不同的字段

c# - 如何在datagridview中捕获删除行(从键盘)?

c# - 如何向 tcp 服务器发出 http 请求?

c# - 使用 HttpClient 上传多部分表单文件

c# - 何时更改 Generate Serialization Assembly 值?

mysql - 添加索引+执行查询比不使用索引执行查询更快