1

我有一个包含超过 1 个表的 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) 并将其值设置为AuthorIncomesCashFlow 表

2- 为所有员工选择 Sum(DailyIncome) 并将其值设置为EmployeesIncomesCashFlow 表

3- 为在选定日期售出的所有书籍选择 Sum(BuyPrice) 并将其值设置为BooksBuyPrice现金流表

4-在 CashFlow 表中设置用户OpeningAmount的价值OpeningAmount

5-在 CashFlow 表中设置用户ClosingAmount的价值ClosingAmount

6- DailyResult 字段必须等于 ((ClosingAmount - OpeningAmount - AuthorIncomes - EmployeesIncomes - BooksBuyPrice)

然后我必须在 CashFlow 表中插入一条具有上述值的新记录。

我怎样才能做到这一点?

注意:我的应用程序是 Visual Studio 2010 下连接到 Access 2007 数据库的 C# .NET 应用程序。

4

1 回答 1

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) 重复此操作。

计算 Books 的 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. (参数名称被忽略,这就是为什么我没有在这里使用它们的原因,尽管对于具有大量参数的查询,名称有时仍然可以帮助我们人类保持直截了当。)

于 2013-04-19T12:03:38.787 回答