编写Access查询有多个SELECT语句

时间:2013-04-19 08:29:35

标签: ms-access ms-access-2007

我有一个包含多个表的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(Da​​ilyIncome)并将其值设置为CashFlow Table中的AuthorIncomes

2-为所有员工选择Sum(Da​​ilyIncome)并在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应用程序。

1 个答案:

答案 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(Da​​ilyIncome)。

计算书籍的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中显示的顺序指定它们。 (参数名称被忽略,这就是为什么我没有在这里使用它们,虽然对于具有大量参数的查询,名称有时仍然可以帮助我们为人类保持直接。)