C# SQL Server:“;“创建数据库”;查询超时

C# SQL Server:“;“创建数据库”;查询超时,c#,.net,sql-server,timeout,C#,.net,Sql Server,Timeout,我有一个.Net应用程序正在创建一个新的数据库。当前的代码在开发环境和许多生产环境中运行良好。所以我相信代码是好的 但是,我们有一个特定实例,在该实例中,当应用程序运行以下SQL命令时,用户将获得超时: CREATE DATABASE NameOfDatabase 代码非常简单,正如您所见,它使用SQL命令的默认超时时间为30秒: using (SqlConnection connection = new SqlConnection(connectionString)) { strin

我有一个.Net应用程序正在创建一个新的数据库。当前的代码在开发环境和许多生产环境中运行良好。所以我相信代码是好的

但是,我们有一个特定实例,在该实例中,当应用程序运行以下SQL命令时,用户将获得超时:

CREATE DATABASE NameOfDatabase
代码非常简单,正如您所见,它使用SQL命令的默认超时时间为30秒:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string query = "CREATE DATABASE " + databaseName;

    SqlCommand command = new SqlCommand(query, connection);

    connection.Open();
    command.ExecuteNonQuery();
}
注意:我们的日志文件显示错误发生在
ExecuteNonQuery
上,这表明这不是打开连接时超时,而是在查询执行期间超时

特定的.Net错误是:

超时已过期。操作完成前已过超时时间,或者服务器没有响应

使用堆栈跟踪中的一行来显示我关于它是命令超时(而不是连接超时)的推理:

位于System.Data.SqlClient.SqlCommand.ExecuteOnQuery()处

注意:此错误信息是通过对代码进行try/catch获得的,为了简单起见,该代码被排除在问题之外,因为它与问题无关

问题

  • 在任何合理(甚至不常见)的情况下,
    创建数据库
    查询是否需要这么长时间才能运行,并且仍然成功

  • 如果不需要那么长时间,超时的常见原因是什么?(我应该在哪里调试问题?)


  • 我没有足够的代表点发表评论。获取特定的错误包装命令。ExecuteOnQuery();在一次尝试中。至少您可以获得正在发生的特定错误。还可以使用将处理该对象的with SqlCommand


    也许这篇TechNet文章能有所帮助

    我没有足够的代表点发表评论。获取特定的错误包装命令。ExecuteOnQuery();在一次尝试中。至少您可以获得正在发生的特定错误。还可以使用将处理该对象的with SqlCommand


    也许这篇TechNet文章能有所帮助

    创建数据库需要立即写入磁盘。。。可能存在问题,请确保该服务器上的权限正确。@chuck用户非常确定权限是正确的,但我可以要求再次检查。但是,这会导致超时吗?如果这是导致超时的原因,我们是否会得到关于访问或身份验证的更具描述性的错误?最好的方法是检查SQL日志,看看到底发生了什么。也许你正在通过认证,而服务器没有启用混合模式?@musefan,祝你好运。我确实认为是服务器/配置。您还可以看到SSMS中发生了什么,如果创建SSMS需要31秒,那将非常有趣!创建数据库需要立即写入磁盘。。。可能存在问题,请确保该服务器上的权限正确。@chuck用户非常确定权限是正确的,但我可以要求再次检查。但是,这会导致超时吗?如果这是导致超时的原因,我们是否会得到关于访问或身份验证的更具描述性的错误?最好的方法是检查SQL日志,看看到底发生了什么。也许你正在通过认证,而服务器没有启用混合模式?@musefan,祝你好运。我确实认为是服务器/配置。您还可以看到SSMS中发生了什么,如果创建SSMS需要31秒,那将非常有趣!我已经有了具体的错误。这是个问题。关于使用block的观点很正确,但它与这个问题无关,所以让我们试着继续讨论这个问题。我只经历过一次,而调试程序给我的错误与捕获捕获到它时不同。这就是为什么我建议用try-catch包装。报告的错误可能更精确。我发布的错误消息来自try/catch。还值得注意的是,我无法更改代码以调试此问题您可以检查连接是否已打开吗?connection.open不会返回任何内容,但您可以检查状态吗?如果连接未打开,ExecuteOnQuery将超时。您建议“特定实例”可能是用户权限问题?非常确定连接。如果不成功,open()将抛出错误。我已经有了特定错误。这是个问题。关于使用block的观点很正确,但它与这个问题无关,所以让我们试着继续讨论这个问题。我只经历过一次,而调试程序给我的错误与捕获捕获到它时不同。这就是为什么我建议用try-catch包装。报告的错误可能更精确。我发布的错误消息来自try/catch。还值得注意的是,我无法更改代码以调试此问题您可以检查连接是否已打开吗?connection.open不会返回任何内容,但您可以检查状态吗?如果连接未打开,ExecuteOnQuery将超时。您建议“特定实例”可能是用户权限问题?非常确定连接。如果不成功,open()将抛出错误
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string query = "CREATE DATABASE " + databaseName;
    
        using(SqlCommand command = new SqlCommand(query, connection))
        {
            try
            {
                connection.Open();
                if (connection.State == ConnectionState.Open)
                    command.ExecuteNonQuery();
            }
            catch(Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }               
    }