【问题标题】:Get auto_increment id from table从表中获取 auto_increment id
【发布时间】:2013-07-27 20:12:43
【问题描述】:

我有这个代码:

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。

【问题讨论】:

    标签: c# sql .net auto-increment


    【解决方案1】:

    用这个更改你的命令文本并尝试

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

    【讨论】:

    • SELECT SCOPE_IDENTITY() 给我插入的 id 吗?现在我得到一个例外: int id = (int)cmd.ExecuteScalar();例外是演员阵容不行。
    • SCOPE IDENTITY 返回插入行的标识值
    • 也尝试像这样投射Convert.Toint32(cmd.ExecuteScalar())
    • 它仍然是插入两行而不是一行..它可能是什么问题?
    • 避免cmd.ExecuteNonQuery() cmd.ExecuteScalar() 就足够了。你打电话给这就是为什么它被插入两次
    【解决方案2】:

    像这样修改你的命令

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2018-12-21
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多