SQL / LINQ C#超时无关紧要

时间:2016-02-20 17:01:42

标签: c# sql-server linq

为了发送电子邮件,我们会查找我们的" botmail"的一些电子邮件凭据。现在这段代码在不久前就运行得很好,但是从我们的服务器移动后,它有不断的SQL超时异常。我已经尝试更改连接字符串本身的超时,并且我尝试在OnCreated中更改CommandTimeout(在我们的DataContext类中都是ctx变量)。无论我改变什么,我都会不断得到同样的例外。我有什么东西在这里失踪吗?

代码:

if (Enumerable.Any(from c in ctx.Default_Email_Creds select c))
{
    serverHostname = (from c in ctx.Default_Email_Creds select c.Hostname).First();
    serverUsername = (from c in ctx.Default_Email_Creds select c.UserName).First();
    serverPassword = (from c in ctx.Default_Email_Creds select c.Password).First();
    mailFrom = (from c in ctx.Default_Email_Creds select c.Mail_From).First();
}

1 个答案:

答案 0 :(得分:0)

总结一下。

首先,问题更可能出现在连接字符串中。当您在其他地方移动程序时,您的数据库服务器在新环境中不再可用。程序尝试打开连接,等待服务器响应并抛出超时异常。 这样的SQL查询不可能长时间制作,因为它搜索表中的第一行。即使表有很多行,查询也会快速返回第一行。仅当Default_Email_Creds不是表时,才能执行查询很长时间。如果Default_Email_Creds是具有复杂过滤器的视图,则可以进行此操作。

第二,您的代码效率非常低,并且对服务器执行五次SQL查询。我建议这样做:

    var res = (from c in ctx.Default_Email_Creds select new {c.Hostname, c.UserName, c.Password, c.Mail_From}).FirstOrDefault();
    if(res != null)
    {
        serverHostname = res.Hostname;
        serverUsername  = res.UserName;
        serverPassword  = res.Password;
        mailFrom  = res.Mail_From;
    }