我有一个包含多个表的Access数据库。
我需要从多个表中选择多个值,然后将它们插入另一个表中。
实施例
Table: CashFlow with Fields(ID, Date, BooksBuyPrice, AuthorIncomes,
EmployeesIncomes, OpeningAmount, ClosingAmount, DailyResult)
Table: Books with Fields(ID, Name, AuthorID, BuyPrice, SellPrice, IsSold, SellDate)
Table: Author with Fields(ID, Name, DailyIncome)
Table: Employee with Fields(ID, Name, DailyIncome)
Note: User Must Insert OpeningAmount And ClosingAmount
我需要:
1-为所有作者选择Sum(DailyIncome)并将其值设置为CashFlow Table中的AuthorIncomes
2-为所有员工选择Sum(DailyIncome)并在CashFlow表中将其值设置为EmployeesIncomes
3-选择在所选日期销售的所有图书的总和(BuyPrice),并在CashFlow表中将其值设置为BooksBuyPrice
4-在CashFlow表中将用户OpeningAmount
的值设置为OpeningAmount
5-在CashFlow表中将用户ClosingAmount
的值设置为ClosingAmount
6- DailyResult字段必须等于((ClosingAmount - OpeningAmount - AuthorIncomes - EmployeesIncomes - BooksBuyPrice)
然后我必须在CashFlow表中插入一条带有上述值的新记录。
我该怎么做?
注意:我的应用程序是连接到Access 2007数据库的Visual Studio 2010下的C#.NET应用程序。
答案 0 :(得分:1)
好的,我们将介绍几个基本任务,然后您可以根据您的具体要求充实代码。
我们首先打开与数据库的连接:
var con = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\__tmp\accounting.accdb;");
con.Open();
现在,我们将计算所有作者的SUM(DailyIncome),并将其存储在变量中
var cmd = new System.Data.OleDb.OleDbCommand("SELECT SUM(DailyIncome) FROM Author", con);
decimal SumOfDailyIncomeAuthors = (decimal)cmd.ExecuteScalar();
您可以为所有员工重复Sum(DailyIncome)。
计算书籍的SUM(BuyPrice)基本相同,但您必须指定SellDate:
cmd = new System.Data.OleDb.OleDbCommand("SELECT SUM(BuyPrice) FROM Books WHERE SellDate = ?", con);
cmd.Parameters.AddWithValue("?", new DateTime(2013, 4, 18));
decimal SumOfBuyPrice = (decimal)cmd.ExecuteScalar();
您已经在表单上的文本框中打开了OpeningAmount和ClosingAmount,因此您可以执行其余计算并在[CashFlow]表中插入一个新行,如下所示:
cmd = new System.Data.OleDb.OleDbCommand("INSERT INTO CashFlow (AuthorIncomes, BooksBuyPrice, OpeningAmount, ClosingAmount) VALUES (?, ?, ?, ?)", con);
cmd.Parameters.AddWithValue("?", SumOfDailyIncomeAuthors);
cmd.Parameters.AddWithValue("?", SumOfBuyPrice);
cmd.Parameters.AddWithValue("?", txtOpeningAmount.Text);
cmd.Parameters.AddWithValue("?", txtClosingAmount.Text);
cmd.ExecuteNonQuery();
请注意,对于ACE.OLEDB,在添加OleDbCommand.Parameters
时,您必须按照它们在CommandText
中显示的顺序指定它们。 (参数名称被忽略,这就是为什么我没有在这里使用它们,虽然对于具有大量参数的查询,名称有时仍然可以帮助我们为人类保持直接。)