首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ExecuteReader要关闭?

为什么ExecuteReader要关闭?
EN

Stack Overflow用户
提问于 2022-08-15 07:35:14
回答 1查看 57关注 0票数 -1

我正在用WPF开发一个应用程序。我试图获取电子邮件,提取数据,将其保存在DB中,并在DataGrid中使用它。为了避免保存副本,我已经做了一个方法。我的问题是,我不知道为什么关闭我的dataReader?如果我在另一个.xaml类中使用它,它会正常工作,那么这里有什么问题呢?我使用过using-statement,我认为这是问题所在,但似乎并非如此。

DataReader方法:

代码语言:javascript
复制
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();
    }
}

获取电子邮件的方法:

代码语言:javascript
复制
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);
}

更新:这正是我尝试过的。但也存在一个问题,即联系没有被关闭。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-15 09:27:42

问题在于DatabaseSingleton.GetInstance(),它支持connection-pooling

代码语言:javascript
复制
 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();
                }
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73358021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档