我没有关闭以前的DataReader,但在哪里?

我已经更改了以前的代码,所以我没有使用’使用’。 它工作得更早,不同类中的代码基本上代表相同的东西,但它的工作。

我现在已经盯着它看了2个小时,我无法弄清问题可能出在哪里。

我只有一个阅读器,但每次我使用DisplayFileContent方法时都会收到错误:错误: There is already an open DataReader associated with this command which must be closed first.

 // May be public so we can display // content of file from different forms. public void DisplayFileContent(string filePath) { // Counting all entries. int countEntries = 0; // Encrypting/Decrypting data. EncryptDecrypt security = new EncryptDecrypt(); using (OleDbConnection connection = new OleDbConnection()) { connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + "Persist Security Info=False;" + "Jet OLEDB:Database Password=" + hashPhrase.ShortHash(storedAuth.Password) + ";"; using (OleDbCommand command = new OleDbCommand ("Select * FROM PersonalData", connection)) { OleDbDataReader read; try { // Open database connection. connection.Open(); // Create a data reader. read = command.ExecuteReader(); // Clearing the textbox before proceeding. txtDisplay.Text = string.Empty; // Checking if there is any data in the file. if (read.HasRows) { // Reading information from the file. while (read.Read()) { // Count all entries read from the reader. countEntries++; // Reading all values from the file as string. // While each string is encrypted, we must decrypt them. // User name and password is the same as user provided // while authentication. txtDisplay.Text += "=== Entry ID: " + read.GetValue(0) + " ===" + Environment.NewLine; txtDisplay.Text += "Type: " + security.Decrypt (read.GetString(1), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; if (!read.IsDBNull(2)) txtDisplay.Text += "URL: " + security.Decrypt(read.GetString(2), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; if (!read.IsDBNull(3)) txtDisplay.Text += "Software Name: " + security.Decrypt(read.GetString(3), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; if (!read.IsDBNull(4)) txtDisplay.Text += "Serial Code: " + security.Decrypt(read.GetString(4), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; if (!read.IsDBNull(5)) txtDisplay.Text += "User Name: " + security.Decrypt(read.GetString(5), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; if (!read.IsDBNull(6)) txtDisplay.Text += "Password: " + security.Decrypt(read.GetString(6), storedAuth.Password, storedAuth.UserName) + Environment.NewLine; txtDisplay.Text += Environment.NewLine; } } else { txtDisplay.Text = "There is nothing to display! " + "You must add something before so I can display anything here."; } // Displaying number of entries in the status bar. tsslStatus.Text = "A total of " + countEntries + " entries."; // Selecting 0 character to make sure text // isn't completly selected. txtDisplay.SelectionStart = 0; command.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } } } } 

您正在catch块之前调用command.ExecuteNonQuery。 您需要先关闭DataReader。

我建议在使用块中包装利用datareader的代码:

 using(OleDbDatareader read = command.ExecuteReader()) { ... } 

如上所述,command.ExecuteNonQuery()用于执行您不希望返回结果的命令。 这些通常是插入,更新或删除,但也可能包括执行相同操作的存储过程调用,或者您不关心返回结果的存储过程调用

在排队之前

 command.ExecuteNonQuery(); 

你需要:

 read.Close(); 

此外,知道使用连接不会自动关闭它至关重要。 因此,在使用语句连接结束之前,您需要一个

 connection.Close(); 

我看不到关闭数据阅读器的代码。

在catch部分后最后添加:

  finally { if (read != null) { read.Close(); } } 

编辑#1:我犯了一个错误,你应该在执行下一个命令之前关闭它,所以要么在catch块之前删除最后一行(如果合适)并添加finally块或者只是添加用于读取变量。