判断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秒的漫长等待了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值