Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#遍历数据表中的行_C#_Datatable - Fatal编程技术网

C#遍历数据表中的行

C#遍历数据表中的行,c#,datatable,C#,Datatable,我正在尝试遍历一个2列表中的行,以对照一个名称检查每行中的1个字段。一旦找到,我想编写代码将相应的数字分配给OurNumber变量,并通过将gottenumber设置为true来打破循环 下面是我正在使用的代码: private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form { ConfirmDeleteEMP form

我正在尝试遍历一个2列表中的行,以对照一个名称检查每行中的1个字段。一旦找到,我想编写代码将相应的数字分配给OurNumber变量,并通过将gottenumber设置为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声明中可以得到什么,因此非常感谢您的帮助。

嗯,很难猜到您到底有什么问题。但是我想你只是想从现在这一行拿到薪水,不是吗

关于下一条线

var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());
。。。我想你可以打电话:

if (...)
{
    OurNumber = ThisRow["PayrollNo"].ToString();
    GotTheNumber = true;
}
但是,我不知道您对以下if条件做了什么,也不知道这是否真的符合您的要求:

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

嗯,很难猜出你到底有什么问题。但是我想你只是想从现在这一行拿到薪水,不是吗

关于下一条线

var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());
。。。我想你可以打电话:

if (...)
{
    OurNumber = ThisRow["PayrollNo"].ToString();
    GotTheNumber = true;
}
但是,我不知道您对以下if条件做了什么,也不知道这是否真的符合您的要求:

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

循环浏览客户端程序中的行正是您不想做的事情。让数据库为您完成这项工作。试试这个:

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();
}

循环浏览客户端程序中的行正是您不想做的事情。让数据库为您完成这项工作。试试这个:

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();
}

嗨,Joel,我喜欢让数据库帮我检查的想法,刚刚尝试了最上面的代码,但在“form.PassSelectedPayroll=(int)result”行中将int转换为字符串时出现语法错误;这是什么原因?因为您将
PassSelectedPayroll
属性定义为字符串。嗨,Joel,我喜欢让数据库为我检查的想法,刚刚尝试了最上面的代码,但在“form.PassSelectedPayroll=(int)result”行中得到了将int转换为字符串的语法错误;这是什么原因?因为您将
PassSelectedPayroll
属性定义为字符串。