Получить идентификатор автоинкремента из SQL базы данных после оператора вставки - PullRequest
2 голосов
/ 02 марта 2020

Ниже приведен мой код для Извлечение идентификатора автоинкремента после вставки данных в базу данных.

Однако я получаю идентификатор автоинкремента до вставки данных в базу данных.

Как я могу получить идентификатор автоинкремента после вставки в базу данных?

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

// Метод получения идентификатора

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

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Как указано в SQL Документация сервера 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
  }
0 голосов
/ 03 марта 2020

Ссылаясь на пример ответа от @ 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
0 голосов
/ 02 марта 2020

Попробуйте это:

     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, тогда будет еще проще: В чем разница между ExecuteScalar, ExecuteReader и ExecuteNonQuery?

...