目录
前言
我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。
哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。
本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。
·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
一、问题描述
二、解决方案
第一个ip(192.168.*)是外网地址,第二ip(211.103.*)是公网地址,第三ip(202.101.*)是公网地址。客户要求功能程序通用性,在以上三个环境,任意一个都可以访问数据,并实时更新组件。所以我们要按以上顺序,快速判断是否可以连接,连接不上的自动切换下一个ip,而不是等待卡死。
三、软件开发(源码)
3.1 方法一:TcpClient
/// <summary>
/// 测试服务器连通,默认5
/// </summary>
/// <param name="millisecondsTimeout"></param>
/// <returns></returns>
public bool TestConnection(int millisecondsTimeout = 5)
{
TcpClient client = new TcpClient();
try
{
var ar = client.BeginConnect(Str_ServerIP, Int_port, null, null);
ar.AsyncWaitHandle.WaitOne(millisecondsTimeout);
return client.Connected;
}
catch (Exception)
{
return false;
}
finally
{
client.Close();
}
}
3.2 方法二:Ping
创建类PingIpHelper.cs,复制以下代码:
/// <summary>
/// 测试服务器连通
/// </summary>
/// <param name="millisecondsTimeout"></param>
/// <returns></returns>
public bool TestConnection()
{
Ping pingSender = new Ping();
try
{
PingReply reply = pingSender.Send(Str_ServerIP, 120);
return reply.Status == IPStatus.Success;
}
catch (PingException)
{
return false;
}
}
四、项目展示
4.1 程序界面设计
就是一个按钮,检测能否连接上数据库。这里我使用方法一,提示连接不上,其实可以连接的。
4.2 调用代码
使用MySQLcommand访问数据库。
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <returns>影响的记录数</returns>
public int ExecuteSql(string SQLString)
{
using (MySqlConnection connection = new MySqlConnection(Str_Connection))
{
using (MySqlCommand cmd = new MySqlCommand(SQLString, connection))
{
try
{
connection.Open();
return cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
throw e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
}
#region 数据库测试
private void BTN_DBTest_Click(object sender, EventArgs e)
{
dxErrorProvider1.ClearErrors();//清空一下错误,不然上一次错误依旧在
if (text_serverIP.Text == "")
{
dxErrorProvider1.SetError(text_serverIP, "服务器IP不为空!");
text_serverIP.Focus();
return;
}
if (text_uid.Text == "")
{
dxErrorProvider1.SetError(text_uid, "用户名不为空!");
text_uid.Focus();
return;
}
if (text_pwd.Text == "")
{
dxErrorProvider1.SetError(text_pwd, "密码不为空!");
text_pwd.Focus();
return;
}
MySQLHelper mySQL = new MySQLHelper();
if (mySQL.TestConnection())
{
FrmTips.ShowTipsSuccess(this, "数据库连接成功!");
}
else
{
FrmTips.ShowTipsSuccess(this, "数据库连接失败,请检查!");
}
}
#endregion
4.3 命令行测试
我使用Telnet,测试连接。
提示是3306端口访问不了,还有乱码,我服务器上数据库管理工具未激活,并且到期了,不知道是不是这个原因。
4.4 更换成方法二测试
更换成方法二测试成功,这两个方法建议都试一试,没有谁好谁坏,都是一样的,只是环境不同会导致结果不同。
五、系列文章
C#项目--业务单据号生成器(定义规则、自动编号、流水号)
本文链接:C#项目--业务单据号生成器(定义规则、自动编号、流水号)_花北城的博客-CSDN博客
C#项目--开始日期结束日期范围计算(上周、本周、明年、前年等)
本文链接:C#项目--开始日期结束日期范围计算(上周、本周、明年、前年等)_c# 上周_花北城的博客-CSDN博客
C#项目--数据实体类使用
本文链接:C#底层库--数据实体类_c#实体类_花北城的博客-CSDN博客
C#项目--单据审批流方案
本文链接:C# 单据审批流方案_c# 审批流_花北城的博客-CSDN博客
C#项目--二维码标签制作及打印(完整版)
本文链接:C# 二维码标签制作及打印(完整版)_c# 打印标签_花北城的博客-CSDN博客
C#项目--条码管理操作手册
本文链接:条码管理操作手册_花北城的博客-CSDN博客
C#项目--WebAPI发布和IIS部署,及异常处理
本文链接:C# WebAPI项目发布和IIS部署_webapi发布到iis_花北城的博客-CSDN博客
C#项目--提高编程效率,代码自动生成
本文链接:C#提高编程效率--自动代码生成器_c# 代码生成器_花北城的博客-CSDN博客
C#项目--提高编程效率,Excel数据导入工具
本文链接:C#提高编程效率专辑—数据导入工具_c# 导表工具_花北城的博客-CSDN博客
C#项目--Windows服务(Service)安装及启停方案
本文链接:Windows服务(Service)安装及启动停止方案_windows服务安装_花北城的博客-CSDN博客
C#项目--穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:C#项目--穿透Session隔离,服务调用窗体程序(详细)_c# 服务打开程序没有界面_花北城的博客-CSDN博客
C#项目--任务计划实现,使用Quartz类
本文链接:Quartz封装任务计划管理类_花北城的博客-CSDN博客
C#项目--《周计划管理关于产前准备模块》解决方案20200203
本文链接:《周计划管理关于产前准备模块》解决方案20200203_花北城的博客-CSDN博客
C#项目--项目中,源码解析的正则表达式
本文链接:代码解析正则表达式_代码转换正则表达式_花北城的博客-CSDN博客
C#项目--如何获取文件版本和MD5值
本文链接:C#获取文件版本和MD5值_花北城的博客-CSDN博客
C#项目--如何测试网络是否连通方法
本文链接:C#测试网络是否能够访问_花北城的博客-CSDN博客
C#项目--打印模板解决方案(自定义模板、条形码、二维码、图片)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723