2015-03-13 3 views
0

Я использую C# для создания приложения формы Windows. Как создать таблицу локальной базы данных для сохранения данных, описанных ниже? В настоящее время моя таблица данных состоит из столбцов «inv_Id», «Item_Id» и «количество». Я знаю, что мне нужно создать столбцы для хранения каждого элемента данных ниже, но я не знаю, как структурировать таблицу.Сохраните данные для заказа в локальной базе данных

  • пункт = {стул, стол, ручки, флэшки}
  • Цена = {} 5,10,2,48
  • субтотальная
  • налог
  • общая

I Я новичок на C#. Я сделал поиск по этому вопросу и нашел такие вещи, как например. https://www.youtube.com/watch?v=I5qvyyhUKfY

Данные представлены в списке и выглядит следующим образом:

Заказанный товара: стул Цена: $ 5.00
Заказанный товара: стол Цена: $ 10,00
Заказанный товара: ручка Цена: $ 2,00
Заказанный товар: флэшки Цена: $ 48,00

Итого: $ 65,00 НДС: $ 3,90 Итого: $ 68,90

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

Вот код, который я получаю, данные загружают данные из db в выпадающий список (для того, чтобы пользователь мог выбрать, какой элемент они хотят купить), тогда (cust, выбранный элемент будет указан в спискеOuput для вычисления) пользователь выберет элемент, затем в окне списка отобразится выбранный вывод и рассчитайте общее количество, например, квитанцию.

После вычисления, я хочу сохранить все данные в поле списка ввода для моего db, но у меня проблема здесь.

Проблема: я не знаю, как переместить все мои данные из списка в базу данных и связать их вместе в структуре.

public partial class Select_Item : Form 
{ 
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\oo\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30"); 
    SqlDataAdapter da = new SqlDataAdapter(); 
    DataTable dt = new DataTable(); 

    public struct Orders 
    { 
     public string item; 
     public double price;   
    } 

    const double TAX=0.06; 
    Orders order = new Orders(); 
    static double subtotal=0; 
    static double totalTaxes=0; 
    static double total; 
    string finalBill = "FINAL BILL: \n"; 

    public Select_Item() 
    { 
     InitializeComponent();  
    } 

    private void getValues(string custOrder) 
    {   
     order.item = custOrder; 

     String a = comboBox1.Text; 
     order.price = Convert.ToDouble(custOrder); 
     listOutput.Items.Add("Price: " + order.price); 

     finalBill += "Ordered Item: " + a + "\nPrice: " + order.price.ToString("C2") + "\n"; 
     updateBill();   
    } 

    private void updateBill() 
    { 
     subtotal += order.price; 
     total += order.price + (order.price * TAX); 
     totalTaxes += order.price * TAX; 
     listOutput.Items.Clear(); 
     listOutput.Items.AddRange(finalBill.Split('\n')); 
     listOutput.Items.Add("Subtotal:" + subtotal.ToString("C2")); 
     listOutput.Items.Add("Tax:" + totalTaxes.ToString("C2")); 
     listOutput.Items.Add("Total:" + total.ToString("C2")); 
    } 
    private void dropdownSelection(object sender, EventArgs e) 
    { 
     if (sender == comboBox1) 
     System.Diagnostics.Debug.WriteLine("test " + comboBox1.SelectedValue.ToString());  
     getValues(comboBox1.SelectedValue.ToString()); 
    } 

Отредактировано Код:

private void StoreData() 
     { 
      int invoiceID; 


      using (var con1 = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\choo\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30")) 
      { 
       con.Close(); 
       con.Open(); 
       using (var cmd = con.CreateCommand()) 
       { 
        cmd.CommandText = @"insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total); select SCOPE_IDENTITY() as InvoiceID;"; 
        cmd.Parameters.AddWithValue("@subtotal", subtotal); 
        cmd.Parameters.AddWithValue("@tax", tax); 
        cmd.Parameters.AddWithValue("@total", total); 
        using (var reader = cmd.ExecuteReader()) 
        { 
         if (reader.Read()) 

          invoiceID = (int)reader["InvoiceID"]; 

        } 
       } 
       foreach (var item in OrderItems.Rows) 
       { 
        using (var cmd = con.CreateCommand()) 
        { 

         cmd.CommandText = @"insert into InvoiceItem(invoiceID,Item_Id,quantity) values (@invoiceID,@Item_Id,@quantity);"; 
         // cmd.Parameters.AddWithValue("@InvoiceID", invoiceID); 
         cmd.Parameters.AddWithValue("@invoiceID", Convert.ToInt32("invoiceID")); 
         cmd.Parameters.AddWithValue("@Item_Id", Convert.ToInt32("Item_Id")); 
         cmd.Parameters.AddWithValue("@quantity", Convert.ToInt32("quantity")); 
         cmd.ExecuteNonQuery(); 



        } 
       } 
      } 
     } 
+0

Я отредактировали questi чтобы указать, что вы сохраняете данные в базе данных SQL. Это звучит так, как будто это так, но если вы не используете SQL, отредактируйте свой вопрос, чтобы сказать, как вы храните данные. Кроме того, я не уверен, что вы спрашиваете только о том, как структурировать таблицу SQL, а также о том, как перемещать данные внутри приложения winforms. Не могли бы вы объяснить немного больше? –

ответ

0

Я предполагаю, что вы сохраняете данные в базу данных SQL. Таблицы счетов и таблиц разделяют отношения «многие-многие», поэтому вы должны использовать третью таблицу для их объединения.

  • Счет: InvoiceID, субтотальная, налог, общая
  • товара: Itemid, цена
  • InvoiceItem: invoiceItemID, InvoiceID, Itemid, количество

InvoiceItem таблица имеет внешние ключи к другой два.Таким образом, вы сохраняете свои данные и данные о товарах отдельно и чистыми; нет никаких проблем с 10 различными «ручками», потому что 10 разных заказов включали ручку.

Обратите внимание, что вы можете рассчитать Invoice.subtotal, выбрав все элементы из этого счета и вычислив сумму количества * цены. Я рекомендую включить его в таблицу счетов для удобства.

Чтобы получить заказ в базу данных, вы хотите что-то вроде этого:

private void StoreData() 
{ 
    int invoiceID; 
    using(var con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\oo\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30")) 
    { 
    con.Open(); 
    using(var cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = @"insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total); select SCOPE_IDENTITY() as InvoiceID;"; 
     cmd.Parameters.AddWithValue("@subtotal",subtotal); 
     cmd.Parameters.AddWithValue("@tax",tax); 
     cmd.Parameters.AddWithValue("@total",total); 
     using(var reader = cmd.ExecuteReader()) 
     { 
     if(reader.Read()) 
      invoiceID = cmd.GetInt32("InvoiceID"); 
     } 
    } 
    foreach(var item in orderItems) 
    { 
     using(var cmd = con.CreateCommand()) 
     { 
     cmd.CommandText = @"insert into InvoiceItem(InvoiceID,ItemID,quantity) values (@InvoiceID,@ItemID,@quantity);"; 
     cmd.Parameters.AddWithValue("@InvoiceID",invoiceID); 
     cmd.Parameters.AddWithValue("@ItemID",item.ItemID); 
     cmd.Parameters.AddWithValue("@quantity",item.Quantity); 
     cmd.ExecuteNonQuery(); 
     } 
    } 
    } 
} 

Пожалуйста, понять это идея рудиментарные, голые кости, что вам нужно сделать. Я также написал это, не проверив его в среде IDE, так что может быть ошибка или две. Важно отметить, что он несовместим с вашим существующим кодом. Вот что вам нужно сделать, чтобы это сделать в:

  • Создайте коллекцию предметов для своего заказа под названием orderItems. Каждый элемент в этой коллекции должен быть своего рода объектом, который представляет строку в вашем ListBox. Обратите внимание, что вашей структуры OrderItems недостаточно для представления одного элемента (можете ли вы объяснить почему?). Прямо сейчас вы передаете вещи как строки данных. Вам нужно работать с подлинными объектами, чтобы получить ручку от мощности ООП.
  • Удалите декларацию SqlConnection в верхней части формы. Вы не хотите, чтобы объекты соединения просто сидели. Блоки using обеспечивают ограниченный срок службы и что объект закрывается и удаляется надлежащим образом. Если вы используете этот объект в другом месте (например, чтобы получить список элементов для показа вашего пользователя), вам необходимо изменить этот код, чтобы использовать этот шаблон.
  • Определение хорошего способа получить itemID, промежуточный итог, налог и сумма в этот метод. Вы можете передать их в качестве параметров или использовать объекты.

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

  • Обработка ошибок
  • Создание надлежащего сбора объектов элементов и привязки их к элементам пользовательского интерфейса
  • Получение статических данных, таких как цена и Itemid из объектов элементов, а не из элементов пользовательского интерфейса (ComboBox и ListBox)
  • Получение более подробного ознакомления с функциональными возможностями взаимодействия с базой данных, так что вы можете понять, как это работает
+0

Да, я создал таблицу, как указано выше, но я извлекаю данные для «Всего», а затем помещаю в таблицу счетов столбца «total» и т. Д. Мне нужно сделать какое-то условие, чтобы извлечь данные и поместить их в каждую из соответствующие столбцы – user4562396

+0

Выполняйте все вычисления внутри приложения winforms и просто сохраните каждый номер в столбце SQL в таблице счетов. Это упростит работу с вашей базой данных для таких вещей, как отправка экземпляров счетов-фактур клиентам. –

+0

Да, я уже делаю расчет, но я хочу сохранить свои данные в db, я могу рассчитать сейчас, но не хранить. Я разместил свой код, как указано выше. – user4562396

Смежные вопросы