`
holoblog
  • 浏览: 1270578 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19636
文章分类
社区版块
存档分类
最新评论

为什么要检测数据库连接是否可用,项目经理说如果实现了这个功能,客户会认可你的软件很专业,很好用

 
阅读更多

如果用户很辛苦的输入了很多数据,点击保存时,才发现服务器连接不可用。这时用户肯定会很恼火,如果你是用户,你也会觉得很冤枉,辛苦输入的数据又不能保存,你干吗不早说呢,早点告诉我服务器不可用,我也可以不用白费功夫。

今天的文章就是为解决这个问题,如何检测SQL Server 服务是否可用,可以连接,以保证任何时候,用户输入数据的工作量不白费,节约客户的时间,如果发现SQL Server服务器不可用,要马上通知用户,阻止用户继续输入数据。做到软件是为解决问题,而不是增加麻烦。

我想到的第一个办法,是在保存数据的时候,检测服务器可否连接,这是必须的,代码如下

public static bool CheckConnectionAvailableBySql()
 {
         SqlConnection conn = new SqlConnection(ConnectionString);
          try
          {
               conn.Open();
               return true;
          }
          catch (Exception ex) { return false; }
}

 

 

但是,我们要达到的目标不是在保存数据时检测,而是用户打开程序后,随时要检测,于是我想到这样,再加一个Timer控件,在它的Tick事件中轮循检测数据库服务是否可用

private void timer_Tick(object sender, EventArgs e)
{
        bool available = Program.CheckConnectionAvailableBySql();
        if (available)
        {               
            Console.WriteLine("server is available");
        }          

}

再把这个封装成BaseForm窗体基类,各种的业务单据输入窗体都继承于这个窗体,这样就实现了在用户打开窗体,输入数据时,随时可以检测数据库连接是否可用。

如果你觉得用SqlConnection会造成对SQL Server服务的性能有影响,可以考虑用网络Ping命令,再配合ServiceProcess对象模型,以提高性能。请看下面的实现代码

private static bool CheckConnectionAvailableByNetwork()
{
     bool available = false;
     SqlConnectionStringBuilder conection = new SqlConnectionStringBuilder(ConnectionString);
     string machineName = conection.DataSource;
     Ping ping = new Ping();
     PingReply reply = ping.Send(machineName, 4000);
     if (reply.Status == IPStatus.Success)
     {
         ServiceController[] AvailableServices = ServiceController.GetServices(machineName);
         foreach (ServiceController AvailableService in AvailableServices)
         {
            if (AvailableService.ServiceName.Equals("MSSQLSERVER", StringComparison.InvariantCultureIgnoreCase))
              {
                  if (AvailableService.Status == ServiceControllerStatus.Running)
                  {
                       available = true;
                       break;
                  }
               }
          }
     }
     return available;
}

这个方法是检测指定的机器的SQL Server服务是否可用,那一句foeach循环遍历改成Linq效率会更好一些。

 

留言的园友提供了另一个实现思路,用网络连接方式,判断SQL Server是否可用,再把它发送到应用程序中。这个思路在我的ERP Solution已经实现了,现在把它分享出来,供大家参考。

image

为实现这个功能,分两个模块,Check SQL Server Available是服务器检测程序,检测SQL Servver是否可用。把它单独放到一个进程中,Main Form是应用程序,把它理解为客户端程序,用于输入数据,保存到SQL Server中。把检测SQL Server服务器是否可用放到一个单独的进程中,是为了节省Main Form程序的资源,我认为用Timer来轮循SQL Server是否可用,会消耗一些内存和CPU,独立出来,Main Form的性能会好一些。

上面给出的代码,CheckConnectionAvailableBySql/CheckConnectionAvailableByNetwork和timer_Tick,就是Check SQL Server Available的代码,下面来分析它如何把SQL Server服务器是否可用的信息发送到Main Form应用程序。

这里使用的是Socket通信,Check SQL Server Available检测SQL Servver是否可用,如果可用,发送S字母到Main Form中,不可用则发送F字母到Main Form中,Main Form根据收到的消息做出处理。如果收到F消息,表示SQL Server已经不可用,马上停止当前的工作,让界面hang-on,效果是这样的

image

我在命令行窗口中敲入net stop mssqlserver以停止当前的SQL Server服务。Check SQL Serve Available的timer_Tick事件检测到SQL Server服务器已经被停掉,于是发送F到Main Form应用程序,Main Form收到这个字母信号,知道SQL Server服务不可用,于是挂起当前的窗体,显示Trying to conncet to the server。

再次,我在命令行中输入net start mssqlserver以启动SQL Serve。当Check SQL Server Available检测到之后,会发送S到Main Form中,Main Form知道SQL Server可用,于是恢复当前的界面,允许用户操作。

为节省网络带宽,Main Form只接受了Check SQL Server Available发送的一个字母,S表示成功连接到SQL Serve服务器,successfully,F表示连接失败,failed。

来分析一下源代码的实现,检测SQL Server是否可用的代码,现在加多了一行发送状态的语句

private void timer_Tick(object sender, EventArgs e)
 {
      bool available = Program.CheckConnectionAvailableBySql();
      if (available)
      {                
              Program.OnSendData("S"); //succesfully 
              Console.WriteLine("server is available");
       }
       else
             Program.OnSendData("F"); //failed
 }

进入到OnSendData方法中,这是标准的Socket 发送字符串的代码,参考如下

 public static void OnSendData(string message)
 {
        try
         {
                Object objData = message;
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
                m_socClient.Send(byData);
          }
          catch (SocketException e)
          {
                //Console.WriteLine(e.ToString());
          }
 }

 

在窗体加载的Load方法中,启动Socket连接程序,以连接到Main Form的socket接口。

public static void EstablishSocketServer()
{
     OnConnect("127.0.0.1", 8221);
}

在Main Form窗体这边,根据接收到的字符的不同,表现不同的状态。代码参考如下

 if (!command.StartsWith("S"))
 {
       TryToConnection dlg = Application.OpenForms["TryToConnection"] as TryToConnection;
       if (dlg == null || dlg.IsDisposed)
           dlg = new TryToConnection();
       dlg.Visible = false;
              
       dlg.Show(this);
       this.Enabled = false;
}
else
{
       TryToConnection dlg = Application.OpenForms["TryToConnection"] as TryToConnection;
       if (dlg != null)
       {
           dlg.Visible = false;
           dlg.Dispose();
           dlg = null;
       }
       this.Enabled = true;
}

关于Socket的介绍,请参考MSDN,在这篇文章中,它的目的是用来传送SQL Server的可用状态。如果你熟悉TCP或是UDP的接口,这一部分也可以替换成你熟悉的网络方式。

0
1
分享到:
评论
5 楼 huqing2010 2011-11-19  
每次检测数据库连接 晕。。。
应该想其它解决方案
4 楼 zhou_1985_liang 2011-11-18  
如果同时有1000万个客户打开窗体程序,你的数据库能受得了吗
3 楼 Reset 2011-11-18  
检测数据库连接是否可用,可以执行下SQL 获得数据库当前时间
2 楼 zui4yi1 2011-11-18  
指的是session失效的问题吧,不影响正常性能的话,可以考虑使用,不过一般不需要考虑。
1 楼 爪哇夜未眠 2011-11-18  
这个对性能有什么影响呢

相关推荐

    2025职业教育知识竞赛题库(含答案).pptx

    2025职业教育知识竞赛题库(含答案).pptx

    基于.NET Core MVC与SQL Server的在线考试管理系统:多角色操作、国际化支持、全套源码与文档附赠,.net core mvc在线考试系统 asp.net在线考试管理系统 主要技术:

    基于.NET Core MVC与SQL Server的在线考试管理系统:多角色操作、国际化支持、全套源码与文档附赠,.net core mvc在线考试系统 asp.net在线考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。 ,核心关键词: .net core mvc; asp.net在线考试管理系统; SQL Server数据库; EF core code first; vue.js; boot

    C++编写的资产管理系统(带SQLServer数据库文件 )

    C++编写的资产管理系统(带SQLServer数据库文件。)。

    递归最小二乘法在线识别轮胎前后侧偏刚度:应用sin工况效果显著,适用多种场景,附simulink模型及代码,1、基于递归最小二乘法在线识别轮胎前后侧偏刚度,图为在正弦曲线工况,估计侧偏刚度的大小,效果

    递归最小二乘法在线识别轮胎前后侧偏刚度:应用sin工况效果显著,适用多种场景,附simulink模型及代码,1、基于递归最小二乘法在线识别轮胎前后侧偏刚度,图为在正弦曲线工况,估计侧偏刚度的大小,效果较好 2、此模型也可用于其他工况下的刚度估计,有需要的朋友可以自行去尝试 3、包含simulink模型和递归最小二乘侧偏刚度估计代码 ,基于递归最小二乘法; 轮胎侧偏刚度在线识别; 正弦曲线工况估计; Simulink模型; 递归最小二乘侧偏刚度估计代码。,递归最小二乘法在正弦曲线工况下的轮胎刚度在线识别模型

    PLL锁相环技术实现:SMIC55工艺下20MHz参考频率三阶二型CPPLL,快速锁定至1GMHz并带环形振荡器与DIV模块功能,pll锁相环 cppll cadence 三阶二型锁相环 工艺smi

    PLL锁相环技术实现:SMIC55工艺下20MHz参考频率三阶二型CPPLL,快速锁定至1GMHz并带环形振荡器与DIV模块功能,pll锁相环 cppll cadence 三阶二型锁相环 工艺smic55 参考频率20MHz 分频比50 锁定频率1GMHz 锁定时间2us 环形振荡器 ring vco PFD模块 DIV模块 45分频,ps counter CP模块 工艺smic55 ,核心关键词:PLL锁相环; CPPLL; 工艺SMIC55; 参考频率20MHz; 分频比50; 锁定频率1GHz; 锁定时间2us; 环形振荡器(Ring VCO); PFD模块; DIV模块(45分频,ps counter); CP模块。,"SMIC55工艺:PLL环及二型锁相环技术解析"

    EKF SLAM 分析及matlab仿真源码

    EKF SLAM matlab simulation. EKF SLAM 分析及matlab仿真源码。

    CPRI IP License支持Xilinx Vivado全版本,无MAC绑定,永久有效授权,CPRI ip license xilinx vivado 支持Vivado各版本,不绑定mac,永久有

    CPRI IP License支持Xilinx Vivado全版本,无MAC绑定,永久有效授权,CPRI ip license xilinx vivado 支持Vivado各版本,不绑定mac,永久有效 ,CPRI; IP license; Xilinx; Vivado; 不绑定Mac; 永久有效; 支持各版本。,"Xilinx Vivado支持:永久有效的CPRI IP License,不绑定MAC"

    机器学习 KNN算法实现鸢尾花分类 (分类算法)

    1.内容概要 通过KNN实现鸢尾花分类,即将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。 2.KNN算法的伪代码 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离; (2)按照距离递增次序排序; (3)选取与当前点距离最小的k个点; (4)确定前k个点所在类别的出现频率; (5)返回前k个点出现频率最高的类别作为当前点的预测分类。 3.数据集说明 代码使用`pandas`库加载了一个名为`iris.arff.csv`的数据集 4.学习到的知识 通过鸢尾花分类学习了KNN算法,选择样本数据集中前k个最相似的数据,就是KNN算法中k的出处。k值过大,会出现分类结果模糊的情况;k值较小,那么预测的标签比较容易受到样本的影响。在实验过程中,不同的k值也会导致分类器的错误率不同。KNN算法精度高、无数据输入的假定,可以免去训练过程。但是对于数据量较多的训练样本,KNN必须保存全部数据集,可能会存在计算的时间复杂度、空间复杂度高的情况,存在维数灾难问

    COMSOL三维采空区通风条件下的氧气与瓦斯浓度分布研究,comsol三维采空区通风条件下,氧气,瓦斯浓度分布 ,核心关键词:comsol; 三维采空区; 通风条件; 氧气浓度分布; 瓦斯浓度分布

    COMSOL三维采空区通风条件下的氧气与瓦斯浓度分布研究,comsol三维采空区通风条件下,氧气,瓦斯浓度分布。 ,核心关键词:comsol; 三维采空区; 通风条件; 氧气浓度分布; 瓦斯浓度分布;,"三维采空区通风模拟:氧气与瓦斯浓度分布研究"

    基于java+ssm+mysql的公交车信息管理系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    DaisyDisk for Mac v4.31

    DaisyDisk for Mac是一款直观且强大的磁盘清理工具,专为Mac用户设计。它通过交互式图表直观展示磁盘空间使用情况,以彩色区块形式呈现文件和文件夹大小,帮助用户快速定位占用空间的大文件。软件支持快速扫描,可在几秒内完成磁盘分析,并提供文件预览功能,避免误删重要文件。DaisyDisk还支持多磁盘管理、云存储扫描、隐私保护和安全删除功能。其界面简洁易用,适合新手和专业人士,是优化磁盘空间、提升系统性能的必备工具。

    三菱FX3U伺服控制框架标准程序详解:定位控制参数设定、回原点操作、JOG手动控制及绝对与相对定位控制,FX3U和三菱伺服控制的框架标准程序,适合新手学习定位用 用 标签分层,说明了定位控制中的公共

    三菱FX3U伺服控制框架标准程序详解:定位控制参数设定、回原点操作、JOG手动控制及绝对与相对定位控制,FX3U和三菱伺服控制的框架标准程序,适合新手学习定位用。 用 标签分层,说明了定位控制中的公共参数设定、回原点、JOG手动、绝对定位、相对定位、控制等部分,有伺服驱动器的针脚接线。 ‘包括有: 1、程序一份 2、说明一份 ,核心关键词:FX3U; 三菱伺服控制; 框架标准程序; 新手学习定位; 标签分层; 公共参数设定; 回原点; JOG手动; 绝对定位; 相对定位; 控制; 伺服驱动器针脚接线。,"三菱FX3U伺服控制框架标准程序:新手定位控制指南"

    Python自动化办公源码-40 excel处理实例(多工作表合并到单工作表)

    Python自动化办公源码-40 excel处理实例(多工作表合并到单工作表)

    2023-04-06-项目笔记 - 第三百八十六阶段 - 4.4.2.384全局变量的作用域-384 -2025.01.22

    2023-04-06-项目笔记-第三百八十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.384局变量的作用域_384- 2025-01-22

    基于MATLAB的含风光柴储微网多目标优化调度策略与模型实现,含风光柴储微网多目标优化调度 MATLAB代码 关键词:微网调度 风光柴储 粒子群算法 多目标优化 参考文档:基于多目标粒子群算法的微

    基于MATLAB的含风光柴储微网多目标优化调度策略与模型实现,含风光柴储微网多目标优化调度 MATLAB代码 关键词:微网调度 风光柴储 粒子群算法 多目标优化 参考文档:《基于多目标粒子群算法的微电网优化调度》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含风机、光伏、柴油发电机以及储能电站在内的微网优化运行模型,并且考虑与上级电网的购电交易,综合考虑了多方经济成本以及风光新能源消纳等多方面的因素,从而实现微网系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,关键词:微网优化调度; 风光柴储; 粒子群算法; 多目标优化; MATLAB代码; MOPSO算法。,基于MATLAB的微网风光柴储多目标优化调度与MOPSO算法的实践研究

    基于java+ssm+mysql的高校就业管理系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    基于java+ssm+mysql的基金交易网站 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    西门子SMART 200电机控制子程序V1.6:智能管理多达7个电机,灵活设置运行参数,故障自动切换备用电机,版本升级持续优化 ,西门子SMART 200 电机控制子程序V1.6,可生成库 可控制1

    西门子SMART 200电机控制子程序V1.6:智能管理多达7个电机,灵活设置运行参数,故障自动切换备用电机,版本升级持续优化。,西门子SMART 200 电机控制子程序V1.6,可生成库 可控制1-7个电机 可设置同时运行的最大电机数量 可设置每个电机是否使用 可设置电机轮时间,当系统单次运行时间>轮时间,停止运行时间最长的电机,上累计运行时间最短的电机 可设置电机启动间隔 每次启动累计运行时间最短的电机 当有电机故障时,立即停止该电机,如果有备用电机自动切备用电机 7个电机内,可自由设置备用电机个数,使用的电机总数-最大电机数量=备用电机个数 附版本升级记录: V1.1优化:当使能被关闭后自动关闭对应电机 V1.2优化:运行中改变同时使用电机数量有效 V1.3更改:open信号上升沿直接启动1个电机(跳过启动间隔),第二个电机启动间隔才有效 轮时间改为秒,当系统单次运行时间>轮时间,停止运行时间最长的电机,上累计运行时间最短的电机 V1.4优化 V1.5满足可以运行的电机数量>同时使用电机数量 时 轮才有效,不满足时,轮计时清零 V1.6 优化某些情况下,无法正确延时 ,核心关键词

    深度学习乐园项目案例分享:A030-DIN模型实现推荐算法

    点击查看,完整项目演示视频,更有数百个深度学习项目案例:zzgcz.com 项目A030-DIN的核心是通过深度学习技术实现个性化推荐算法,旨在为用户提供精准、高效的商品或内容推荐。在现代电子商务、社交媒体及内容平台中,推荐系统作为核心功能,极大地提升了用户体验。DIN(Deep Interest Network,深度兴趣网络)是一种专门针对用户行为数据进行建模的深度学习模型,通过捕捉用户历史行为中的兴趣点,动态地生成推荐结果。DIN模型的一个显著特点是,它能够根据用户的当前兴趣动态调整推荐内容,不仅仅是依赖于用户的全局行为历史。

    基于PID控制的超车轨迹跟踪技术:高效跟踪期望轨迹的详细指南,基于pid控制的超车轨迹跟踪,能够很好的跟踪期望轨迹 有详细的说明文档 ,基于pid控制的超车轨迹跟踪; 轨迹跟踪; 精确性; 详细说明

    基于PID控制的超车轨迹跟踪技术:高效跟踪期望轨迹的详细指南,基于pid控制的超车轨迹跟踪,能够很好的跟踪期望轨迹。 有详细的说明文档 ,基于pid控制的超车轨迹跟踪; 轨迹跟踪; 精确性; 详细说明文档。,基于PID控制的超车轨迹精确跟踪技术:高效追踪期望轨迹的说明文档

Global site tag (gtag.js) - Google Analytics