我有一个'worker'函数,它将在我的程序中处理任何和所有sql查询。我将需要执行返回结果集的查询和只执行存储过程而没有任何结果的查询。这可能与MySqlDataAdapter.Fill有关,还是我需要使用MySqlCommand.ExecuteNonQuery()方法?这是我的'工人'功能供参考:
private DataSet RunQuery(string SQL)
{
MySqlConnection connection;
MySqlCommand command;
MySqlDataAdapter adapter;
DataSet dataset = new DataSet();
lock(locker)
{
connection = new MySqlConnection(MyConString);
command = new MySqlCommand();
command = connection.CreateCommand();
command.CommandText = SQL;
adapter = new MySqlDataAdapter(command);
adapter.Fill(dataset);
}
return dataset;
}
答案 0 :(得分:1)
首先,您的worker函数会在.Fill(dataset)方法上抛出异常。您需要使用select命令构建适配器:
adapter = new MySqlDataAdapter(command);
针对Fill运行非查询的结果将导致数据集没有返回表。
但是:与使用cmd.ExecuteNonQuery()方法相比,使用Adapter.Fill(dataset)等ADO.NET命令执行非查询命令效率非常低。
除了构建单独且冗余的DataAdapter对象之外,在ADO.NET中进行的每个调用都是虚拟的,需要在运行时由CLR解析到调用站点。在负载下,连续运行此方法将导致大量GC压力,DataAdapter对象需要连续处理,并且将比仅运行command.ExecuteNonQuery();
慢得多。