【问题标题】:C# populating dataTable in Visual Studio 2015 from table in MySQLC# 从 MySQL 中的表填充 Visual Studio 2015 中的 dataTable
【发布时间】:2016-07-12 04:35:52
【问题描述】:

我正在开发 Visual Studio 2015 中的一个程序,该程序从 MySQL 中的表中提取数据。我是 SQL 新手,所以我可能会以错误的方式一起解决这个问题。我需要的是基本上将表从 MySQL 模仿到 C# 应用程序中。我创建了一个名为 DataSet4 的新数据集,其中有一个名为 DataTable1 的表。该表有 2 列,ID 和名称。现在我的代码(如下所示)只从表中提取第一行。我将如何添加一个 foreach 循环来从 mySQL 中提取所有行?我希望我说得足够清楚,否则我会尽我所能尝试解释。它还有很多东西,但我觉得我可以从那里弄清楚。我确实尝试过设置一个直接拉表的数据集,但这一直冻结我的 Visual Studio。

private void button7_Click(object sender, EventArgs e)
    {
        try
        {
            cnC03.Open();
            s = "SELECT * FROM c03.tbl_kit t;";
            mcd = new MySqlCommand(s, cnC03);
            mdr = mcd.ExecuteReader();


            if (mdr.Read())
            {
                DataRow newDataRow = dataSet4.Tables["DataTable1"].NewRow();
                newDataRow["ID"] = mdr.GetString("ID");
                newDataRow["Name"] = mdr.GetString("Name");

                dataSet4.Tables["DataTable1"].Rows.Add(newDataRow);
            }
            else
            {
                MessageBox.Show("No Data");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            mdr.Close();
            cnC03.Close();
        }
    }

新代码:

private void button7_Click(object sender, EventArgs e)
    {
        try
        {
            s = "SELECT ID, Name FROM c03.tbl_kit";
            using (cnC03)
            using (MySqlCommand mcd2 = new MySqlCommand(s, cnC03))
            {
                cnC03.Open();
                using (MySqlDataReader mdr = mcd2.ExecuteReader())
                {
                    DataTable dt = new DataTable("DataTable1");
                    dt.Load(mdr);
                    dataSet4.Tables.Add(dt);


                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

【问题讨论】:

  • 您期望有多少行?此外,将您的资源包装在 using 块中
  • 我将为多个表执行此操作。例如,此表只有 3 行,但其他表有 20,000 多行。不熟悉 using 块。

标签: c# mysql visual-studio-2015


【解决方案1】:

如果您需要将查询返回的所有数据加载到 DataTable 中,那么您可以使用

大大缩短代码
s = "SELECT ID, Name FROM c03.tbl_kit";
mcd = new MySqlCommand(s, cnC03);
mdr = mcd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(mdr);

请参阅 DataTable.Load 上的 MSDN

请注意,如果您只需要两个字段,则应将输出中所需的确切列名称添加到查询文本中。

在您的代码中,我发现了一个潜在问题。您没有 MySqlConnection 的局部变量。这带来了一个大问题,因为连接是一次性对象,应该尽快创建、使用和处置。

我会写这样的东西

private void button7_Click(object sender, EventArgs e)
{
    try
    {
        s = "SELECT ID, Name FROM c03.tbl_kit";
        using(MySqlConnection cnn = new MySqlConnection(connectionstring))
        using(MySqlCommand mcd = new MySqlCommand(s, cnn))
        {
            cnC03.Open();
            using(MySqlDataReader mdr = mcd.ExecuteReader())
            {
                DataTable dt = new DataTable("DataTable1");
                dt.Load(mdr);            
                //.... use your table ....
                //.... or add it to the global dataset
                //.... of course this means that you haven't done it manually before
                dataSet4.Tables.Add(dt);


            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

【讨论】:

  • 我将尝试代码更改为以下,但它仍然只给了我 1 行。试试 {cnC03.Open(); s = "SELECT * FROM c03.tbl_kit t;"; mcd = new MySqlCommand(s, cnC03); mdr = mcd.ExecuteReader();数据表 dt = 新数据表(); dt.Load(mdr); }
  • 很抱歉,无法弄清楚如何将其隔开。
  • DataTable.Load(...) 加载 MySqlDataReader 返回的所有内容。如果您只有一行,则查询返回一行。 (cmets中的代码无法正确格式化)
  • 史蒂夫给了你使用块。此外,使用where 子句或LIMIT x,y 限制您的查询以进行分页。在某些情况下,您不能只加载所有行。
  • 当我运行“SELECT * FROM c03.tbl_kit t;”时在 MySQL 的表上它拉 3 行,
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 2017-07-10
  • 2021-03-24
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多