none
怪異的 SqlConnection.State RRS feed

  • 問題

  • 最近遇到的怪問題, 實在想不出原因, 請大家幫忙看一下, 謝謝!
    發生問題的程式片段如下:

        try
        {
            switch (State) // State = Connection.State, Connection 是已經建立的 System.Data.SqlClient.SqlConnection 物件
            {
                case System.Data.ConnectionState.Broken:
                case System.Data.ConnectionState.Closed:
                    if (State == System.Data.ConnectionState.Closed) Console.WriteLine("Connection State: Closed");
                    Connection.Open(); // Connection = new SqlConnection(連線字串)
                    break;

                default:
                    break;
            }
        }
        catch (Exception Ex)
        {
            Console.WriteLine("Exception caught.");
        }

    判斷 State 時會抓到 System.Data.ConnectionState.Closed, 這個沒問題, 因為在這一段程式執行前, Connection 曾經執行過 Close(),
    但不知為什麼一執行 Connection.Open(), 程式就掛掉, catch 區塊沒有作用就算了, 更離譜的是底下的錯誤訊息:
    System.InvalidOperationException: 連接未關閉。連接目前的狀態為開啟。
       於 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       於 System.Data.SqlClient.SqlConnection.Open()


    到底哪裡出錯了呢?
    2012年8月27日 上午 03:13

所有回覆

  • 先把這一行註解掉再試看看:

    case System.Data.ConnectionState.Broken:

    2012年8月27日 上午 07:59
  • 我之前有這樣做了, 不出所料, State 的確為 System.Data.ConnectionState.Closed, 我也覺得很合理, 畢竟執行過 Close(), 不是 Closed 才是不合理的. 下午我用下面的片段進行測試, 結果得到了更奇怪的結果:

    Connection.Dispose();
    Connection = new SqlConnection(連線字串);
    Connection.Open();

    錯誤訊息居然與原本的相同!? 這到底是怎麼一回事呢?

    2012年8月27日 下午 01:43
  • 今天把裝 SQL-Server 的主機重開機, 問題竟然就消失了, 真是奇怪, 想不通問題到底出在哪?
    2012年8月28日 上午 04:25
  • 我猜得:http://blog.kkbruce.net/2009/11/aspnetmars.html#.UDxTJ9biY38

    加入這一設定看看。

    因為我們下 Close() 或 Dispose() 的動作不是"即時"的,它還沒關好你就又要立即把它打開。


    http://blog.kkbruce.net

    2012年8月28日 上午 05:12
  • 謝謝! 您說的原因我也有想過, 不過我也無法確定是否就是因為這樣. 您的建議我加進去了, 不過由於目前問題暫時消失, 所以還無法確定這樣做是否有效.
    2012年8月29日 下午 01:37
  • 另一可能是,

    我們下Close() 或 Dispose() ,連線未關,你又一直開新連線的Session,超過 sql server 的連線數限制,所以程式要執行一段時間之後才會出問題。

    而且老實說,你為什麼沒事不讓程式正常結束要一再re-open它呢?


    http://blog.kkbruce.net

    2012年8月29日 下午 02:05