保存订单数据到本地数据库
Save order data to local database
我正在使用 C# 创建一个 Windows 表单应用程序。如何创建一个本地数据库 table 来保存下面描述的数据?目前我的数据 table 由 "inv_Id"、"Item_Id" 和 "quantity" 列组成。我知道我需要创建列来存储下面的每个数据项,但我不知道如何构建 table.
- item={椅子,table,笔,拇指驱动器}
- 价格={5,10,2,48}
- 小计
- 税收
- 总计
我是 C# 新手。我搜索了一下,发现了诸如 https://www.youtube.com/watch?v=I5qvyyhUKfY
之类的东西
数据显示在列表框中,如下所示:
Ordered Item:chair Price:.00
Ordered Item:table Price:.00
Ordered Item:pen Price:.00
Ordered Item:thumbdrive Price:.00
Subtotal:.00 Tax:.90 Total:.90
我的目的是创建发票,然后在计算完所有内容后将其保存在数据库中。
这是我获取数据的代码,将数据从数据库加载到下拉列表中(供用户 select 他们想购买的商品),然后(cust selected item将列在 listOuput 框中用于计算)用户将 select 项目,然后列表框将显示 selected 输出并像收据一样计算总数。
经过计算,我想把listOutput box的所有数据都存到我的数据库中,但是我这里有问题。
Problem: I do not know how to move all my data from list box to
database, and link them together in the structure.
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());
}
Edited Code:
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 数据库中。您的发票和商品 table 共享多对多关系,因此您应该使用第三个 table 来 link 它们。
- 发票:发票 ID、小计、税、总计
- 商品:itemID,价格
- InvoiceItem:invoiceItemID、invoiceID、itemID、数量
InvoiceItem table 有其他两个的外键。通过这种方式,您可以使发票和项目数据保持分离和清洁;有 10 种不同的 "pen" 物品,因为 10 种不同的订单包括一支笔。
请注意,您可以通过选择该发票中的所有项目并计算数量 * 价格之和来计算 Invoice.subtotal。为了方便起见,我建议将其包含在发票中 table。
要将订单输入数据库,您需要这样的东西:
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
。此集合中的每一项都应该是某种对象,代表列表框中的一行。请注意,您的 OrderItems 结构不足以表示单个项目(您能说出原因吗?)。现在,您正在将事物作为数据字符串传递。您需要使用真正的对象才能掌握 OOP 的强大功能。
- 删除表单顶部的 SqlConnection 声明。您不希望只是闲置的连接对象。
using
块确保有限的生命周期,并确保对象被关闭并正确处理。如果您在其他地方使用此对象(例如获取项目列表以显示给您的用户),则需要修改该代码以使用此模式。
- 正在确定一种将 itemID、小计、税金和总计获取到此方法中的好方法。您可以将它们作为参数传递,也可以使用对象。
可以对我发布的代码和您已有的代码进行很多改进。这仅足以满足基本功能。以下是我留给您作为练习但您应该做的事情:
- 错误处理
- 创建项目对象的适当集合并将其绑定到您的 UI 元素
- 从项目对象中获取价格和 itemID 等静态数据,而不是从 UI 元素(ComboBox 和 ListBox)中获取
- 更加熟悉数据库交互功能,从而了解其工作原理
我正在使用 C# 创建一个 Windows 表单应用程序。如何创建一个本地数据库 table 来保存下面描述的数据?目前我的数据 table 由 "inv_Id"、"Item_Id" 和 "quantity" 列组成。我知道我需要创建列来存储下面的每个数据项,但我不知道如何构建 table.
- item={椅子,table,笔,拇指驱动器}
- 价格={5,10,2,48}
- 小计
- 税收
- 总计
我是 C# 新手。我搜索了一下,发现了诸如 https://www.youtube.com/watch?v=I5qvyyhUKfY
之类的东西数据显示在列表框中,如下所示:
Ordered Item:chair Price:.00
Ordered Item:table Price:.00
Ordered Item:pen Price:.00
Ordered Item:thumbdrive Price:.00Subtotal:.00 Tax:.90 Total:.90
我的目的是创建发票,然后在计算完所有内容后将其保存在数据库中。
这是我获取数据的代码,将数据从数据库加载到下拉列表中(供用户 select 他们想购买的商品),然后(cust selected item将列在 listOuput 框中用于计算)用户将 select 项目,然后列表框将显示 selected 输出并像收据一样计算总数。
经过计算,我想把listOutput box的所有数据都存到我的数据库中,但是我这里有问题。
Problem: I do not know how to move all my data from list box to database, and link them together in the structure.
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());
}
Edited Code:
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 数据库中。您的发票和商品 table 共享多对多关系,因此您应该使用第三个 table 来 link 它们。
- 发票:发票 ID、小计、税、总计
- 商品:itemID,价格
- InvoiceItem:invoiceItemID、invoiceID、itemID、数量
InvoiceItem table 有其他两个的外键。通过这种方式,您可以使发票和项目数据保持分离和清洁;有 10 种不同的 "pen" 物品,因为 10 种不同的订单包括一支笔。
请注意,您可以通过选择该发票中的所有项目并计算数量 * 价格之和来计算 Invoice.subtotal。为了方便起见,我建议将其包含在发票中 table。
要将订单输入数据库,您需要这样的东西:
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
。此集合中的每一项都应该是某种对象,代表列表框中的一行。请注意,您的 OrderItems 结构不足以表示单个项目(您能说出原因吗?)。现在,您正在将事物作为数据字符串传递。您需要使用真正的对象才能掌握 OOP 的强大功能。 - 删除表单顶部的 SqlConnection 声明。您不希望只是闲置的连接对象。
using
块确保有限的生命周期,并确保对象被关闭并正确处理。如果您在其他地方使用此对象(例如获取项目列表以显示给您的用户),则需要修改该代码以使用此模式。 - 正在确定一种将 itemID、小计、税金和总计获取到此方法中的好方法。您可以将它们作为参数传递,也可以使用对象。
可以对我发布的代码和您已有的代码进行很多改进。这仅足以满足基本功能。以下是我留给您作为练习但您应该做的事情:
- 错误处理
- 创建项目对象的适当集合并将其绑定到您的 UI 元素
- 从项目对象中获取价格和 itemID 等静态数据,而不是从 UI 元素(ComboBox 和 ListBox)中获取
- 更加熟悉数据库交互功能,从而了解其工作原理