TheBigBearNow Ответов: 1

Как восстановить id из таблицы, которая автоматически создает id


Привет всем,
У меня есть свой код, чтобы я мог создать новую квитанцию далее я должен добавить свой список продуктов в другую таблицу, связанную с моим receiptId, но моя база данных автоматически создает receiptId, и единственный способ прочитать квитанцию из базы данных-это если у меня есть receiptId, так как бы я получил receiptId, чтобы я мог вставить свой список имен в другую таблицу, связав их вместе?

private void BtnConfirmCart_Click(object sender, RoutedEventArgs e)
        {
            if (listOfP.Count != 0) //!= null?
            {
                string msg = "Are you sure you CONFIRM your cart?";
                MessageBoxResult boxResult = MessageBox.Show(msg, "Confirmation", MessageBoxButton.YesNo);
                if(boxResult == MessageBoxResult.Yes)
                {
                    //Confirm cart /Add to SQL(Create Receipt, Create Product List) /Go to receipt.
                    try
                    {
                        date = DateTime.Now;
                        decimal total = receiptCart.ReceiptTotal;
                        int userid = customer.UserId;
                        Extras.CreateReceipt(userid, total, date);


                    }
                    catch(Exception ex) { MessageBox.Show(ex.Message.ToString()); }

                    Window WindowReceipt = new ReceiptWindow();
                    WindowReceipt.Show();
                    Close();
                }
            }
            else
            {
                BtnGoBack.Visibility = Visibility.Hidden;
                MessageBox.Show("No items in your cart.", "Add items.");
            }
        }
//Create Receipt int or void (Receipt receipt)
        public static int CreateReceipt(int userid, decimal rtotal, DateTime rdate)
        {
            int result = -1;
            using(SqlConnection connection = ConnectionString.GetSqlConnection())
            {
                string sqlCreate = "INSERT INTO Orders(UserId, ReceiptDate, ReceiptTotal) " +
                                               "VALUES(@uid, @date, @rtotal)";
                using(SqlCommand cmdCreate = new SqlCommand(sqlCreate, connection))
                {
                    //cmdCreate.Parameters.AddWithValue("@rid", receipt.ReceiptID);
                    cmdCreate.Parameters.AddWithValue("@uid", userid);
                    cmdCreate.Parameters.AddWithValue("@date", rdate);
                    cmdCreate.Parameters.AddWithValue("rtotal", rtotal);
                    try
                    {
                        connection.Open();
                        result = Convert.ToInt32(cmdCreate.ExecuteScalar());
                    }
                    catch(Exception ex) { throw ex; }
                }                
            }
            return result;
        }
        //Read Receipt
        public static Receipt ReadReceipt(int receiptID)
        {
            Receipt receipt = new Receipt();
            using(SqlConnection connection = ConnectionString.GetSqlConnection())
            {
                string sqlRead = "SELECT * FROM Receipts WHERE ReceiptId = @rid";
                using(SqlCommand cmdRead = new SqlCommand(sqlRead, connection))
                {
                    cmdRead.Parameters.AddWithValue("@rid", receiptID);
                    connection.Open();
                    using(SqlDataReader reader = cmdRead.ExecuteReader())
                    {
                        if(reader != null)
                        {
                            while (reader.Read())
                            {
                                receipt.ReceiptID = Convert.ToInt32(reader["ReceiptId"].ToString());
                                receipt.UserId = Convert.ToInt32(reader["UserId"].ToString());
                                receipt.ReceiptDate = Convert.ToDateTime(reader["ReceiptDate"].ToString());
                                receipt.ReceiptTotal = Convert.ToDecimal(reader["ReceiptTotal"].ToString());
                            }
                        }
                    }
                }
            }
            return receipt;
        }
//THIS IS MY PLAN TO READ PRODUCTLIST TABLE NOT SURE IF THIS WILL WORK YET
//Retreive all products in list from order
        public static List<ReturnReceiptProductList> GetReceiptProductList(int rid)
        {
            List<ReturnReceiptProductList> productList = new List<ReturnReceiptProductList>();
            ReturnReceiptProductList returnReceipt = new ReturnReceiptProductList();
            using (SqlConnection connection = ConnectionString.GetSqlConnection())
            {
                string sqlList = "SELECT * FROM OrdersList WHERE ReceiptId = @rid";
                using (SqlCommand cmdList = new SqlCommand(sqlList, connection))
                {
                    cmdList.Parameters.AddWithValue("@rid", rid);
                    connection.Open();
                    using (SqlDataReader reader = cmdList.ExecuteReader())
                    {
                        if (reader != null)
                        {
                            while (reader.Read())
                            {
                                Product product = new Product();
                                Receipt receipt = new Receipt();
                                receipt.ReceiptID = Convert.ToInt32(reader["ReceiptId"].ToString());
                                receipt.UserId = Convert.ToInt32(reader["UserId"].ToString());
                                //product.ProductId = Convert.ToInt32(reader["ProductId"].ToString());
                                product.ProductName = reader["ProductName"].ToString();
                                product.ProductQuantity = Convert.ToInt32(reader["ProductQuantity"].ToString());
                                product.ProductPrice = Convert.ToDecimal(reader["ProductPrice"].ToString());
                                product.ProductTax = Convert.ToDecimal(reader["ProductTax"].ToString());
                                returnReceipt = new ReturnReceiptProductList(product, receipt);
                                productList.Add(returnReceipt);
                            }
                        }
                    }
                }
            }
            return productList;


Что я уже пробовал:

вставка данных, но чтобы связать другую таблицу, мне нужен идентификатор, вставленный в то же окно, и я не могу читать из таблицы, потому что мне нужен этот конкретный идентификатор...

1 Ответов

Рейтинг:
6

Wendelius

Принято, что идентификатор создается с помощью определение идентичности[^] есть три системные функции, которые возвращают последнее вставленное значение идентификатора:
- @@IDENTITY (Transact-SQL) | Microsoft Docs[^]
- IDENT_CURRENT (Transact-SQL) | Microsoft Docs[^]
- SCOPE_IDENTITY (Transact-SQL) | Microsoft Docs[^]

Все они служат разным целям но в вашем конкретном случае @@IDENTITY должно дать вам правильное значение, если вы выполните его сразу после инструкции insert.

Простой способ получить это значение-выполнить следующий запрос. Он возвращает одну строку, содержащую последнее добавленное значение идентификатора

SELECT @@IDENTITY


TheBigBearNow

Я собираюсь попробовать это прямо сейчас, я уже видел @@identity раньше, но никогда не понимал его

TheBigBearNow

Похоже ли это на то, что я использую его правильно?

        public static int CreateReceipt(int userid, decimal rtotal, DateTime rdate)
        {
            int result = -1;
            using(SqlConnection connection = ConnectionString.GetSqlConnection())
            {
                string sqlCreate = "INSERT INTO Orders(UserId, ReceiptDate, ReceiptTotal) " +
                                               "VALUES(@uid, @date, @rtotal)";
                using(SqlCommand cmdCreate = new SqlCommand(sqlCreate, connection))
                {
                    //cmdCreate.Parameters.AddWithValue("@rid", receipt.ReceiptID);
                    cmdCreate.Parameters.AddWithValue("@uid", userid);
                    cmdCreate.Parameters.AddWithValue("@date", rdate);
                    cmdCreate.Parameters.AddWithValue("rtotal", rtotal);
                    try
                    {
                        connection.Open();
                        string sqlSELECT = "SELECT @@IDENTITY FROM Orders";
                        cmdCreate.ExecuteNonQuery();
                        SqlCommand cmdSelect = new SqlCommand(sqlSELECT, connection);
                        result = Convert.ToInt32(cmdSelect.ExecuteScalar());

                    }
                    catch(Exception ex) { throw ex; }
                }                
            }
            return result;
        }

Wendelius

В принципе, выглядит хорошо, но я думаю, что есть небольшое недоразумение. То @@IDENTITY не возвращает вставленное значение на основе строки, а просто возвращает одно значение. Поэтому, когда вы спрашиваете вот так

SELECT @@IDENTITY FROM Orders
Вы получите столько строк, сколько есть в таблице заказов, и одно и то же значение в каждой строке.

Таким образом, следующего должно быть достаточно (и использовать меньше ресурсов)
string sqlSELECT = "SELECT @@IDENTITY";SqlCommand cmdSelect = new SqlCommand(sqlSELECT, connection);result = Convert.ToInt32(cmdSelect.ExecuteScalar());

В качестве побочного примечания не забудьте использовать using заявления также для второй команды.

TheBigBearNow

Спасибо! я заставил его работать именно так, как я хотел, с тем, что вы сказали.

Wendelius

Рад быть полезным.