为什么我的代码在数据表中填充单元格时停止?
Why does my code stop when populating cells in a datatable?
我正在尝试将 accessDatabase 中的特定单元格数据写入数据表。我使用 SELECT 查询获取此数据,但是当将数据写入数据表中的特定单元格时,循环在迭代之前中断甚至一次,当它应该迭代两次时。
这是我正在使用的代码:
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";
string CountQuery = "SELECT COUNT(*) FROM [Holiday]";
string GetStartQuery = "SELECT StartDate FROM [Holiday] WHERE PayrollNo = @PayrollNo";
string GetEndQuery = "SELECT EndDate FROM [Holiday] WHERE PayrollNo = @PayrollNo";
string GetReasonQuery = "SELECT Reason FROM [Holiday] 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(CountQuery, conn);
CountRowsInHol.Parameters.AddWithValue("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
int HolidayCount = (int) (CountRowsInHol.ExecuteScalar()); //Uses CountQuery to Get HowMany lines are in [Holiday]
int LoopCount = 0;
while (LoopCount <= HolidayCount) //Will go though all Lines 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();
dt.Rows[LoopCount]["FirstDay"] = StartHold;
dt.Rows[LoopCount]["LastDay"] = EndHold;
dt.Rows[LoopCount]["Reason"] = ReasonHold;
LoopCount = LoopCount + 1;
}
}
我知道它很长,但它很基础。代码中断于 ..
dt.Rows[LoopCount]["FirstDay"] = StartHold;
..而不是写入数据表。
任何帮助或建议将不胜感激,而且我非常愿意接受关于更好地格式化我的代码的明确建议,以便它更容易阅读和更普遍标准。
不完全确定,但替换为:
会不会是个小错误
dt.Rows[LoopCount]["FirstDay"] = StartHold;
与:
dt.Rows[LoopCount].["FirstDay"] = StartHold;
也许我错了,但只想知道 dt.Rows[0] 是否包含字段 ["FirstDay"].
感谢您的帮助,CrowCoder 为我指明了正确的方向。我从不添加行!使用这段代码,一切都很好,所以希望其他新手编码员不会像我一样被卡住!
从 dt.rows[LoopCount] 替换为以下
DataRow NewLine = dt.NewRow();
NewLine["Hol/Abs"] = "Holiday";
NewLine["FirstDay"] = StartHold;
NewLine["LastDay"] = EndHold;
NewLine["TotalDays"] = (EndHold - StartHold);
NewLine["Reason"] = ReasonHold;
dt.Rows.Add(NewLine);
我正在尝试将 accessDatabase 中的特定单元格数据写入数据表。我使用 SELECT 查询获取此数据,但是当将数据写入数据表中的特定单元格时,循环在迭代之前中断甚至一次,当它应该迭代两次时。
这是我正在使用的代码:
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";
string CountQuery = "SELECT COUNT(*) FROM [Holiday]";
string GetStartQuery = "SELECT StartDate FROM [Holiday] WHERE PayrollNo = @PayrollNo";
string GetEndQuery = "SELECT EndDate FROM [Holiday] WHERE PayrollNo = @PayrollNo";
string GetReasonQuery = "SELECT Reason FROM [Holiday] 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(CountQuery, conn);
CountRowsInHol.Parameters.AddWithValue("@PayrollNo", OleDbType.Integer).Value = GotPayroll;
int HolidayCount = (int) (CountRowsInHol.ExecuteScalar()); //Uses CountQuery to Get HowMany lines are in [Holiday]
int LoopCount = 0;
while (LoopCount <= HolidayCount) //Will go though all Lines 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();
dt.Rows[LoopCount]["FirstDay"] = StartHold;
dt.Rows[LoopCount]["LastDay"] = EndHold;
dt.Rows[LoopCount]["Reason"] = ReasonHold;
LoopCount = LoopCount + 1;
}
}
我知道它很长,但它很基础。代码中断于 ..
dt.Rows[LoopCount]["FirstDay"] = StartHold;
..而不是写入数据表。 任何帮助或建议将不胜感激,而且我非常愿意接受关于更好地格式化我的代码的明确建议,以便它更容易阅读和更普遍标准。
不完全确定,但替换为:
会不会是个小错误dt.Rows[LoopCount]["FirstDay"] = StartHold;
与:
dt.Rows[LoopCount].["FirstDay"] = StartHold;
也许我错了,但只想知道 dt.Rows[0] 是否包含字段 ["FirstDay"].
感谢您的帮助,CrowCoder 为我指明了正确的方向。我从不添加行!使用这段代码,一切都很好,所以希望其他新手编码员不会像我一样被卡住!
从 dt.rows[LoopCount] 替换为以下
DataRow NewLine = dt.NewRow();
NewLine["Hol/Abs"] = "Holiday";
NewLine["FirstDay"] = StartHold;
NewLine["LastDay"] = EndHold;
NewLine["TotalDays"] = (EndHold - StartHold);
NewLine["Reason"] = ReasonHold;
dt.Rows.Add(NewLine);