【问题标题】:Retrieve Auto Increment ID from SQL Database after Insert Statement在插入语句后从 SQL 数据库中检索自动增量 ID
【发布时间】:2020-06-14 11:38:45
【问题描述】:

下面是我的代码,用于将数据插入数据库后检索自动增量 ID。

但是,在将数据插入数据库之前,我会获得自动增量 ID。

插入数据库后如何获取自增ID?

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {           
            RetrievePRReqID();
        }
    }

//获取ID方法

   private void RetrievePRReqID()
     {
        try
        {
            string query = "Select IDENT_CURRENT('tblPRRequest')";
            if (sqlCon.State == ConnectionState.Closed)
            {
                sqlCon.Open();

            }
            SqlCommand cmd = new SqlCommand(query, sqlCon);
            SqlDataReader reader = cmd.ExecuteReader();
            while(reader.Read())
            {
                int value = int.Parse(reader[0].ToString()) ;
                txt_PRNO.Text = value.ToString();
            }
        }
        catch(Exception)
        {
            throw;
        }
        finally
        {
            if(con.State == ConnectionState.Open)
            {
                con.Close();
            }
          }
        }

//请求按钮方法

     protected void btn_Request(object sender, EventArgs e)
    {
        string insertCmd = "INSERT INTO tblPRRequest (RequestTo,RequestFrom,RequestedByName) " +
            "VALUES (@RequestTo,@RequestFrom,@RequestedByName)";

        using (SqlConnection conn = new SqlConnection(cs))
        {
            conn.Open();
            using (SqlCommand sqlcmd = new SqlCommand(insertCmd, conn))
            {
                sqlcmd.Parameters.Clear();
                SqlCommand sqlCmd = new SqlCommand(insertCmd, sqlCon);
                sqlcmd.Parameters.AddWithValue("@RequestTo", lblPurchasingDept.Text);
                sqlcmd.Parameters.AddWithValue("@RequestFrom", ddlDept.SelectedItem.Text);
                sqlcmd.Parameters.AddWithValue("@RequestedByName", SUserName.Text);                   
                sqlcmd.ExecuteNonQuery();
            }
        }
        ***//After Insert into the table, I want to retrieve latest generated Auto Increment ID in here.***
      }

【问题讨论】:

    标签: c# sql asp.net database auto-increment


    【解决方案1】:

    试试这个:

         protected void btn_Request(object sender, EventArgs e)
        {
            string insertCmd = "INSERT INTO tblPRRequest (RequestTo,RequestFrom,RequestedByName) " +
                "VALUES (@RequestTo,@RequestFrom,@RequestedByName)";
    
            using (SqlConnection conn = new SqlConnection(cs))
            {
                conn.Open();
                using (SqlCommand sqlcmd = new SqlCommand(insertCmd, conn))
                {
                    sqlcmd.Parameters.Clear();
                    SqlCommand sqlCmd = new SqlCommand(insertCmd, sqlCon);
                    sqlcmd.Parameters.AddWithValue("@RequestTo", lblPurchasingDept.Text);
                    sqlcmd.Parameters.AddWithValue("@RequestFrom", ddlDept.SelectedItem.Text);
                    sqlcmd.Parameters.AddWithValue("@RequestedByName", SUserName.Text);
                    sqlcmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output;                
                    sqlcmd.ExecuteNonQuery();
                }
            }
            ***//After Insert into the table, I want to retrieve latest generated Auto Increment ID in here.***
            sqlcmd.Parameters["@ID"].value; // Access it like this
          }
    

    如果您可以将ExecuteNonQuery 更改为ExecuteScalar,那就更简单了:What is the difference between ExecuteScalar, ExecuteReader and ExecuteNonQuery?

    【讨论】:

      【解决方案2】:

      如 SQL Server 文档中所述 https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15

      OUTPUT 子句可能有助于在 INSERT 或 UPDATE 操作之后检索标识或计算列的值。

      你必须改变你的 SQL 语句

      INSERT INTO tblPRRequest (RequestTo,RequestFrom,RequestedByName)  
      OUTOUT inserted.ID
      -------^^^^^^^^_^^
      VALUES (@RequestTo,@RequestFrom,@RequestedByName)
      

      现在您可以使用 ExecuteScalar 来获取插入的值

       protected void btn_Request(object sender, EventArgs e)
       { 
          int id= 0;
          string insertCmd = "INSERT INTO tblPRRequest (RequestTo,RequestFrom,RequestedByName) " +
              "output inserted.ID" +
              "VALUES (@RequestTo,@RequestFrom,@RequestedByName)";
      
          using (SqlConnection conn = new SqlConnection(cs))
          {
              conn.Open();
              using (SqlCommand sqlcmd = new SqlCommand(insertCmd, conn))
              {
                  sqlcmd.Parameters.AddWithValue("@RequestTo", lblPurchasingDept.Text);
                  sqlcmd.Parameters.AddWithValue("@RequestFrom", ddlDept.SelectedItem.Text);
                  sqlcmd.Parameters.AddWithValue("@RequestedByName", SUserName.Text);
      
                  id = (int)sqlcmd.ExecuteScalar(); //the result is of Object type, cast it safely
              }
          }
      
          Debug.WriteLine(id.ToString()); // Access it like this
        }
      

      【讨论】:

        【解决方案3】:

        通过参考@Mx.Wolf 的示例答案,我进行了一些修改以获得正确答案,下面是有效的代码:

             protected void btn_Request(object sender, EventArgs e)
            {
                object id ;
                string insertCmd = "INSERT INTO tblPRRequest (RequestTo,RequestFrom,RequestedByName) " +
                    "output inserted.PRReqID " +
                    "VALUES (@RequestTo,@RequestFrom,@RequestedByName)";
        
                using (SqlConnection conn = new SqlConnection(cs))
                {
                    conn.Open();
                    using (SqlCommand sqlcmd = new SqlCommand(insertCmd, conn))
                    {
                        sqlcmd.Parameters.AddWithValue("@RequestTo", lblPurchasingDept.Text);
                        sqlcmd.Parameters.AddWithValue("@RequestFrom", ddlDept.SelectedItem.Text);
                        sqlcmd.Parameters.AddWithValue("@RequestedByName", SUserName.Text);
        
                        id = sqlcmd.ExecuteScalar(); //the result is of Object type, cast it safely
                    }
                }
        
                Debug.WriteLine(id.ToString()); // Access it like this
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-24
          • 2016-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-13
          • 2017-09-24
          • 1970-01-01
          相关资源
          最近更新 更多