2009-09-21 51 views

回答

0

您可以使用相同的连接在另一个之后运行一个查询。但是,DataReader使用连接来读取结果,因此必须先读取结果并关闭阅读器,然后才能运行下一个查询。

如果您需要对结果中的每一行运行另一个查询,则首先需要将结果读入集合,以便在循环结果之前关闭阅读器。或者,您可以打开另一个连接,但如果可能的话,最好坚持一个连接。

还要考虑是否可以使用连接在单个查询中得到结果。运行单个查询比数百个更好。

+0

很好的答案。我没有提到关闭读者。 – 2009-09-21 14:52:30

+0

我不得不说,这正是我认为DataReader只能用于该连接的一次。因此,您必须让DataReader输出结果,然后才能打开和关闭连接。如果你有一个DataReader和ExecuteNonQuery,这是否一样? – aHunter 2009-09-21 14:56:25

+0

@Stuart:您无论如何都只能使用一个DataReader,但不需要为每个DataReader打开一个新连接。如果你有一个开放的DataReader,它需要连接来读取它的结果,所以即使对于ExecuteNonQuery也不能使用连接。 – Guffa 2009-09-21 15:09:35

1

您可以重新使用连接。您可能需要更改CommandType,但不需要关闭并重新打开连接。这增加不必要的开销。

+0

CommandType不一定是查询的文本吗? MySqlCommand qry = new MySqlCommand(“SELECT somthing FROM table1”); qry.CommandType = System.Data.CommandType.Text; qry.Connection = conn; MySqlDataReader res = qry.ExecuteReader(); – aHunter 2009-09-21 14:51:33

+0

如果您以这种方式运行查询,那么它会保持文本。 – 2009-09-21 14:53:22

0

你可以用一个连接来完成。

您不需要打开然后关闭,在这种情况下,首选方法是保持连接打开。

1

您不必关闭它。

using(connection...) 
{ 
query1; 
query2; 
} 
+0

谢谢你是这个意思吗? (MySqlConnection conn = new MySqlConnection(global.connectionString)){MySqlCommand qry1 = new MySqlCommand(“SELECT something FROM table1”); MySqlDataReader res_qry1 = qry1.ExecuteReader(); while(res_qry1.Read()){MySqlCommand qry2 = new MySqlCommand(“SELECT something FROM table2”); MySqlDataReader res_qry2 = qry2.ExecuteReader(); } – aHunter 2009-09-21 14:47:19

+0

只要您在完成之后关闭阅读器,在运行下一个查询之前,就像Guffa指出的那样。 – 2009-09-21 14:54:48

+0

是的,类似的东西。 – 2009-09-21 15:06:43

0

你也可以考虑使用DataTableReader,它是一个非连接的阅读器,你可以遍历它的结果,而不必在内存中存储需要两次迭代的另一个集合。

MSDN reference for DataTableReader

相关问题