将订单数据保存到本地数据库

我正在使用C#来创建Windows表单应用程序。 如何创建本地数据库表以保存下面描述的数据? 目前,我的数据表包含“inv_Id”,“Item_Id”和“quantity”列。 我知道我需要创建列来存储下面的每个数据项,但我不知道如何构造表。

  • item = {chair,table,pen,thumbdrive}
  • 价格= {5,10,2,48}
  • 小计

我是C#的新手。 我搜索了这个,发现了像https://www.youtube.com/watch?v=I5qvyyhUKfY这样的内容

数据显示在列表框中,如下所示:

订购物品:椅子价格:$ 5.00
订购物品:表价格:10.00美元
订购物品:笔价格:2.00美元
订购物品:thumbdrive价格:$ 48.00

小计:65.00美元税:3.90美元总计:68.90美元

我的目的是创建发票,然后在计算所有内容后将其保存在数据库中。

这是我将数据从db加载到下拉列表中的数据的代码(供用户选择他们想要购买的项目),然后(cust selected item将列在listOuput框中进行计算)用户将选择item,然后列表框将显示所选输出并像收据一样计算总数。

在计算之后,我希望将listOutput框中的所有数据存储到我的数据库,但我在这里遇到问题。

问题:我不知道如何将所有数据从列表框移动到数据库,并在结构中将它们链接在一起。

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(); } } } } 

我假设您将数据保存到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结构不足以表示单个项目(您能说出原因吗?)。 现在你把事物作为数据串传递。 您需要使用真实对象来掌握OOP的function。
  • 删除表单顶部的SqlConnection声明。 您不希望连接对象只是坐在一起。 using块确保有限的使用寿命,并且对象被关闭并正确处理。 如果您在其他地方使用此对象(例如,要获取显示您的用户的项目列表),则需要修改该代码以使用此模式。
  • 确定将itemID,小计,税金和总计纳入此方法的好方法。 您可以将它们作为参数传递,也可以使用对象。

无论是我发布的代码还是已经发布的代码,都可以进行很多改进。 这仅仅意味着基本function。 以下是我作为练习留给您的内容,但您应该这样做:

  • error handling
  • 创建适当的项目对象集合并将其绑定到UI元素
  • 从项目对象获取静态数据,如price和itemID,而不是从UI元素中获取(ComboBox和ListBox)
  • 更熟悉数据库交互function,以便了解其工作原理