我正在编写一个用于查看、存档和还原 SQL 数据的程序。
这个问题只在还原时出现,并且只在使用目标框架 .NET 3.5
时才会发生。
.NET 4.0
及以上版本似乎已经解决了这个问题,但我必须使用 3.5
版本编写程序,以确保它能够与需要使用它的计算机完全兼容。
下面的方法被调用几次(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.)
at System.Data.SqlClient.SqlConnection.onError(SQLException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.WriteSni()
at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
at System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
for sql_data archiving.fashion model.DatabaseWorker.GetAllTables(String sDatabase)