SqlConnection 超时设置不起作用connection.Open()还是一样/判断本机是否可以连接远程SQL数据呢

qjf309 2011-06-10 11:25:51
 using (SqlConnection connection = new SqlConnection("Data Source=192.0.0.0;Initial Catalog=demo;Persist Security Info=True;User ID=demo;Password=demo;Connect Timeout=5"")
{
try
{
connection.Open();//这里问题
}
catch (Exception)
{

}
}


我明明设置的是5秒,如何是网络断开,5秒后,就会自己抛出异常。可要是不是断网,而是屏蔽1433端口,他要等到30秒才抛出异常,这样的话,太慢了,各位,有没有其它方法可以设置,不管是什么问题,只连接不上SQL数据库,超过5秒,就抛出异常。

哪位还有更好的方法,如何判断本机是否可以连接远程SQL数据呢,
...全文
1313 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
clockleewee 2011-11-10
  • 打赏
  • 举报
回复
livesoft 的方法可以。
我是受到一个老外的启发。(http://stackoverflow.com/questions/3619347/how-to-make-sqlconnection-timeout-more-quickly)
他用的是.net 4.0。本人基础比较薄,他用了个Tuple,不知道啥东东。
幸好电脑里装了个2010,复制粘贴下来,还是不行。程序就当在thread.abort()这里。考虑到open报错后线程还是会终止的,所以就直接注释掉了thread.abort(),换成 sqlConnection.Close();sqlConnection.Dispose(); 就可以运行了也达到了预期的目的,但是不知道有没有什么后遗症。
然后在2010里面做个dll引用到2005里面,结果就是白扯。根本没法识别。于是就变通了下写了如下的代码。

重点是我不知道有没有什么后遗症
糙人写的代码,请高手指正!

public ClassSQL(string _DBName, string _UserID, string _PassWord, string _IPAddress)
{
try
{
string strConnection = strConnection = "Server = " + _IPAddress + ";user id=" + _UserID + ";password =" + _PassWord + " ;initial catalog=" + _DBName + ";";//Connect Timeout = 2 ";
if (!SqlConnectTest(strConnection))
{
return;
}
my_SqlConnection = new SqlConnection(strConnection);
my_SqlConnection.Open();
my_SqlCommand = new SqlCommand();
my_SqlCommand.Connection = my_SqlConnection;
}
catch (Exception ex)
{
string ss = ex.Message;
}
}
private bool _IsConnect;
private System.Threading.Timer tmr_SQLTimeOut;
private void SQLTest(object connStr)
{
SqlConnection Test_Connection = null;
try
{
string str = (string)connStr;
Test_Connection = new SqlConnection(str);
Test_Connection.Open();
_IsConnect = true;
}
catch
{
_IsConnect = false;
}
finally
{
Test_Connection.Close();
Test_Connection.Dispose();
}
}
private bool SqlConnectTest(object connStr)
{
TimerCallback tc = new TimerCallback(SQLTest);
tmr_SQLTimeOut = new System.Threading.Timer(tc, connStr, 0, 5000);
for (int i = 0; i < 400; i++)
{
Thread.Sleep(10);
if (_IsConnect)
{
break;
}
}
tmr_SQLTimeOut.Dispose();
return _IsConnect;
}
clockleewee 2011-11-09
  • 打赏
  • 举报
回复
wxr0323的方法只能解决端口的问题啊。
如果要是端口没有屏蔽且输入的ip也是网络上存在的,
好像就不行了啊。
heroaroma 2011-07-27
  • 打赏
  • 举报
回复
我的歌,能不能详细一点啊,open()之后 open()有可能报异常,我怎样判断啊 ,报异常要的时间太久了
qjf309 2011-06-12
  • 打赏
  • 举报
回复
livesoft 也是一个不错的思路
qjf309 2011-06-12
  • 打赏
  • 举报
回复
搞定,就用了“wxr0323”的方法,谢谢你们
livesoft 2011-06-11
  • 打赏
  • 举报
回复
用线程来做,等待10秒后,要是还连接不了,就判断无法连接
子夜__ 2011-06-11
  • 打赏
  • 举报
回复
端口监听可以不
 public class sk
{
private int _port = 1433;
private bool _connect;
private IPEndPoint _iPEndPoint;
private TcpClient _client;
private TimerCallback _timerCallBack;
private Timer _timer;

public sk()
{

_iPEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.30 "), _port);
_timerCallBack = new TimerCallback(CheckConnect);
_timer = new Timer(_timerCallBack, null, 60000, 10000);
}

public bool Connect
{
get { return _connect; }
}

public void CheckConnect(object o)
{
try
{
_client = new TcpClient();
_client.Connect(_iPEndPoint);
_connect = true;
_client.Close();
}
catch
{
_connect = false;
}
}
}
lpingz 2011-06-11
  • 打赏
  • 举报
回复
那 连接前先判断端口是否可用呢?

比如,用socket.connect先连一下。
qjf309 2011-06-11
  • 打赏
  • 举报
回复
在加60分,急
qjf309 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
SqlConnection.Timeout
[/Quote]

应该是 connection.ConnectionTimeout,这个是只读的,只能在字串连接的时候加上,
qjf309 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhou_xuexi 的回复:]
new SqlCommand().CommandTimeout
[/Quote]

SqlCommand cmd = new SqlCommand("select getdate()", connection);
在执行 cmd.ExecuteNonQuery();
也要先开启 connection.Open();呀,这在这里太慢了,我开了防立墙拦截1433端口,就要30秒才能超时了,因为我的软件是CS做的,在客户机子上用的时候,有的人的网络是不给开1433端口的,所以我就要做一个判断
zhou_xuexi 2011-06-11
  • 打赏
  • 举报
回复
new SqlCommand().CommandTimeout
threenewbee 2011-06-10
  • 打赏
  • 举报
回复
SqlConnection.Timeout

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧