简体   繁体   English

在插入语句后从 SQL 数据库中检索自动增量 ID

[英]Retrieve Auto Increment ID from SQL Database after Insert Statement

Below here is my code to Retrieve Auto Increment ID After Inserting data into database.下面是我在将数据插入数据库后检索自动增量 ID 的代码

However, I am getting Auto Increment ID before Inserting data into database.但是,在将数据插入数据库之前,我获得了自动增量 ID。

How can I get auto increment ID after insert into database?插入数据库后如何获得自动增量ID?

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

//Retrieve ID method //获取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();
            }
          }
        }

//Request button Method //请求按钮方法

     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.***
      }

Try this:尝试这个:

     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
      }

In case you can chage the ExecuteNonQuery to ExecuteScalar , then it would be even easier: What is the difference between ExecuteScalar, ExecuteReader and ExecuteNonQuery?如果您可以将ExecuteNonQueryExecuteScalar ,那么它会更容易: ExecuteScalar、ExecuteReader 和 ExecuteNonQuery 之间有什么区别?

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

The OUTPUT clause may be useful to retrieve the value of identity or computed columns after an INSERT or UPDATE operation. OUTPUT 子句可用于在 INSERT 或 UPDATE 操作后检索标识或计算列的值。

You have to change your SQL statement你必须改变你的 SQL 语句

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

and now you can use ExecuteScalar to get the inserted value现在您可以使用 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
  }

By referring sample answer from @Mx.Wolf, I modified a bit to get the right answer, below here is the codes that is working :通过参考@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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在INSERT INTO语句后捕获记录的ID(INT AUTO INCREMENT) - Catch Id (INT AUTO INCREMENT) of a Record after INSERT INTO Statement 如何在插入语句期间从 C# 中的访问数据库获取下一个自动增量值 - How to get next auto increment value from access database in c# during insert statement 拉动插入自动增量编号 - Pull on insert the auto increment id 在数据库中增加和插入 SQL - Increment and insert in a database SQL 如何在C#中的内联SQL语句的插入语句之后返回新创建的ID? - How do I return the newly created ID after an insert statement from an inline SQL statement in C#? 从特定 Id 的数据库中检索所有数据或事务的 SQL 语句,并在 asp.net 中的图形上绘制相同的图 - SQL statement to retrieve all data or transactions from database of a particular Id and plot same on a graph in asp.net C#使用自动增量获取插入ID - C# Get insert id with Auto Increment 从表中删除内容后,如何在 C# 的内置 SQL 数据库中将自动增量重置为从 1 开始? - How do I reset Auto-Increment to start from 1 in built-in SQL Database of C# after deleting contents from table? 插入Nhibernate SQL Server后无法检索生成的ID - Could not retrieve generated id after insert nhibernate sql server 使用自动递增ID向数据库添加值 - Adding values to database with an auto-increment Id
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM