写了一个函数,想放在线程中启动运行,用来检测数据库服务(本地或远程)是否处于可连接状态。
自己的思路是,在线程中创建一个SqlConnection对象,不停的Open()来检测其State为Open或Closed。1)这样做首先是产生很多异常:
我把sql数据库服务关闭时,产生异常“在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)”;
把数据库服务打开时,产生异常“连接未关闭。 连接的当前状态为打开。”;2)其次sql数据库服务从关闭到打开的时候,可以看到我程序的状态栏从“断开”变成了“连通”;
而当我把数据库服务停掉的时候,程序状态栏却始终保持“连通”不变。不知道是怎么回事。或者有更好的做法?我的目的只是要检测数据库是否处于可连接状态,即网络不通、数据库服务没启动,等等状态统统都检测为“断开”;而当检测为“连通”时,必须是可以通过conn.Open()打开数据库连接。
using (SqlConnection conn = new SqlConnection(Config.SQL_CONN_STR))
{
while (true)
{
try
{
conn.Open();
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Closed)
{
//把我的程序的状态栏的Label设置为断开
sspsl_ConnState.Text = "断开";
}
else if (conn.State == ConnectionState.Open)
{
sspsl_ConnState.Text = "连通";
conn.Close();
}
//下面三行是我自己写的异常记录日志,下面会把日志记录贴出来
StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Tool.WriteLog(true , ex , st , sf);
}
Thread.Sleep(1000);
}
}
自己的思路是,在线程中创建一个SqlConnection对象,不停的Open()来检测其State为Open或Closed。1)这样做首先是产生很多异常:
我把sql数据库服务关闭时,产生异常“在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)”;
把数据库服务打开时,产生异常“连接未关闭。 连接的当前状态为打开。”;2)其次sql数据库服务从关闭到打开的时候,可以看到我程序的状态栏从“断开”变成了“连通”;
而当我把数据库服务停掉的时候,程序状态栏却始终保持“连通”不变。不知道是怎么回事。或者有更好的做法?我的目的只是要检测数据库是否处于可连接状态,即网络不通、数据库服务没启动,等等状态统统都检测为“断开”;而当检测为“连通”时,必须是可以通过conn.Open()打开数据库连接。
using (SqlConnection conn = new SqlConnection(Config.SQL_CONN_STR))
{
while (true)
{
try
{
conn.Open();
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Closed)
{
//把我的程序的状态栏的Label设置为断开
sspsl_ConnState.Text = "断开";
}
else if (conn.State == ConnectionState.Open)
{
sspsl_ConnState.Text = "连通";
conn.Close();
}
//下面三行是我自己写的异常记录日志,下面会把日志记录贴出来
StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Tool.WriteLog(true , ex , st , sf);
}
Thread.Sleep(1000);
}
}
解决方案 »
- C# 飞机游戏问题
- 方法多少个参数才算多!
- 如何谈需求
- 能演示一下重写TEXTBOX 控件事件 后新控件的使用方法吗?
- 获取父控件的办法?
- 在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 信号灯超时时间已到)
- Int32.Parse(dg1.Items[j].Cells[5].Text.ToString())数据转换出错
- 一个有关文本框输入转化为double型的问题
- 请教 报表的设计 我的报表行字段太多 一行没法排列 要改两行排列 请教一些问题
- .net core 读取appsettings.json时中文乱码,Configuration.GetConnectionString
- 哪位大侠不吝赐教:用户的ADSL猫和电信局端之间传送的是PPP帧还是以太网帧?
- DevComponents DotNetBar控件问题,这个控件怎么没有状态栏呢,
而此后我再关闭数据库服务,异常却不会变回去-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
Time :10:56:20.6562500
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
Time :10:56:21.7187500
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
Time :10:56:22.7656250
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
Time :10:56:23.7656250
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
Time :10:56:24.7812500
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:27.5000000
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:29.5156250
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:31.5156250
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:33.5156250
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:35.5312500
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:37.5312500
-------------------------
Location : UIL.Form_Main.GetDbConnectionState | 178
Message : 连接未关闭。 连接的当前状态为打开。
Time :10:56:39.5312500
SqlConnection.Open是怎么实现的?
原理上讲就是 sqlserver 服务的 tcp port 通道建立,如果失败报错
你非要自己写个tcp port通信测试,有这必要么?
对的,我就是这个意思,这样不就可以避免 .OPen报错然后程序异常退出么~
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;namespace MyProgram.UIL
{
public class Service
{
public static void StartMSSQLSERVER()
{
ServiceController sc = new ServiceController("MSSQLSERVER");
switch (sc.Status)
{
case ServiceControllerStatus.Stopped:
sc.Start();
break;
case ServiceControllerStatus.Paused:
sc.Continue();
break;
case ServiceControllerStatus.StartPending:
break;
default:
break;
}
do
{
sc.Refresh();
Thread.Sleep(1000);
} while (!sc.Status.Equals(ServiceControllerStatus.Running));
}
}
}
至于远程数据库连接如6#所说,没有必要去特别侦测
如果是害怕程序崩溃,添加一个try-catch就好了
我这样写好像有问题:
当之前连接正常,然后我把服务关闭后,还是提示连接正常,open不出异常,郁闷了。请大侠指导
public static bool ChkOCDBLink(string connString)
{
bool result = true; OracleConnection conn = null;
try
{
conn = new OracleConnection(connString);
conn.Open();
if (conn.State == ConnectionState.Open)
{
result = true;
conn.Close();
}
else
{
result = false;
}
}
catch (OracleException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
result = false;
}
finally
{
if (conn != null)
{
conn.Dispose();
conn = null;
}
}
return result;
}
但我 PING 主机名时会异常,只能 PING IP 地址.