我正在编写一个用于查看、归档和恢复SQL数据的程序.

调用以下方法数次(5-10),以获取数据库表的所有名称:

public List<string> GetAllTables(string sDatabase)
{
    List<string> result = new List<string>();

    try
    {
        using (SqlConnection con = new SqlConnection(dbConnection.conString + sDatabase))
        {
            con.Open();

            using (SqlCommand command = new SqlCommand("SELECT name FROM sys.Tables", con))
            {
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        result.Add(reader["name"].ToString());
                    }
                }
            }
        }

        return result;
    }
    catch (SqlException sqlEx)
    {
        string methodName = (new System.Diagnostics.StackTrace()).GetFrame(0).GetMethod().Name;
        string className = (new System.Diagnostics.StackTrace()).GetFrame(0).GetMethod().DeclaringType.Name;
        Debug.Print("Error in class {0} - method: {1}: {2}", className, methodName, sqlEx.Message);
        return result;
    }
}

错误发生在var reader = command.ExecuteReader().奇怪的是,这并不是每次都会发生.每秒恢复都成功,不会引发错误.

异常堆栈跟踪如下所示:

Error in class DatabaseWorker - method: GetAllTables: Transmission-level error when sending the request to the server. (provider: TCP-Provider, error:0 - An existing connection was closed by the remote host.)
by system.Data.SqlClient.SqlConnection.onError(SQLException exception, Boolean breakConnection)
by system.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
by system.Data.SqlClient.TdsParserStateObject.WriteSni()
by system.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
by system.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj)
by system.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
by system.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
by system.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
by system.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
by system.Data.SqlClient.SqlCommand.ExecuteReader()
for sql_data archiving.fashion model.DatabaseWorker.GetAllTables(String sDatabase)

推荐答案

实际上,SQL server正在关闭您的连接.

我发现,在使用SQL时,传输级错误通常与身份验证相关,尤其是在涉及集成安全性的情况下.它可能与Windows域相关(例如SQL如何判断连接的标识).有时,我发现这些问题可以通过SQL Server重新启动来解决,但这些问题是针对持久性连接问题的(不是您所拥有的).如果您使用的是集成安全性,请try 使用SQL帐户(用户名/密码).

至于why,这有时是个问题,考虑到你想继续跑,这并不容易.NET 3.5框架(可能在以后的运行时中修复了一个潜在问题).

我可以提出一些方法

  • try 使用SQL帐户建立连接
  • 如果你必须继续.NET 3.5中,在代码中实施重试策略(比如说3次,延迟1秒,然后失败).
  • 考虑使用构建应用程序.NET Core作为一个独立版本(--self-contained).这将打包所有依赖项,包括运行时.也就是说,部署应用程序时不需要安装运行时.

为了对SQL Server执行管理工作,有一个名为Microsoft.SqlServer.SqlManagementObjects 的nuget包,其中包含丰富的功能,如定义备份集等.它不适用于.NET 3.5,但在中具有自包含的部署.NET核心,它可能是future 工作的有用选项.

Csharp相关问答推荐

将C#字符串转换为其UTF8编码字符的十六进制表示

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

哪个nuget包含SecurityStampValidatorOptions

将列表字符串映射为逗号分隔字符串<>

如何使用XmlSerializer反序列化字符串数组?

为什么在使用动态obj+类obj时会调用串联?

为具有实体框架后端的Reaction项目 Select 正确的Visual Studio模板

为什么AggregateException的Catch块不足以处理取消?

如何使用.NET6WPF打印车票?

如何在不复制或使用输出的情况下定义项目依赖

具有类型识别的泛型方法

使用CollectionView时在.NET Maui中显示数据时出现问题

如何实现有条件的自定义Json转换器隐藏属性

在使用AWS SDK for.NET时,如何判断S3是否已验证我的对象的校验和?

ASP.NET MVC数据批注验证组复选框

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

使用DI实例化带有动态参数的服务?

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

如何在Cake脚本中设置MSBuild.exe的绝对路径

.NET文档对继承的困惑