☰
C# Winform 连接 SQL Server 实现增删改查:本地与网络连接实战指南
2026/10/20 12:21:45 网站建设 项目流程

简介:这份资源面向C# Winform与SQL Server数据库开发的初学者,提供一套可直接运行的增删改查示例工程,帮助理解网络连接与本地连接两种数据库访问方式。压缩包共28个文件,约168KB,包含6个cs源码文件、1个sql脚本、2个exe可执行程序、2个resx与2个resources资源文件,以及sln解决方案、csproj项目文件和settings配置等,覆盖从项目结构到数据库脚本的完整内容。资源中附带了数据库查询语句与连接配置说明,读者可参考连接字符串写法、ADO.NET中SqlCommand执行INSERT、DELETE、UPDATE、SELECT的流程,以及app.config配置方式,并了解异常处理、事务管理与DataGridView数据绑定等常见做法。目前已有2675人学习下载,适合刚接触Winform桌面开发、希望快速搭建数据库驱动应用并掌握基本数据管理思路的新手参考实践。

1. 从零上手 C# Winform 连 SQL Server:新手到底在学什么

很多刚接触 C# 的朋友,第一次听到“Winform 连接数据库做增删改查”时,脑子里冒出来的画面大概是:一个窗口、几个按钮、点一下就能把数据存进去。可真打开 Visual Studio 准备动手,立刻就被一堆名词拦住——连接字符串、实例名、SQL 语句、DataGridView、SqlConnection……每个字都认识,连在一起就不知道从哪下手。其实这件事的本质特别朴素:你的 Winform 程序是一个“前台服务员”,SQL Server 是“后厨仓库”,增删改查就是“点菜、加菜、改菜、退菜”四个动作。新手要学的不是把后厨拆开研究,而是先学会怎么把菜单递进去、把菜端出来。这份资源就是帮你把这条“递菜单”的路走通,而且本地连接和网络连接两种场景都覆盖了,适合完全没碰过数据库的 C# 初学者。

2. 先搞懂两件事:Winform 是什么,SQL Server 又是什么

2.1 Winform 就是你拖控件搭出来的桌面程序

Winform 是 .NET 里做 Windows 桌面应用最直接的方式。你打开 Visual Studio,新建一个“Windows 窗体应用”,就会看到一个空白的窗口设计器。左边工具箱里拖一个 Button 上去,双击它,自动跳到代码里生成一个button1_Click方法——这就是 Winform 的典型开发节奏:界面靠拖,逻辑靠写事件。

对新手来说,Winform 最大的好处是“所见即所得”。你不需要先学 HTML、CSS、JavaScript 那一套,也不用管浏览器兼容。一个 TextBox 就是输入框,一个 DataGridView 就是表格,属性面板里改改 Name、Text、Size,界面就出来了。这份资源里的增删改查界面,大概率就是几个文本框加几个按钮,再加一个表格用来显示数据。你只要知道:Winform 负责“长什么样”和“点了之后干什么”,剩下的数据存哪儿、怎么取,交给 SQL Server。

2.2 SQL Server 是帮你把数据存整齐的仓库

SQL Server 是微软的关系型数据库。你可以把它想象成一个超级 Excel:有很多张表,每张表有固定的列(字段),每一行是一条记录。比如一张学生表,列是学号、姓名、年龄,每加一个学生就是加一行。

它和 Winform 的关系是:Winform 不自己存数据,而是通过“连接”把数据发给 SQL Server,SQL Server 存好之后,下次 Winform 再通过“连接”把数据读回来。这个“连接”就是新手第一个要迈的坎。连接分两种:

  • 本地连接:SQL Server 就装在你自己的电脑上,Winform 也在同一台电脑上跑。连接字符串里通常写Server=.;或者Server=(local);,意思是“就找本机”。
  • 网络连接:SQL Server 装在另一台电脑(或者服务器)上,你的 Winform 通过局域网或互联网去连它。连接字符串里要写对方的 IP 地址或者机器名,比如Server=192.168.1.100;。

这份资源把两种连接方式都讲了,还附了数据库查询语句和配置说明,对新手来说省去了大量“我该填什么”的纠结。

2.3 为什么新手要先学“连接”而不是先学“建表”

很多教程一上来就教你CREATE TABLE,结果新手建完表不知道下一步干嘛。更顺的路径是:先让 Winform 和 SQL Server 说上话。哪怕你连上去之后只是执行一句SELECT 1,只要能返回结果,就说明通道打通了。通道打通之后,增删改查不过是换不同的 SQL 语句而已。

提示:如果你还没装 SQL Server,建议先装一个开发者版或者 Express 版,安装时记住实例名,后面写连接字符串要用。

3. 本地连接第一步:把 Winform 和 SQL Server 接上

3.1 准备连接字符串:新手最容易填错的地方

连接字符串就是一张“地址条”,告诉 Winform 去哪里找数据库、用什么身份进。本地连接最常见的写法有两种:

// 方式一:Windows 身份验证,适合本机开发 string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; // 方式二:SQL Server 身份验证,需要用户名和密码 string connStr = "Server=.;Database=MyTestDB;User Id=sa;Password=你的密码;";

逐段解释一下:

  • Server=.里的点代表本机默认实例。如果你安装时起了实例名,比如SQLEXPRESS,就要写成Server=.\SQLEXPRESS。
  • Database=MyTestDB是你要连的数据库名。如果还没建库,可以先连master,进去之后再建。
  • Integrated Security=True表示用当前 Windows 登录身份进,不用输密码,本机开发最省事。
  • User Id和Password是 SQL Server 自己的账号密码,适合网络连接或者需要指定账号的场景。

新手翻车最多的地方是:实例名写错、数据库名写错、密码里有特殊符号没转义。建议先把连接字符串写在一个变量里,后面所有操作都用它。

3.2 写一个“测试连接”按钮,先别急着增删改查

在 Winform 窗体上拖一个 Button,双击进入代码,写下面这段:

using System.Data.SqlClient; private void btnTest_Click(object sender, EventArgs e) { string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; using (SqlConnection conn = new SqlConnection(connStr)) { try { conn.Open(); // 尝试打开连接 MessageBox.Show("连接成功,当前数据库:" + conn.Database); } catch (Exception ex) { MessageBox.Show("连接失败:" + ex.Message); } } }

这段代码做了三件事:用连接字符串创建SqlConnection对象、调用Open()打开通道、成功就弹提示,失败就把错误信息显示出来。using的作用是自动释放连接,避免忘记关连接导致后面连不上。

注意:如果你用的是 .NET Core 或 .NET 5 以上,System.Data.SqlClient可能需要换成Microsoft.Data.SqlClient,通过 NuGet 安装一下即可。

3.3 连接成功之后,先跑一句最简单的查询

连接通了,下一步不是马上做界面,而是先确认能读到数据。在刚才的按钮里再加一段:

using (SqlCommand cmd = new SqlCommand("SELECT TOP 5 * FROM Students", conn)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // reader["Name"] 就是当前行的 Name 列 Console.WriteLine(reader["Name"].ToString()); } } }

SqlCommand负责把 SQL 语句发给数据库,ExecuteReader用来读多行结果。reader.Read()每调用一次就往下走一行,返回false说明读完了。这一步跑通,说明你的 Winform 已经能“看到”数据库里的数据了。

4. 增删改查逐个拆:从按钮到 SQL 语句

4.1 增:把文本框里的内容写进数据库

假设你的窗体上有三个文本框:txtName、txtAge、txtClass,还有一个“添加”按钮。代码如下:

private void btnAdd_Click(object sender, EventArgs e) { string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; string sql = "INSERT INTO Students (Name, Age, Class) VALUES (@Name, @Age, @Class)"; using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { // 用参数代替字符串拼接,防止 SQL 注入 cmd.Parameters.AddWithValue("@Name", txtName.Text); cmd.Parameters.AddWithValue("@Age", int.Parse(txtAge.Text)); cmd.Parameters.AddWithValue("@Class", txtClass.Text); conn.Open(); int rows = cmd.ExecuteNonQuery(); // 返回受影响行数 MessageBox.Show("添加成功,影响行数:" + rows); } } }

这里的关键是Parameters.AddWithValue。新手常见写法是直接拼字符串:"INSERT INTO Students VALUES ('" + txtName.Text + "')",这样一旦输入里有单引号就会报错,而且有 SQL 注入风险。用参数之后,SQL Server 会自动处理转义,安全又省心。

ExecuteNonQuery()用于增删改,返回值是受影响的行数。添加成功通常返回 1。

4.2 删:按学号删除一条记录

删除一般需要一个唯一标识,比如学号Id。窗体上放一个txtId和“删除”按钮:

private void btnDelete_Click(object sender, EventArgs e) { string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; string sql = "DELETE FROM Students WHERE Id = @Id"; using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Id", int.Parse(txtId.Text)); conn.Open(); int rows = cmd.ExecuteNonQuery(); MessageBox.Show(rows > 0 ? "删除成功" : "没有找到对应记录"); } } }

删除和添加的结构几乎一样,区别只是 SQL 语句换成了DELETE。rows > 0说明确实删掉了东西,否则可能是 Id 不存在。

4.3 改:根据 Id 更新字段

修改的 SQL 是UPDATE,同样用参数:

private void btnUpdate_Click(object sender, EventArgs e) { string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; string sql = "UPDATE Students SET Name=@Name, Age=@Age, Class=@Class WHERE Id=@Id"; using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Name", txtName.Text); cmd.Parameters.AddWithValue("@Age", int.Parse(txtAge.Text)); cmd.Parameters.AddWithValue("@Class", txtClass.Text); cmd.Parameters.AddWithValue("@Id", int.Parse(txtId.Text)); conn.Open(); int rows = cmd.ExecuteNonQuery(); MessageBox.Show("更新成功,影响行数:" + rows); } } }

注意WHERE Id=@Id不能漏,否则会把整张表都改掉。新手血泪经验:执行 UPDATE 之前先 SELECT 一下确认条件对不对。

4.4 查:把数据读到 DataGridView 里

查询用SqlDataAdapter配合DataTable最省事:

private void btnQuery_Click(object sender, EventArgs e) { string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; string sql = "SELECT * FROM Students"; using (SqlConnection conn = new SqlConnection(connStr)) { SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); DataTable dt = new DataTable(); adapter.Fill(dt); // 把查询结果填进 DataTable dataGridView1.DataSource = dt; // 绑定到表格控件 } }

SqlDataAdapter相当于一个搬运工,把数据库里的结果集搬到DataTable,然后DataGridView直接显示。你不需要手动一行行读,适合新手快速看到效果。

5. 网络连接和本地连接到底差在哪

5.1 连接字符串里把“点”换成 IP

本地连接写Server=.,网络连接就写对方的 IP 或者机器名:

// 网络连接示例 string connStr = "Server=192.168.1.100;Database=MyTestDB;User Id=sa;Password=你的密码;";

前提是对方的 SQL Server 已经开启了远程连接,并且防火墙放行了 1433 端口。这两件事新手经常漏掉,导致一直连不上。

5.2 网络连接必须注意的三件事

第一,SQL Server 配置管理器里要启用 TCP/IP 协议。第二,防火墙入站规则要允许 1433 端口。第三,如果对方是动态 IP,最好用机器名而不是 IP,或者让网络管理员固定 IP。

提示:测试网络连接时,可以先用telnet 192.168.1.100 1433看看端口通不通。不通就先查网络和防火墙,别急着改代码。

5.3 本地和网络连接在代码上几乎没区别

除了连接字符串不同,增删改查的代码完全一样。所以你完全可以在本机把功能调通,再换成网络连接字符串部署到局域网。这份资源把两种配置都列出来了,新手可以对照着改。

6. 新手避坑:这 5 个问题几乎每个人都会遇到

6.1 现象:报错“无法打开登录所请求的数据库”

原因:连接字符串里的Database写了一个不存在的库名。 解决:先连master,执行SELECT name FROM sys.databases看看有哪些库,再改成正确的名字。

6.2 现象:报错“用户登录失败”

原因:用了 SQL Server 身份验证,但账号密码不对,或者没启用混合验证模式。 解决:本机开发先用Integrated Security=True绕过;必须用账号时,去 SQL Server 属性里确认“安全性”选的是“SQL Server 和 Windows 身份验证模式”。

6.3 现象:网络连接超时

原因:对方防火墙拦了 1433,或者 SQL Server 没开 TCP/IP。 解决:在对方机器上检查 SQL Server 配置管理器,启用 TCP/IP 并重启服务;防火墙加一条入站规则放行 1433。

6.4 现象:插入中文变成问号

原因:数据库字段类型用了varchar而不是nvarchar。 解决:建表时中文字段用nvarchar(50),参数化查询会自动处理 Unicode。

6.5 现象:DataGridView 不显示数据

原因:DataGridView的AutoGenerateColumns默认是 true,但有时候手动设了列没绑对字段。 解决:先注释掉手动列设置,让控件自动生成,确认数据能出来再慢慢调列名。

7. 下一步学什么:从能跑到好用

7.1 先把“参数化查询”变成肌肉记忆

你现在已经能跑通增删改查了,但如果你还在用字符串拼接 SQL,请立刻改掉。参数化查询不仅防注入,还能自动处理日期、小数、引号这些容易翻车的格式。我自己的习惯是:只要 SQL 里出现变量,一律用@参数名,绝不拼字符串。这个习惯越早养成越好。

7.2 学一点“分层”思想,别把代码全写在按钮里

现在你的增删改查代码可能都写在btnAdd_Click、btnDelete_Click里。功能没问题,但以后改起来会痛苦。下一步可以试着把数据库操作抽到一个单独的类里,比如StudentDao,按钮里只调用dao.Add(student)。这样界面和数据库逻辑分开,后面换数据库或者加功能都轻松。

// 简单分层示例 public class StudentDao { private string connStr = "Server=.;Database=MyTestDB;Integrated Security=True;"; public int Add(string name, int age, string cls) { string sql = "INSERT INTO Students (Name, Age, Class) VALUES (@Name, @Age, @Class)"; using (SqlConnection conn = new SqlConnection(connStr)) using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Name", name); cmd.Parameters.AddWithValue("@Age", age); cmd.Parameters.AddWithValue("@Class", cls); conn.Open(); return cmd.ExecuteNonQuery(); } } }

按钮里就变成new StudentDao().Add(txtName.Text, int.Parse(txtAge.Text), txtClass.Text);,清爽很多。

7.3 再往后可以碰的东西

等你把增删改查跑顺了,可以按这个顺序往下走:

阶段学什么解决什么问题
第一步参数化查询安全、格式不出错
第二步简单分层代码不堆在按钮里
第三步事务处理多条 SQL 要么全成功要么全回滚
第四步存储过程把复杂 SQL 放到数据库端
第五步Entity Framework用对象操作数据库,少写 SQL

不用一次全学,先把前两步用熟。我第一次学的时候,就是急着上 Entity Framework,结果连基本的SqlConnection都没搞明白,出了问题完全不知道从哪查。后来老老实实回到 ADO.NET 把连接、命令、参数、读取器走了一遍,再去看 EF 才觉得顺理成章。从那以后我每次带新人,都强制让他们先用原生 ADO.NET 写一遍增删改查,再碰 ORM。希望这份资源能帮你把这一步走稳,后面学什么都不会慌。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询