打造自己的 C# WinForm 应用程序的 SQL Server 连接配置界面

打造自己的 C# WinForm 应用程序的 SQL Server 连接配置界面
在C# WinForm 应用程序非常需要一个 SQL Server 连接配置界面,许多时候,因 SQL Server 服务器地址变更或 数据库登录账户 变更引起的连接失败等情况,客户就可能打电话“找麻烦”。既然这样,还不如提供一个可视化的配置界面,并在用户手册中说明使用方法,尽可能避免这种小问题带来的烦恼。为此,我将自己无聊时写的连接配置源码贴出来给初学者参考,以备不时之需!
想必大家都很熟悉VS服务器资源管理器中的【添加连接】对话框吧!下面是它的截图:
再看看我模仿这个对话框打造的WinForm程序SQL Server 连接配置界面:
呵呵!有几分相似吧!需要的朋友可以参考下面的源码。这份源码是完整的,粘贴到VS中即可使用。
窗体源码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.IO;
  8. using System.Windows.Forms;
  9. using System.Data.Sql;
  10. using System.Data.SqlClient;
  11. using System.Configuration;
  12. namespace CodingMouse.CMCSharpSDK.UI.Forms
  13. {
  14.     /// <summary>
  15.     /// 数据库连接配置界面
  16.     /// </summary>
  17.     public partial class frmConnectionConfig : Form
  18.     {
  19.         #region Private Members
  20.         /// <summary>
  21.         /// SQL Server 连接字符串创建者对象
  22.         /// </summary>
  23.         SqlConnectionStringBuilder _connectionStringBuilder = null;
  24.         /// <summary>
  25.         /// 当前应用程序名称
  26.         /// </summary>
  27.         string _applicationName;
  28.         #endregion
  29.         #region Private Methods
  30.         /// <summary>
  31.         /// 获取 本地网络所有 SQL Server 实例(数据源)
  32.         /// </summary>
  33.         private void GetSqlDataSource()
  34.         {
  35.             // 显示提示信息
  36.             string msg = "正在获取本地网络所有 SQL Server 服务器信息 ...";
  37.             this.toolTip.ToolTipIcon = ToolTipIcon.Info;
  38.             this.toolTip.ToolTipTitle = "请稍候...";
  39.             Point showLocation = new Point(
  40.                 this.lblServer.Left + 2,
  41.                 this.lblServer.Top + this.lblServer.Height);
  42.             this.toolTip.Show(msg, this, showLocation, 1000);
  43.             // 创建 提供了一种枚举本地网络内的所有可用 SQL Server 实例的机制 的实例
  44.             SqlDataSourceEnumerator sdsEnum = SqlDataSourceEnumerator.Instance;
  45.             // 调用 检索包含有关所有可见 SQL Server 2000 或 SQL Server 2005 实例的信息的 DataTable 的方法
  46.             DataTable serverDt = sdsEnum.GetDataSources();
  47.             // 创建新列以拼接 ServerName 以及 InstanceName 列的内容(以此构建连接字符串的 Server / Data Source 项)
  48.             DataColumn dcDataSource = new DataColumn("SqlDataSourceName"typeof(string));
  49.             // 将新列添加到 DataTable
  50.             serverDt.Columns.Add(dcDataSource);
  51.             // 创建新列以用中文方式显示 IsClustered 列内容
  52.             DataColumn dcIsClustered = new DataColumn("IsClusteredCHS"typeof(string));
  53.             // 将新列添加到 DataTable
  54.             serverDt.Columns.Add(dcIsClustered);
  55.             // 遍历 DataTable 并给新列赋予拼接后的值
  56.             foreach (DataRow dataRow in serverDt.Rows)
  57.             {
  58.                 if (!string.IsNullOrEmpty(Convert.ToString(dataRow["InstanceName"])))
  59.                     dataRow["SqlDataSourceName"] = string.Format(@"{0}/{1}",
  60.                         Convert.ToString(dataRow["ServerName"]),
  61.                         Convert.ToString(dataRow["InstanceName"]));
  62.                 else
  63.                     dataRow["SqlDataSourceName"] = string.Format(@"{0}",
  64.                         Convert.ToString(dataRow["ServerName"]));
  65.                 dataRow["IsClusteredCHS"] = 
  66.                     (Convert.ToString(dataRow["IsClustered"]).Trim().ToUpper() == "NO")
  67.                     ? "否" : ((Convert.ToString(dataRow["IsClustered"]).Trim().ToUpper() == "YES"
  68.                     ? "是" : dataRow["IsClustered"]);
  69.             }
  70.             // 如果包含数据行
  71.             if (serverDt.Rows.Count > 0)
  72.             {
  73.                 // 创建窗体数据源封装类实例并封装 DataTable
  74.                 BindingSource source = new BindingSource();
  75.                 source.DataSource = serverDt;
  76.                 // 设置 ComboBox 数据源
  77.                 this.cboSqlDataSource.DataSource = source;
  78.                 this.cboSqlDataSource.DisplayMember = "SqlDataSourceName";
  79.                 this.cboSqlDataSource.ValueMember = "SqlDataSourceName";
  80.                 // 设置 DataGridView 数据源
  81.                 this.dgvServerInfo.DataSource = source;
  82.                 // 设置中文列名
  83.                 this.dgvServerInfo.Columns["SqlDataSourceName"].HeaderText = "服务器名";
  84.                 this.dgvServerInfo.Columns["SqlDataSourceName"].DisplayIndex = 0;
  85.                 this.dgvServerInfo.Columns["ServerName"].HeaderText = "服务器物理名称";
  86.                 this.dgvServerInfo.Columns["ServerName"].DisplayIndex = 1;
  87.                 this.dgvServerInfo.Columns["ServerName"].Visible = false;
  88.                 this.dgvServerInfo.Columns["InstanceName"].HeaderText = "实例名";
  89.                 this.dgvServerInfo.Columns["InstanceName"].DisplayIndex = 2;
  90.                 this.dgvServerInfo.Columns["InstanceName"].Visible = false;
  91.                 this.dgvServerInfo.Columns["IsClustered"].HeaderText = "群集信息";
  92.                 this.dgvServerInfo.Columns["IsClustered"].DisplayIndex = 3;
  93.                 this.dgvServerInfo.Columns["IsClustered"].Visible = false;
  94.                 this.dgvServerInfo.Columns["IsClusteredCHS"].HeaderText = "属于群集";
  95.                 this.dgvServerInfo.Columns["IsClusteredCHS"].DisplayIndex = 4;
  96.                 this.dgvServerInfo.Columns["Version"].HeaderText = "版本";
  97.                 this.dgvServerInfo.Columns["Version"].DisplayIndex = 5;
  98.             }
  99.         }
  100.         /// <summary>
  101.         /// 获取当前服务器上所有数据库名称
  102.         /// </summary>
  103.         private void GetDataBaseName()
  104.         {
  105.             // 显示提示信息
  106.             string msg = string.Format("正在获取服务器 [{0}] 上的数据库信息 ...", cboSqlDataSource.Text.Trim());
  107.             this.toolTip.ToolTipIcon = ToolTipIcon.Info;
  108.             this.toolTip.ToolTipTitle = "请稍候...";
  109.             Point showLocation = new Point(
  110.                 this.lblServer.Left + 2,
  111.                 this.lblServer.Top + this.lblServer.Height);
  112.             this.toolTip.Show(msg, this, showLocation, 1000);
  113.             // 查询服务器上所有数据库的 SQL 查询命令
  114.             string sqlTxt = "Select [Name] From [SysDatabases] Order By [Name]";
  115.             // 保存结果的 DataTable
  116.             DataTable dataBaseDt = new DataTable();
  117.             // 创建连接对象
  118.             using (SqlConnection con = new SqlConnection(GetConnectionString()))
  119.             {
  120.                 // 执行查询
  121.                 try
  122.                 {
  123.                     // 创建适配器对象
  124.                     using (SqlDataAdapter adp = new SqlDataAdapter(sqlTxt, con))
  125.                     {
  126.                         // 将查询结果填充到 DataTable
  127.                         adp.Fill(dataBaseDt);
  128.                     }
  129.                 }
  130.                 catch { }  // 不弹出异常消息
  131.             }
  132.             // 如果 DataTable 包含数据行
  133.             if (dataBaseDt.Rows.Count > 0)
  134.             {
  135.                 // 创建窗体数据绑定对象
  136.                 BindingSource source = new BindingSource();
  137.                 source.DataSource = dataBaseDt;
  138.                 // 将结果绑定到数据库列表
  139.                 cboDataBaseName.DataSource = source;
  140.                 cboDataBaseName.DisplayMember = "Name";
  141.                 cboDataBaseName.ValueMember = "Name";
  142.             }
  143.             else
  144.             {
  145.                 // 移除数据库列表
  146.                 cboDataBaseName.DataSource = null;
  147.             }
  148.         }
  149.         /// <summary>
  150.         /// 获取连接字符串
  151.         /// </summary>
  152.         private string GetConnectionString()
  153.         {
  154.             // 重新创建连接字符串创建者
  155.             _connectionStringBuilder = new SqlConnectionStringBuilder();
  156.             // 获取服务器名称
  157.             if (!string.IsNullOrEmpty(cboSqlDataSource.Text.Trim()))
  158.                 _connectionStringBuilder.DataSource = cboSqlDataSource.Text.Trim();
  159.             // 获取登录类型
  160.             if (rdoValidateBySQLServer.Checked)
  161.             {
  162.                 if (!string.IsNullOrEmpty(txtUserName.Text.Trim()))
  163.                     _connectionStringBuilder.UserID = txtUserName.Text.Trim();
  164.                 if (!string.IsNullOrEmpty(txtPassword.Text.Trim()))
  165.                     _connectionStringBuilder.Password = txtPassword.Text.Trim();
  166.             }
  167.             // 获取默认数据库
  168.             if (!string.IsNullOrEmpty(cboDataBaseName.Text.Trim())
  169.                 || !string.IsNullOrEmpty(txtDataBaseFilePath.Text.Trim())
  170.                 || !string.IsNullOrEmpty(txtLogicalName.Text.Trim()))
  171.             {
  172.                 // 如果是附加一个数据库文件
  173.                 if (rdoAttachADataBaseFile.Checked)
  174.                 {
  175.                     _connectionStringBuilder.AttachDBFilename = txtDataBaseFilePath.Text.Trim();
  176.                     _connectionStringBuilder.InitialCatalog = txtLogicalName.Text.Trim();
  177.                 }
  178.                 else
  179.                     _connectionStringBuilder.InitialCatalog = cboDataBaseName.Text.Trim();
  180.             }
  181.             // 调整连接字符串
  182.             if (rdoValidateByWindows.Checked)
  183.                 _connectionStringBuilder.IntegratedSecurity = true;
  184.             // 返回连接字符串
  185.             return _connectionStringBuilder.ConnectionString;
  186.         }
  187.         #endregion
  188.         #region Public Methods
  189.         /// <summary>
  190.         /// 无参构造
  191.         /// </summary>
  192.         public frmConnectionConfig(string applicationName)
  193.         {
  194.             // 构建设计器控件
  195.             InitializeComponent();
  196.             // 保存当前应用程序名称
  197.             _applicationName = applicationName;
  198.             // 创建连接字符串创建者
  199.             _connectionStringBuilder = new SqlConnectionStringBuilder();
  200.             _connectionStringBuilder.IntegratedSecurity = true;
  201.             
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,为您介绍一下连接 SQL ServerWinform 充值系统案例。 首先,我们需要在 Visual Studio 中创建一个 Winform 应用程序项目。然后,我们需要在项目中添加 SQL Server 数据库连接,可以使用 Visual Studio 提供的 Server Explorer 或者 SQL Server Management Studio 进行操作。 接下来,我们需要设计充值系统的界面和功能。充值系统应该包括用户登录,充值金额输入,余额查询等功能。可以使用 Visual Studio 提供的控件进行设计,例如 TextBox、Label、Button 等。 在代码实现方面,我们需要编写 C# 代码来连接 SQL Server 数据库并实现相应的功能。以下是一个简单的示例代码: ``` using System.Data.SqlClient; // 建立连接 string connStr = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); // 执行 SQL 查询 string sql = "SELECT Balance FROM UserInfo WHERE UserName=@UserName"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@UserName", userName); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { int balance = reader.GetInt32(0); // TODO: 显示余额信息 } // 关闭连接 conn.Close(); ``` 在以上代码中,我们首先建立了一个 SQL Server 数据库连接,并且通过 SqlCommand 对象执行了一条查询语句。然后,我们可以通过 SqlDataReader 对象获取查询结果,并实现相应的功能。 当然,以上代码仅仅是一个简单的示例,实际开发中需要根据具体需求进行更加复杂的功能实现。希望这个案例对您有所帮助。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值