SQL Server 使用C#窗体与数据库连接,制作数据库查看器

本文中心:讨论C#对SQL Server 的增删改查,使用Treeview制作数据库查看器。

  • SSMS部分:确保SQL Server 提供 SQL身份验证,同时建立一个对 名为 test 的数据库有操作权限的用户(用户名:pc,密码:123456)
--建表,插入数据
use test; create table [User_Info](
[ID] int not null primary key,
[Username] varchar(20) not null,
[Password] varchar(10) not null
); create table [Blog](
[ID] int not null primary key check([ID]>0),
[Title] varchar(100) not null,
[Content] varchar(100),
[Author_Id] int references [User_Info]([ID])
); insert into [User_Info] values(001,'Kevin Li','123456');
insert into [User_Info] values(002,'Donold','123456');
insert into [User_Info] values(003,'Ki','123456');
insert into [User_Info] values(004,'Steves','123456');
insert into [User_Info] values(005,'Bill','123456');
insert into [User_Info] values(006,'Jaf','123456');
insert into [User_Info] values(007,'An Li','123456'); insert into [Blog] values(01,'Build Your Dreams','Read and Action',005); select * from User_Info;
select * from Blog;

  • C#部分:VS2022新建一个窗体应用,项目名称:”SQLServerConnection“

  • V层:主窗体Form1布局以及修改属性如下:

    • form1

      • 事件 Load=Form1_Load
      • 属性 StartPosition=CenterScreen
      • 属性 FormBorderStyle = FixedSingle
      • 属性 Text = SQLServer数据库查看器
      • 属性 MaximizeBox = False
    • treeView1
      • 事件 AfterSelect = treeView1_AfterSelect
    • listView1
      • 属性 FullRowSelect = True
      • 属性 GridLines = True
      • 属性 View = Details

  • M层:新建数据库连接类 DB.cs

    相当于M层的角色,采用了单例的思想编写,确保数据库不会被多次连接占用系统的资源.C#对SQL Server的查询过程为:先打开数据库,查询,关闭数据库连接。只是查出来的结果,C#直接放到 **SqlDataAdapter **中,再直接 Fill 方法填充到 DataTable 里面。

    这里主要提供两个方法,一是 getBySql 提供查询使用,即从SQL Server 查询数据使用;二是 setBySql 用作写数据。上述两个方法提供不同参数的重载,主要是用于应对带参数与不带参数的查询。

    这里采用 string.format("{0}{1}",new Object[]{"a","b"});将a,b分别替换{0}与{1}的位置,防止任何形式的SQL注入。如补加 and 1 or 1在后面最后会形成 where xx = 'and 1 or 1'。

    同时由于C#规定不能在构造函数中关闭连接,这里只能实现 IDisposable 的接口。

    在本程序中没用到写。

using System;
using System.Collections.Generic;
using System.Data; //DataTable 用到
using System.Data.SqlClient; //一系列的数据库操作类用到
using System.Text; namespace SQLServerConnection
{
class DB : IDisposable
{
private SqlConnection sqlConnection; //以下代码保证该类只能有一个实例
//在自己内部定义自己的一个实例,只供内部调用
private static DB db = null; //这个类必须自动向整个系统提供这个实例对象
//这里提供一个供外部访问本class 的静态方法,可以直接访问
public static DB GetInstance()
{
if (db == null)
{
db = new DB();
}
return db;
} //私有无参构造函数
public DB()
{
sqlConnection = new SqlConnection("server=.;uid=pc;pwd=123456;database=test");
sqlConnection.Open();
} //单例化结束 //查询
public DataTable GetBySql(String sql, Object[] param)
{
sql = String.Format(sql, param);//用字符串参数替换的形式防止注入
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(new SqlCommand(sql, sqlConnection));
DataTable dataTable = new DataTable();
sqlDataAdapter.Fill(dataTable);
return dataTable;
} //无参数的查询
public DataTable GetBySql(String sql)
{
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(new SqlCommand(sql, sqlConnection));
DataTable dataTable = new DataTable();
sqlDataAdapter.Fill(dataTable);
return dataTable;
} //无查询结果的修改
public void setBySql(string sql, Object[] param)
{
sql = String.Format(sql, param);//用字符串参数替换的形式防止注入
new SqlCommand(sql, sqlConnection).ExecuteNonQuery();
} //无参数,无查询结果的修改
public void setBySql(string sql)
{
new SqlCommand(sql, sqlConnection).ExecuteNonQuery();
} //相当于析构函数
public void Dispose()
{
sqlConnection.Close();
//在C#中关闭数据库连接不能在类的析构函数中关闭,否则会抛出“内部.NET Framework 数据提供程序错误 1”的异常
//通过实现C#中 IDisposable 接口中的 Dispose() 方法主要用途是释放非托管资源
}
}
}
  • C层:Form1.cs,承担将数据库的查询结果与其他组件连接起来的角色。主要使用了TreeView,对其节点TreeNode的操作,节点名同样是Text,在节点下添加节点用父节点Nodes.Add(子节点)。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; namespace SQLServerConnection
{
public partial class Form1 : Form
{
DB db;
public Form1()
{
InitializeComponent();
}
//选择树节点触发
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//删除根节点,点击根节点是没有任何动作的!
if (e.Node.Parent != null)
{
string table_name = e.Node.Text;
groupBox2.Text = "表" + table_name;
listView1.Clear();
//查表的信息
DataTable table_info = db.GetBySql("select name from syscolumns where id=object_id('{0}')", new Object[] { table_name });
for (int i = 0; i < table_info.Rows.Count; i++)
{
for (int j = 0; j < table_info.Columns.Count; j++)
{ //生成表头
listView1.Columns.Add(table_info.Rows[i][j] + "", listView1.Width / table_info.Rows.Count - 1, HorizontalAlignment.Left);
}
}
//查表的内容
DataTable table = db.GetBySql("select * from [{0}]", new Object[] { table_name });
//数据更新,UI暂时挂起,知道EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度
listView1.BeginUpdate();
for (int i = 0; i < table.Rows.Count; i++)
{
ListViewItem listViewItem = new ListViewItem();//生成每一列
for (int j = 0; j < table.Columns.Count; j++)
{
if (j <= 0)
{
listViewItem.Text = table.Rows[i][j] + "";
}
else
{
listViewItem.SubItems.Add(table.Rows[i][j] + "");
}
}
listView1.Items.Add(listViewItem);
}
//结束数据处理,UI界面一次性绘制。
listView1.EndUpdate();
}
} private void Form1_Load(object sender, EventArgs e)
{
try
{
TreeNode root_node = new TreeNode();//建立节点
root_node.Text = "Test 数据库";
treeView1.Nodes.Add(root_node);
db = DB.GetInstance();//初始化数据库查询单例 DB.cs
//查询test数据库有多少张表
DataTable table_name = db.GetBySql("select name from sysobjects where(xtype = 'U')");
//遍历查询出来的结果表(视图)
for (int i = 0; i < table_name.Rows.Count; i++)
{
for (int j = 0; j < table_name.Columns.Count; j++)
{
TreeNode treeNode = new TreeNode();
treeNode.Text = table_name.Rows[i][j] + "";
//一一将查询结果也就是表名添加到树节点
root_node.Nodes.Add(treeNode);
}
}
}
catch
{
MessageBox.Show(this.Text, "数据库出错!");
Environment.Exit(1);
}
}
}
}
  • 效果

解决方案含有的目录:

DB.cs 是数据库连接类

Form1.cs 是主窗体

SQL Server 使用C#窗体与数据库连接,制作数据库查看器的更多相关文章

  1. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系

    原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...

  2. 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比

    SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...

  3. 使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)

    使用SQL Server 2008的事务日志传送功能备份数据库(logshiping) 使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)

  4. 利用SQL Server Management Studio(SSMS)复制数据库

    利用SQL Server Management Studio(SSMS)复制数据库 标签(空格分隔): SQLServer 前言 今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低, ...

  5. 无法定位 Local Database Runtime 安装。请验证 SQL Server Express 是否正确安装以及本地数据库运行时功能是否已启用。

    错误描述: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provide ...

  6. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions

    这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...

  7. SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing

    SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...

  8. SQL Server GUID 数据迁移至MongoDB后怎样查看?

    关键字:SQL Server NEWID():BSON:MongoDB UUID 1.遇到的问题和困惑 SQL Server中的NEWID数据存储到MongoDB中会是什么样子呢?发现不能简单的通过此 ...

  9. [转载]使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)

    http://www.cnblogs.com/benbenkoala/archive/2009/03/11/1407793.html 引言:SQL Server的事务日志传送备份是仅次于镜像的高可靠性 ...

  10. 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”

    注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...

随机推荐

  1. Java:错误:不支持发行版本5

    #解决方案1 1.点击File--Project Structure 2.点击Project 3.查看jdk版本是否和安装的一样 4.点击Modules 查看版本 5.点击Preferences--B ...

  2. 让AI支持游戏制作流程:从游戏设计到发布一个完整的生态系统

    目录 引言 随着游戏产业的快速发展,人工智能(AI)技术在游戏开发中的应用越来越广泛.游戏设计人员可以通过利用AI技术来自动化游戏中的某些流程,提高游戏制作的效率,降低开发成本,同时还可以创造出更加具 ...

  3. C++ 核心指南之资源管理(上)

    C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正 ...

  4. 构建高可用性的 SQL Server:Docker 容器下的主从同步实现

    摘要:本文将介绍如何在 Docker 环境下搭建 MS SQL Server 的主从同步,帮助读者了解主从同步的原理和实现方式,进而提高数据的可靠性和稳定性. 一.前言 在当今信息化的时代,数据的安全 ...

  5. Java 统计大串中小串出现的次数 举例:在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"中java出现了5次

    代码如下: public static void main(String[] args) { //大串 String max = "woaijavawozhenaijavawozhendea ...

  6. JMH – Java基准测试

    官方资源 官方Github样例 应用场景 对要使用的数据结构不确定,不知道谁的性能更好 对历史方法代码重构,要评判改造之后的性能提升多少 (我要做的场景) 想准确地知道某个方法需要执行多长时间,以及执 ...

  7. 基于百度AI平台的人脸识别评分小程序

    face-recognition-scoring-applet 开放源代码,遵循Apache License 2.0 效果展示 可切换摄像头.拍照.从相册选择 效果预览 小程序账号注册及配置 地址:h ...

  8. Kurator v0.4.0版本更新4大内容,满足多云环境的复杂需求

    摘要:在最新发布的 v0.4.0 版本中,Kurator 进一步丰富了分布式云原生场景下的应用统一管理能力,以便更好地满足多云环境的复杂需求. 本文分享自华为云社区<Kurator v0.4.0 ...

  9. 【WebRtc】获取媒体设备信息

    加载设备信息页面 加载完设备信息页面 Code /** * 加载当前设备的音视频信息 */ initInnerLocalDevice() { let that = this; // 判断是否支持 if ...

  10. Redis理论

    什么是Redis Redis(Remote Dictionary Server)是使用C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis可以存储键和五种不同类型 ...