判斷SQL數據庫是否通暢,加快返回速度,取消延遲或超時時才反饋回來!

  衆所周知,我們在做程序時,都要與數據庫進行連接。有時我們習慣沒有加載窗體過渡,直接進入主界面,而此時又要進行數據庫連接,再沒有和主窗體分開線程時,就會出現卡的現象。 如果不通,剛至少要等30秒以上纔會有結果,通了則非常 快。但我們不需要他們那麼長的等待時間,仔細分析一下過程就知道了,病因在何處。


 通常的連接字符串爲: <add name="connStr" connectionString="Data Source=A;Initial Catalog=D;Persist Security Info=True;Connect Timeout=4;uid=sa;pwd=sa1" providerName="System.Data.SqlClient"></add>

就算Connect Timeout=4 設置了4秒,但在嘗試時連接時還是卡,前提是到服務器A的地址不通,C#程序在時行連接時,先要對地址A進行通否判斷,這樣就出現了延時現象,如果地址是通,密碼錯,或數據名字錯都會很快返回錯誤信息。既然我們知道了卡在哪,就針對它來時行改進。


我們在開始運行裏 打入 cmd, 進入DOS黑屏界面,輸入ping A,其實很快就返回是否成功。但我們用DNS解析時就會出現慢的問題。所以我們在嘗試之前,先判斷A是否通,如果不通則不必要進行下次打開連接了。


直接提供個簡單的小類:

    public static class NetIPIsPass
    {
        /// <summary> 
        /// 驗證IP地址字符串的正確性 
        /// </summary> 
        /// <param name="strIP">要驗證的IP地址字符串</param> 
        /// <returns>格式是否正確,正確爲 true 否則爲 false</returns> 
        internal static bool CheckIPAddr(string strIP)
        {
            if (string.IsNullOrEmpty(strIP))
            {
                return false;
            }
            // 保持要返回的信息 
            bool bRes = true;
            int iTmp = 0;    // 保持每個由“.”分隔的整型 
            string[] ipSplit = strIP.Split('.');
            if (ipSplit.Length < 4 || string.IsNullOrEmpty(ipSplit[0]) ||
                string.IsNullOrEmpty(ipSplit[1]) ||
                string.IsNullOrEmpty(ipSplit[2]) ||
                string.IsNullOrEmpty(ipSplit[3]))
            {
                bRes = false;
            }
            else
            {
                for (int i = 0; i < ipSplit.Length; i++)
                {
                    if (!int.TryParse(ipSplit[i], out iTmp) || iTmp < 0 || iTmp > 255)
                    {
                        bRes = false;
                        break;
                    }
                }
            }


            return bRes;
        }
        /// <summary> 
        /// 驗證某個IP是否可ping通 
        /// </summary> 
        /// <param name="strIP">要驗證的IP</param> 
        /// <returns>是否可連通  是:true 否:false</returns> 
        public static bool TestNetConnectity(string strIP)
        {
            if (!CheckIPAddr(strIP))
            {
                return false;
            }   //此處判斷是否爲必須IP格式,不能用計算機名。根據自己情況來判斷,當然也不能用 . 來代替

            
            // Windows L2TP VPN和非Windows VPN使用ping VPN服務端的方式獲取是否可以連通 
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();


            // Use the default Ttl value which is 128, 
            // but change the fragmentation behavior. 
            options.DontFragment = true;


            // Create a buffer of 32 bytes of data to be transmitted. 
            string data = "testtesttesttesttesttesttesttest";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 120;
            PingReply reply = pingSender.Send(strIP, timeout, buffer, options);


            return (reply.Status == IPStatus.Success);
        }
         
    }


使用方法:

 SqlConnection m_Conn;
      
        public bool OpenSql()
        {
            if (m_Conn == null)
                m_Conn = new SqlConnection(GetConnection);  //GetConnection爲獲取連接字符串方法
            try
            {
                //先判斷服務器地址是否通,也是IP
                bool m_b = NetIPIsPass.TestNetConnectity(m_Conn.DataSource);               


                if (m_b == false)
                {
                    Console.WriteLine("IP地址不能!數據庫不能訪問");
                    return false;
                }
                if (m_Conn.State != System.Data.ConnectionState.Open)
                    m_Conn.Open();
                Console.WriteLine("連接成功!");
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            finally
            {
                try
                {
                    m_Conn.Close();
                }
                catch
                {
                }
            }
        }

大家用上面方法再做一次測試,看數據是否通,是不是速度非常快了,不通時也不再時以前的30秒的漫長等待了。 

發佈了89 篇原創文章 · 獲贊 4 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章