iT邦幫忙

1

ADO.NET的應用程式彈出System.Data.SqlClient.SqlException (0x80131904)

  • 分享至 

  • xImage

0x80131904
SQL Server 連接逾時?
這個該怎麼辦?
https://learn.microsoft.com/zh-tw/troubleshoot/sql/database-engine/connect/timeout-expired-error

疑似SQL Server忙碌中,無法處理連線?
疑似偶發的例外
目前還在想該怎麼重現此情境?

看更多先前的討論...收起先前的討論...
harry731 iT邦新手 3 級 ‧ 2023-02-10 13:37:12 檢舉
偶發狀況的話
個人建議使用try catch,當出現這種偶發的例外就由catch把例外狀況寫到ErrorLog,事後也方便確認狀況並研究如何改善
player iT邦大師 1 級 ‧ 2023-02-10 13:41:01 檢舉
就是 try catch 收到此偶發的例外
目前在設法排除問題
可是客戶似乎不太想改ConnectionTimeout 讓它等
所以才來問
有沒有其他的解法?
player iT邦大師 1 級 ‧ 2023-02-16 18:26:56 檢舉
補充
問題出現分支路線

nvarchar(max) 引發 參數化的資料繫結錯誤?
找到一個類似的說明
https://support.microsoft.com/zh-hk/topic/fix-error-message-when-you-run-a-sql-server-2008-based-application-that-calls-the-sqlbindparameter-function-the-incoming-tabular-data-stream-tds-remote-procedure-call-rpc-protocol-stream-is-incorrect-c4ad019c-43b1-35b0-cf6b-a14cadfb00ca

解法可能得更新 SQL Server Native Client?
https://learn.microsoft.com/zh-tw/sql/relational-databases/native-client/applications/installing-sql-server-native-client?view=sql-server-2016
player iT邦大師 1 級 ‧ 2023-02-17 14:23:31 檢舉
針對有 nvarchar(max) 欄位的資料表
放棄用參數化的寫法了
直接自組SQL字串
不參數化了
檢查是否需要更新 SQL Server Native Client (直接打掉,不檢查了)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
實習工程師
iT邦新手 2 級 ‧ 2023-02-10 14:07:12
最佳解答

目前還在想該怎麼重現此情境?

記得將資料鎖定,可以重現此情境。

如果是報表類的,我自己是固定寫入 某張資料表內,去做讀取。( 因為直接下SQL語法讀取原資料,如果資料量過大的話、或是計算,會造成當下無法寫入、讀取 )。

==========================================================================
如果只是單純要求不要出現此錯誤,且資料要求不一定要精準的話
https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/
這篇文章,也可以解決。

player iT邦大師 1 級 ‧ 2023-02-10 16:15:09 檢舉

有點難區分是連接逾時
還是操作insert時因為資料表被lock住?

的確是滿難區分的。

不過還是先謝了您的回答

不會 ~ 一起加油 ^^

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-11 10:47:54

檢查連線字串配置是否正確,參考下面的程式碼範例:

using System;
using System.Data.SqlClient;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 連線字串
            string connectionString = "Data Source=<server_name>;Initial Catalog=<database_name>;Integrated Security=True;";
            try
            {
                // 建立連線
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    Console.WriteLine("連線成功!");
                }
            }
            catch (SqlException ex)
            {
                Console.WriteLine("連線失敗:" + ex.Message);
            }
            Console.ReadLine();
        }
    }
}

player iT邦大師 1 級 ‧ 2023-02-13 18:07:46 檢舉

連線字串確定正確 (預設連線TimeOut用預設值 15秒)
因為同一條連線
前面的其他幾個SQL操作完全正常
也不太可能是SqlCommand 超過 30秒TimeOut
因為只做一筆 insert
還在想 ADO.NET 在與資料庫連線斷掉時,會自動重連嗎?
如果會的話,問題可能出在重新連線上
如果不會的話,就得找最後要insert的資料表,到底是誰卡了它?

我要發表回答

立即登入回答