我正在研究一个基本的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;
}
如果有任何问题,请随时提出
答案 0 :(得分:3)
我强烈建议不要这样做。
首先,只要执行命令,就应该保持连接打开状态。此外,MySqlCommand实现了IDisposable,因此应该包含在using子句中。
我建议反对它的一个原因是已经涵盖了此功能。一种简单的方法是让您的方法只返回一个DataTable。 DataTables将为您提供您需要的所有信息(数据类型,行,列等),而您的信息非常有限。
另一个原因与维持开放连接有关:坏主意。连接池将非常快速地处理打开/关闭连接,因此没有必要。此外,如果您的应用程序崩溃,那么您将会泄漏连接。在某些时候,你最终会得到很好的小数据库错误。
答案 1 :(得分: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];
}
}
答案 2 :(得分:1)
当您获得DataSet时,您可以使用DataRowCollection轻松访问任何指定表的行:
DataRowCollection drc = dataSet.Tables["tableName"].Rows;
而不是tableName我们也可以编写表索引,但是当我们从数据库索引添加或删除表时,它不会被推荐。这些操作后名称仍然相同。