【发布时间】:2016-03-08 12:41:45
【问题描述】:
Edit 2 Please Read:这是一个非常具体的问题,因为代码运行良好,只是无法正常工作我本来希望的。在发布答案或评论之前,请通读并确保您了解我需要帮助的地方。非常感激。
我是新手程序员/编码员。我正在尝试用所有员工假期的 Access 数据库表 中的选定员工假期的详细信息填充 DataTable。目前,使用查询,我的代码计算数据库的 [Holiday] 表中有多少个假期具有所选员工的 PayrollNo。从那里,它在程序的 DataTable 中填充新行,其中 第一个假期与关联的 PayrollNo 按员工已休的假期数量填充。
例如:Ben 有 3 个假期,但表格将在 3 行中填充他的第一个假期。
这表明程序正确计算了他的假期,但我在选择员工的每个假期时做错了。
它还显示它正在以我想要的格式写入表格。
我想要做的似乎很简单;让表格中填满 Ben 的所有 3 个假期,而不仅仅是他的第一个。
下面是我的代码部分,它对所选员工在[Holiday] 中的假期数进行循环迭代。
DataTable dt = new DataTable(); //Creates Table
dt.Clear();
dt.Columns.Add("Hol/Abs", typeof(string)); // Column 0
dt.Columns.Add("FirstDay", typeof(DateTime)); // Column 1
dt.Columns.Add("LastDay", typeof(DateTime)); // Column 2
dt.Columns.Add("TotalDays", typeof(int)); // Column 3
dt.Columns.Add("Reason", typeof(string)); // Column 4
LblName.Text = PassName; //Loads Name
string ConnString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
string Query = "SELECT PayrollNo FROM [Employee] WHERE (FirstName + ' ' + LastName) = @Name"; //Will supply selected Employee's PayrollNo
string CountHolQuery = "SELECT COUNT(*) FROM [Holiday] WHERE PayrollNo = @PayrollNo"; //Will count all of that Employee's Holidays
string CountAbsQuery = "SELECT COUNT(*) FROM [Absences] WHERE PayrollNo = @PayrollNo"; //Will count all of that Employee's Absences
string GetStartQuery = "SELECT StartDate FROM [Holiday] WHERE PayrollNo = @PayrollNo"; // Will select the start date of Holidays
string GetEndQuery = "SELECT EndDate FROM [Holiday] WHERE PayrollNo = @PayrollNo"; // Will select the start date of Absences
string GetReasonQuery = "SELECT Reason FROM [Holiday] WHERE PayrollNo = @PayrollNo";
string AbsGetStartQuery = "SELECT StartDate FROM [Absences] WHERE PayrollNo = @PayrollNo";
string AbsGetEndQuery = "SELECT EndDate FROM [Absences] WHERE PayrollNo = @PayrollNo";
string AbsGetReasonQuery = "SELECT Comments FROM [Absences] WHERE PayrollNo = @PayrollNo";
using (OleDbConnection conn = new OleDbConnection(ConnString))
using (OleDbCommand GetPayroll = new OleDbCommand(Query, conn))
{
conn.Open();
GetPayroll.Parameters.Add("@Name", OleDbType.VarChar).Value = LblName.Text;
int GotPayroll = Convert.ToInt32(GetPayroll.ExecuteScalar()); //Uses Query to Get PayrollNo
OleDbCommand CountRowsInHol = new OleDbCommand(CountHolQuery, conn);
OleDbCommand CountRowsInAbs = new OleDbCommand(CountAbsQuery, conn);
CountRowsInHol.Parameters.AddWithValue("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
CountRowsInAbs.Parameters.AddWithValue("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
int HolidayCount = (int) (CountRowsInHol.ExecuteScalar()); //Uses CountHolQuery to Get HowMany lines are in [Holiday]
int AbsenceCount = (int)(CountRowsInAbs.ExecuteScalar()); //Uses CountAbsQuery to Get HowMany lines are in [Absences]
int HolLoopCount = 1;
while (HolLoopCount <= HolidayCount) //Will go though all SelectedPayroll's holidays' in [Holiday]
{
OleDbCommand GetStart = new OleDbCommand(GetStartQuery, conn);
OleDbCommand GetEnd = new OleDbCommand(GetEndQuery, conn);
OleDbCommand GetReason = new OleDbCommand(GetReasonQuery, conn);
GetStart.Parameters.Add("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
GetEnd.Parameters.Add("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
GetReason.Parameters.Add("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
DateTime StartHold = Convert.ToDateTime(GetStart.ExecuteScalar());
DateTime EndHold = Convert.ToDateTime(GetEnd.ExecuteScalar());
string ReasonHold = (GetReason.ExecuteScalar()).ToString();
DataRow NewLine = dt.NewRow();
NewLine["Hol/Abs"] = "Holiday";
NewLine["FirstDay"] = StartHold;
NewLine["LastDay"] = EndHold;
NewLine["TotalDays"] = GetNoWeekends(StartHold,EndHold);
NewLine["Reason"] = ReasonHold;
dt.Rows.Add(NewLine);
HolLoopCount = HolLoopCount + 1;
}
dataGridView1.DataSource = dt;
dataGridView1.Refresh();
}
我的假设是,我必须遍历 [Holiday] 数据表本身,或者在代码中创建另一个数据表来存储所有关联的行,然后再从那里提取所显示表的详细信息。 任何帮助或建议将不胜感激。
编辑
我添加了其余代码来显示查询和过程。还要说明我是如何填写表格的,尽管概述了这不是问题发生的地方。
【问题讨论】:
-
您的代码听起来不必要地在同一数据上循环 N 次。相反,您将创建一个选择并一次性填充数据。您正在寻找的是 DataTable.Load( cmd.ExecuteReader() ) 或 adapter.Fill( datatable )。我更喜欢使用 Linq 来做这样的事情。
-
为朋友的建议干杯,问题是我已经用 C# 编写了这个项目的几乎所有代码,我的老板也要求我用 C# 来做。我的问题是在 1 个查询中选择多个值时,我不知道如何管理它们。它也是循环的,因为如果员工有超过 1 个假期,则需要多次执行查询+填充链。如果不清楚,问题是如何告诉程序不要选择它已经选择的行?
-
乔希,我可以向你保证,我已经阅读了你的原始问题和编辑内容:) 在我的回答中,我实际上向你展示了为什么你的问题不起作用,你错过了吗?您始终只使用 PayrollNo 作为标准来选择(标量为单个字段)相同的第一行数据。当您使用 ExecuteScalar 时,即使查询应该返回多行和多列,您也明确要求第一行的最左侧列数据。