我正在用WPF开发一个应用程序。我试图获取电子邮件,提取数据,将其保存在DB中,并在DataGrid中使用它。为了避免保存副本,我已经做了一个方法。我的问题是,我不知道为什么关闭我的dataReader?如果我在另一个.xaml类中使用它,它会正常工作,那么这里有什么问题呢?我使用过using-statement,我认为这是问题所在,但似乎并非如此。
DataReader方法:
public IEnumerable<Problem> GetAll()
{
using (SqlConnection conn = DatabaseSingleton.GetInstance())
{
//conn.Open();
using (SqlCommand command = new SqlCommand("SELECT * FROM Problem", conn))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Problem problem = new Problem
{
Id = reader.GetInt32(0),
NameOfAlert = reader.GetString(1),
Value = Enum.Parse<Value>(reader[2].ToString()),
Result = Enum.Parse<Result>(reader[3].ToString()),
Message_Id = reader.GetString(4)
};
yield return problem;
}
}
}
//conn.Close();
}
}获取电子邮件的方法:
public static void MailKitLib(EmailParser emailParser)
{
bool help = true;
do
{
using (var client = new ImapClient())
{
using (var cancel = new System.Threading.CancellationTokenSource())
{
client.Connect(emailParser.ServerName, emailParser.Port, emailParser.IsSSLuse, cancel.Token);
client.Authenticate(emailParser.Username, emailParser.Password, cancel.Token);
var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadOnly, cancel.Token);
//Here I am saving only originals
for (int i = 0; i < inbox.Count; i++)
{
var message = inbox.GetMessage(i, cancel.Token);
GetBodyText = message.TextBody;
Problem problem = new Problem(message.MessageId);
if (!dAOProblem.GetAll().Any(x => x.Message_Id.Equals(problem.Message_Id)))
{
dAOProblem.Save(problem);
Alert alert = new Alert(message.MessageId, message.Date.DateTime, message.From.ToString(), 1, problem.Id);
if (!dAOAlert.GetAll().Any(x => x.Id_MimeMessage.Equals(alert.Id_MimeMessage)))
{
dAOAlert.Save(alert);
}
}
}
//client.Disconnect(true, cancel.Token);
}
}
} while (help != false);
}更新:这正是我尝试过的。但也存在一个问题,即联系没有被关闭。
发布于 2022-08-15 09:27:42
问题在于DatabaseSingleton.GetInstance(),它支持connection-pooling
public IEnumerable<Problem> GetAll()
{
string connString = "Data Source=;Initial Catalog=;User ID=;Password=";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand command = new SqlCommand("SELECT * FROM Problem", conn))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Problem problem = new Problem
{
Id = reader.GetInt32(0),
NameOfAlert = reader.GetString(1),
Value = Enum.Parse<Value>(reader[2].ToString()),
Result = Enum.Parse<Result>(reader[3].ToString()),
Message_Id = reader.GetString(4)
};
yield return problem;
}
}
conn.Close();
}
}https://stackoverflow.com/questions/73358021
复制相似问题