衆所周知,我們在做程序時,都要與數據庫進行連接。有時我們習慣沒有加載窗體過渡,直接進入主界面,而此時又要進行數據庫連接,再沒有和主窗體分開線程時,就會出現卡的現象。 如果不通,剛至少要等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秒的漫長等待了。