我更改了之前的代码,因此我没有使用'使用'。它工作得更早,不同类中的代码基本上代表相同的东西,但它的工作。
我已经盯着它看了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);
}
}
}
}
答案 0 :(得分:6)
您正在catch块之前调用command.ExecuteNonQuery。您需要先关闭DataReader。
我建议在使用块中包装使用datareader的代码:
using(OleDbDatareader read = command.ExecuteReader())
{
...
}
如上所述,command.ExecuteNonQuery()用于执行您不希望返回结果的命令。这些通常是插入,更新或删除,但也可能包括执行相同操作的存储过程调用,或者您不关心返回结果的存储过程调用
答案 1 :(得分:3)
行前
command.ExecuteNonQuery();
你需要:
read.Close();
此外,了解使用连接不会自动关闭它至关重要。因此,在使用语句连接结束之前,您需要一个
connection.Close();
答案 2 :(得分:1)
我看不到关闭数据阅读器的代码。
在catch部分后最后添加:
finally {
if (read != null)
{
read.Close();
}
}
编辑#1:我犯了一个错误,你应该在执行下一个命令之前关闭它,所以要么在catch块之前删除最后一行(如果合适的话)并添加finally块或者只是添加用于读取变量。