我有一個很奇怪的問題,並希望有人在那裏有類似的經歷。.NET SQL Server連接問題 - 也許連接池相關
我的公司申請的一個客戶端在我們的應用程序開始時就被SQL Server「禁止」了。行爲很奇怪。我會以點形式寫出來。
創建SQL連接,檢索數據,關閉連接,與其他數據源交談,然後拒絕訪問SQL Server。
這裏的長篇大論版本:
.NET應用程序連接到數據庫多次。獲取一些數據,做一些工作。然後它會獲得更多的數據,然後出現「SQL Server無法找到或訪問被拒絕」的錯誤。如果在不重新啓動應用程序的情況下再次啓動該進程,則不能再向SQL Server連接。所有新的連接都會導致「無法找到SQL Server或訪問被拒絕」。如果應用程序重新啓動,那麼它將重複上述過程。
這是5年來我第一次遇到這個問題。該應用程序確實有用Delphi 7編寫的代碼.Dephi 7/VBA代碼沒有問題。我的.NET代碼執行實際查詢如下所示:
protected abstract DbConnection GetConnection();
protected abstract DbDataAdapter GetDataAdapter(DbCommand cmd);
protected abstract DbCommand GetCommand(DbConnection conn, String sql);
protected abstract DbCommandBuilder GetCommandBuilder(DbDataAdapter adapter);
public virtual DataTable Query(string sql)
{
var dt = new DataTable();
using (var conn = GetConnection())
{
try
{
using (var cmd = GetCommand(conn, sql))
{
using (var adapter = GetDataAdapter(cmd))
{
adapter.Fill(dt);
}
}
}
catch (Exception ex)
{
throw new SqlStatementException(sql, ex);
}
}
return dt;
}
這是我自己非常髒的DAL。當它使用它使用OleDbConnection。
注意:由於遺留代碼,連接字符串配置爲OleDbConnection。花點時間檢查我的代碼後,我確實有能力將連接類型更改爲SqlConnection。我還沒有嘗試過。
在客戶端的機器上,我一直無法在主應用程序之外重現問題。我嘗試創建一個小應用程序,使用上面的格式使用OleDbConnection將100個調用背對背,但它成功執行。
主應用程序的失敗發生在同一個地方。這應該給我一個線索,除非我無法理解它,因爲它正在進行重複查詢,獲取相同的數據。但我會說應用程序會與兩個數據源對話並將數據從一個數據源傳輸到另一個數據源。在它進行轉移之前,它對源代碼進行了一些驗證。因此,它通過ODBC與另一個數據庫(基於專有文件)進行通信,併成功返回,然後在嘗試通過OleDbConnection與SQL Server交談時失敗。
我的懷疑是在連接池中發生的事情。這導致了失敗,從而導致拒絕訪問。
其他有趣的一點。所有的工作都很好,大約一年前,客戶在幾個月前買了一臺新機器,一切正常,然後突然停下來。我把應用程序放在客戶端的另一臺機器上,一切都運行良好,然後出現了同樣的問題。我們在客戶端的機器上關閉了所有東西,但問題依然存在。我認爲防火牆,但沒有運氣。
任何幫助,非常感謝。
驗證SQLSERVER沒有t將其進行更改爲連接未在此代碼關閉。另外,如果服務器不接受多個連接,那麼這將成爲連接到同一服務器上的多個數據庫的問題 – Shon
@Shon:using語句關閉連接。澄清一個數據源在一臺服務器上,另一個數據源在另一臺服務器上。雖然在同一臺服務器上應該不成問題。 –
我不太瞭解,但我不認爲連接池問題會帶來這樣的信息。 「無法找到SQL Server或訪問被拒絕」。但是,您的懷疑在某些觀點上也是有道理的。詞「新機」,「拒絕訪問」,「ConnectionString的」讓我覺得事情的授權,但只是想.. –