【问题标题】:Returning all rows and columns返回所有行和列
【发布时间】:2012-02-01 15:27:57
【问题描述】:

我正在开发一个基本的 mysql 数据库类,它有几个函数。其中一个函数应返回所有行和列的列表。该代码正在运行,并且非常动态,但看起来还可以改进。我希望有人可以看看这段代码并告诉我是否有其他解决方案?

我尝试的其他解决方案之一是没有列表,但它涉及为它必须返回的每一行重新创建一个数组,所以我放弃了它并转向列表。

    public List<object[]> ReadAllRows(string sQuery)
    {
        List<object[]> oResults = new List<object[]>();

        try
        {
            MySqlCommand msCommand = new MySqlCommand
            {
                CommandText = sQuery,
                Connection = Connection
            };

            using (MySqlDataReader msReader = msCommand.ExecuteReader())
            {
                if(!msReader.HasRows)
                    return EmptyList;

                while (msReader.Read())
                {
                    object[] oRowValues = new object[msReader.FieldCount];
                    {
                        msReader.GetValues(oRowValues);
                    }

                    oResults.Add(new object[] { oRowValues });
                }
            }
        }
        catch (MySqlException ex)
        {
            LastError = "Error: " + ex;
            return EmptyList;
        }

        return oResults;
    }

如果有任何问题,请随时提问

【问题讨论】:

标签: c# .net mysql winforms


【解决方案1】:

我强烈建议不要这样做。

首先,您应该只在执行命令所需的时间内保持连接打开。此外,MySqlCommand 实现了 IDisposable,因此应该将其包装在 using 子句中。

我反对它的一个原因是这个功能已经被覆盖了。一种简单的方法是让您的方法只返回一个 DataTable。无论如何,DataTables 都会为您提供所需的所有信息(数据类型、行、列等),而您的信息非常有限。

另一个原因与保持开放连接有关:坏主意。连接池将非常快速地打开/关闭连接,因此没有必要。此外,如果您的应用程序崩溃,那么您将泄漏连接。在某些时候,您最终会遇到奇妙的小数据库错误。

【讨论】:

  • 感谢您的 cmets。在我发布我的新版本之前,我希望你能告诉我此时我究竟是如何保持开放连接的?
  • @Nick:查看您发布的代码,您为命令对象分配了一个名为 Connection 的属性。因此,很明显它是在其他地方创建的。此外,您的命令对象永远不会关闭。在两者之间,很明显,一旦查询完成,命令对象就会挂起,并且不会处理外部 Connection 属性。您的命令和连接对象都实现了 IDisposable。这意味着它们应该包含在 using 子句中......在它们实际使用的方法中。
【解决方案2】:

一个.NET DataTable是一个DataRows的集合,每个DataRow都有一个Object数组ItemArray

DataTable GetTable()
  {
    try
    {
        string query = "select * from items";
        MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection);
        DataSet DS = new DataSet();
        adapter.Fill(DS);
        return DS.Tables[0];
    }
}

【讨论】:

  • +1 好例子。我对 DataAdapters 并不着迷,但它们肯定比 OP 拥有的更可取。
  • 谢谢,我不想使用 DataAdapter,因为我也不太喜欢它们。但我还是决定了。
【解决方案3】:

当您获得 DataSet 时,您可以使用 DataRowCollection 轻松访问任何指定表的行:

DataRowCollection drc = dataSet.Tables["tableName"].Rows;

我们也可以写表索引而不是表名,但不推荐使用,当我们从数据库索引中添加或删除表时会改变。在这些操作之后,名称将仍然相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2016-03-27
    • 2021-07-28
    相关资源
    最近更新 更多