C# 循环访问数据表中的行

本文关键字:数据表 循环 访问 | 更新日期: 2023-09-27 18:36:11

我正在尝试遍历 2 列表中的行,以根据名称检查每行中的 1 个字段。找到后,我想编写代码将相应的数字分配给 OurNumber 变量,并通过将 GotTheNumber 设置为 true 来打破循环。

以下是我正在使用的代码:

    private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
    {            
        ConfirmDeleteEMP form = new ConfirmDeleteEMP();
        DataTable table = new DataTable();
        string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|''HoliPlanData.accdb;Persist Security Info=False";
        using (OleDbConnection conn = new OleDbConnection(connstring))
        {
            string query = "SELECT PayrollNo, (FirstName + ' ' + LastName) AS NAME FROM [Employee]";                 
            OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
            adapter.Fill(table);                                        
        }
        string SelectedName = DropBoxEmp.Text;            
        bool GotTheNumber = false;
        int OurNumber = 0;
        while (!GotTheNumber)
        {
            foreach (DataRow ThisRow in table.Rows)
            {
                if (SelectedName = (table.Rows[ThisRow])) 
                {
                    OurNumber = ///THATNUMBER///;
                    GotTheNumber = true;
                }  
            }
        }
        MessageBox.Show(SelectedName);
        var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());
        form.PassValueName = SelectedName;
        form.PassSelectedPayroll = GoodNumber;               
        form.Tag = this;
        form.Show(this);
        Hide();
    }

我不知道从 If 语句中去哪里,所以任何帮助将不胜感激。

C# 循环访问数据表中的行

遍历客户端程序中的行正是您不想做的。让数据库为您完成这项工作。试试这个:

private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
{     
    object result;       
    string query = "SELECT PayrollNo FROM [Employee] WHERE FirstName + ' ' + LastName = ?"; 
    string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|''HoliPlanData.accdb;Persist Security Info=False";
    using (OleDbConnection conn = new OleDbConnection(connstring))
    using (OleDbCommand cmd = new OleDbCommand(query, conn))
    {
        //guessing at type and length here
        cmd.Parameters.Add("?", OleDbType.VarWChar, 50).Value = DropBoxEmp.Text;
        conn.Open();
        result = cmd.ExecuteScalar();                                        
    }
    if (result != null && result != DBNull.Value)
    {
        ConfirmDeleteEMP form = new ConfirmDeleteEMP();
        form.PassValueName = DropBoxEmp.Text;
        form.PassSelectedPayroll = (int)result;
        form.Tag = this;
        form.Show(this);
        Hide();
    }                    
}

如果你真的想不顾一切原因遍历行(它更慢,需要编写更多的代码,而且更容易出错),你可以这样做:

private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
{                   
    DataTable table = new DataTable();
    string query = "SELECT PayrollNo, (FirstName + ' ' + LastName) AS NAME FROM [Employee]"; 
    string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|''HoliPlanData.accdb;Persist Security Info=False";
    using (OleDbConnection conn = new OleDbConnection(connstring))
    {                    
        OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
        adapter.Fill(table);                                        
    }
    int PayrollNumber = 0;
    foreach (DataRow ThisRow in table.Rows)
    {
        if (DropBoxEmp.Text == ThisRow["NAME"])
        {
            PayrollNumber = (int)ThisRow["PayrollNo"];
            break;
        }  
    }
    //the whole loop could also be consolidated to this:
    //PayrollNumber = (int)table.Rows.First(r => r["NAME"] == DropBoxEmp.Text)["PayrollNo"];
    ConfirmDeleteEMP form = new ConfirmDeleteEMP();
    form.PassValueName = DropBoxEmp.Text;
    form.PassSelectedPayroll = PayrollNumber ;               
    form.Tag = this;
    form.Show(this);
    Hide();
}

嗯,很难猜到你的问题到底是什么。但我认为您只想从当前行中获取工资单编号,不是吗?

关于更往下的线...

var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());

。我想你可以打电话:

if (...)
{
    OurNumber = ThisRow["PayrollNo"].ToString();
    GotTheNumber = true;
}

但是,我不知道您在使用以下 if 条件做什么,以及这是否真的可以满足您的要求:

if (SelectedName = (table.Rows[ThisRow]))
{
...
}