我正在撰寫一個用于查看、歸檔和恢復 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.)
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)
uj5u.com熱心網友回復:
本質上,SQL 服務器正在關閉您的連接。
我發現使用 SQL 時的傳輸級別錯誤通常與身份驗證相關,尤其是在涉及集成安全性時。它可能與 Windows 域相關(例如 SQL 如何評估連接的身份)。有時我發現這些問題通過重新啟動 SQL Server 得到了解決,但這些問題是針對持久連接問題(不是你所擁有的)。如果您使用集成安全性,請嘗試使用 SQL 帳戶(用戶名/密碼)。
至于為什么有時會出現問題,考慮到您想在 .NET 3.5 Framework 上運行,這并不容易(可能在以后的運行時中已經修復了一個潛在問題)。
我可以建議一些方法
- 嘗試使用 SQL 帳戶建立連接
- 如果您必須繼續使用 .NET 3.5,請在代碼中實施重試策略(例如 3 次,延遲 1 秒,然后再失敗)。
- 考慮使用 .NET Core 構建應用程式作為自包含版本 (
--self-contained)。這會打包所有依賴項,包括運行時。也就是說,您在部署應用程式時不需要安裝運行時。
為了使用 SQL 服務器執行管理作業,有一個名為Microsoft.SqlServer.SqlManagementObjects的 nuget 包,其中包括定義備份集等豐富的功能。它不適用于 .NET 3.5,但在 .NET Core 中具有自包含部署,它可能是未來作業的有用選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494084.html
標籤:C# sql .net-3.5 sqldatareader
上一篇:沒有子查詢有沒有更好的方法?
下一篇:使用CASE陳述句進行連接
