首页 / 资讯中心 / 文章详情

VS2019 VB.NET 读写 SQL Server 例程:从连接到保存的完整实现

VS2019 VB.NET 读写 SQL Server 例程:从连接到保存的完整实现 ★ FEATURED ARTICLE
简介这份源码面向使用 VB.NET 进行数据库开发的初学者与工程人员解决在 VS2019 环境下连接 SQL Server 2014 并完成数据读取与写入的典型问题。资源以 FUNCTION 函数形式封装数据库操作运行后可直接查询并显示结果编辑文本内容后点击保存即可写回数据库适合工程直接引用或项目二次开发。压缩包共 45 个文件约 635KB包含 7 个 vb 源码文件、10 个 dll 依赖库、2 个 exe 可执行程序以及 sln 解决方案、vbproj 工程文件、config 配置、resx 资源与 htm 升级报告等覆盖从工程结构到运行输出的完整环节。目前已有 680 人学习下载。读者可从中获得可直接运行的数据库存取示例、函数封装思路与工程目录组织方式便于快速理解 VB.NET 与 SQL 的交互流程并在此基础上扩展串口参数、报表等模块减少重复搭建环境的时间。1. 从一份 VS2019 的 VB.NET 例程说起它到底能帮你省掉多少事如果你手头正好有一个 SQL Server 2014 的库表结构已经定好现在需要做一个能查、能改、能保存的小工具或者你接了一个老项目的二次开发对方丢给你一个.sln文件说“照着这个改”——那你大概率会需要一份能直接跑通的 VB.NET 数据库读写例程。这份基于 VS2019 开发的 VB.NET 对 SQL 数据库进行读取与写入的例程源码核心价值就在于它把“连接数据库、查询、显示、编辑、保存”这条链路完整地走了一遍而且是用 FUNCTION 函数封装的方式写的不是那种把所有逻辑堆在按钮事件里的面条代码。它适合两类人一类是刚接触 VB.NET 和 SQL Server 配合开发的新手想找一个能直接 F5 运行、看到数据在窗体上显示出来的最小可运行单元另一类是做工业上位机、串口通信、报表输出的工程师因为这份源码里除了数据库读写还带了串口参数配置和报表相关的模块工程结构比较贴近实际项目拿过来改改就能用。源码包里的文件结构也很清楚.sln解决方案文件、.vbproj项目文件、app.config配置文件、My Project下的资源文件以及几个核心的.vb业务文件没有多余的干扰项。需要提前说清楚的是这份例程针对的是 SQL Server 2014连接方式用的是传统的System.Data.SqlClient不是 Entity Framework 那套 ORM。这意味着你需要对 ADO.NET 的基本对象——SqlConnection、SqlCommand、SqlDataAdapter、DataTable——有个最基础的认知否则后面改连接字符串或者调 SQL 语句的时候会不知道从哪下手。但反过来说正因为它是原生 ADO.NET没有额外的框架依赖所以部署的时候不需要装一堆 NuGet 包拷贝到目标机器上改个连接字符串就能跑这对工程现场来说反而是个优点。2. 把工程跑起来从连接字符串到第一个查询按钮2.1 先看 app.config 里的连接字符串怎么配拿到源码包解压之后第一件事不是急着打开.sln而是先用文本编辑器看一眼app.config。这个文件里通常藏着数据库连接字符串格式大概是Data Sourcexxx;Initial Catalogxxx;User IDxxx;Passwordxxx或者用Integrated SecurityTrue走 Windows 身份验证。如果你本机的 SQL Server 实例名不是默认的localhost或.\SQLEXPRESS这里就必须改否则一运行就报“无法连接到服务器”。!-- app.config 中典型的连接字符串配置 -- configuration connectionStrings !-- Data Source 填你的 SQL Server 实例名Initial Catalog 填数据库名 -- add nameMyDbConn connectionStringData Source.;Initial CatalogSL_BB_20220430;Integrated SecurityTrue providerNameSystem.Data.SqlClient / /connectionStrings /configuration这里有几个参数需要解释一下。Data Source里的那个点.代表本机默认实例如果你装的是命名实例比如SQLEXPRESS就要写成.\SQLEXPRESS。Initial Catalog对应的是你要操作的数据库名源码包里提到的SL_BB_20220430应该就是示例数据库的名字你换成自己的库名即可。Integrated SecurityTrue表示用当前 Windows 账户登录数据库不需要在代码里写用户名密码这在开发阶段最省事但部署到服务器上如果账户权限不够就得改成User IDsa;Password你的密码这种形式。提示改完app.config之后如果 VS2019 里已经打开了项目最好把项目卸载再重新加载一次或者直接重启 VS否则有时候连接字符串的改动不会立即生效这个坑我踩过不止一次。2.2 用 FUNCTION 封装数据库操作读和写分开处理这份例程的一个亮点是把读取和写入分别封装成了 FUNCTION 函数而不是把 SQL 语句散落在各个按钮的 Click 事件里。常见的做法是建一个模块文件比如SQL数据库.vb里面放两个核心函数一个负责执行查询并返回DataTable另一个负责执行增删改并返回受影响行数。这样做的直接好处是窗体代码只需要调用函数、绑定数据逻辑清晰后期改 SQL 语句也不用满项目找。 SQL数据库.vb 中封装的两个核心函数 Imports System.Data.SqlClient Module SQL数据库 读取函数传入 SQL 查询语句返回 DataTable Public Function ExecuteQuery(ByVal sql As String) As DataTable Dim dt As New DataTable() 从 app.config 读取连接字符串 Dim connStr As String System.Configuration.ConfigurationManager.ConnectionStrings(MyDbConn).ConnectionString Using conn As New SqlConnection(connStr) Using cmd As New SqlCommand(sql, conn) Dim adapter As New SqlDataAdapter(cmd) Try adapter.Fill(dt) 填充 DataTable Catch ex As Exception 实际项目中这里应该写日志示例里直接抛出便于调试 Throw New Exception(查询失败 ex.Message) End Try End Using End Using Return dt End Function 写入函数传入 SQL 语句返回受影响的行数 Public Function ExecuteNonQuery(ByVal sql As String) As Integer Dim rows As Integer 0 Dim connStr As String System.Configuration.ConfigurationManager.ConnectionStrings(MyDbConn).ConnectionString Using conn As New SqlConnection(connStr) Using cmd As New SqlCommand(sql, conn) Try conn.Open() rows cmd.ExecuteNonQuery() 执行增删改 Catch ex As Exception Throw New Exception(写入失败 ex.Message) End Try End Using End Using Return rows End Function End ModuleExecuteQuery里用的是SqlDataAdapter.Fill这个方法会自动打开和关闭连接适合查询场景。ExecuteNonQuery则需要手动conn.Open()因为它执行的是INSERT、UPDATE、DELETE这类语句返回的是受影响的行数。两个函数都用了Using块确保连接和命令对象在离开作用域后自动释放避免连接池被占满。参数sql就是完整的 SQL 语句字符串比如SELECT * FROM 你的表名或者UPDATE 你的表名 SET 字段1值 WHERE 主键1。2.3 窗体端怎么调用查询显示与保存回写窗体这边的逻辑通常是这样窗体加载时调用ExecuteQuery把数据取回来绑定到DataGridView或者一组 TextBox 上用户编辑完内容后点击保存按钮再调用ExecuteNonQuery把改动写回数据库。源码包里提到的“运行直接查询数据库并显示编辑好对应文本内容后点击保存直接保存到 SQL 数据库中”说的就是这个流程。 Form1.vb 中的典型调用方式 Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 窗体加载时查询数据并绑定到 DataGridView Dim dt As DataTable SQL数据库.ExecuteQuery(SELECT * FROM 你的表名) DataGridView1.DataSource dt End Sub Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click 假设界面上有一个 TextBox 叫 txtName一个 txtValue Dim name As String txtName.Text.Trim() Dim value As String txtValue.Text.Trim() 简单的参数拼接实际项目建议用参数化查询防注入 Dim sql As String UPDATE 你的表名 SET 字段2 value WHERE 字段1 name Dim rows As Integer SQL数据库.ExecuteNonQuery(sql) If rows 0 Then MessageBox.Show(保存成功影响 rows 行) 重新查询刷新界面 DataGridView1.DataSource SQL数据库.ExecuteQuery(SELECT * FROM 你的表名) Else MessageBox.Show(没有找到匹配的记录请检查条件) End If End Sub End Class这里要重点说一下参数化查询的问题。上面的示例为了直观用了字符串拼接的方式构造 SQL这在真实项目里是有 SQL 注入风险的。如果你只是本地跑一跑、数据来源可控问题不大但如果这个工具要放到现场或者多人使用建议把ExecuteNonQuery改造成接受SqlParameter数组的版本或者至少对输入内容做转义处理。源码包里如果已经用了参数化写法那就更稳妥直接沿用即可。3. 串口参数与报表模块这份例程的工程化痕迹3.1 串口参数.vb 里藏着的配置思路源码文件列表里出现了串口参数.vb和串口参数.resx这说明这份例程并不是一个纯粹的数据库 Demo而是带有工业现场味道的工程模板。串口参数通常包括波特率、数据位、停止位、校验位这几项在 VB.NET 里一般用SerialPort类来管理。串口参数.vb很可能定义了一个结构体或者类用来承载这些配置项方便在窗体之间传递或者持久化到配置文件里。 串口参数.vb 中可能定义的配置结构 Public Class SerialConfig Public Property PortName As String COM1 串口号 Public Property BaudRate As Integer 9600 波特率 Public Property DataBits As Integer 8 数据位 Public Property StopBits As StopBits StopBits.One 停止位 Public Property Parity As Parity Parity.None 校验位 End Class这种写法的好处是当你需要打开串口时直接把这个对象的属性赋给SerialPort实例就行不需要在代码里硬编码一堆数字。如果你接手的项目里串口通信和数据库读写是并存的——比如设备通过串口上报数据软件把数据存进 SQL 数据库——那这份例程的结构就很有参考价值串口负责采集数据库负责持久化两边通过一个中间层解耦。3.2 报表.vb 与数据转换.vb 的配合方式报表.vb和数据转换.vb这两个文件从名字上看一个负责输出报表一个负责数据格式转换。常见的做法是从数据库查询出来的DataTable先经过数据转换.vb里的函数做一次清洗或格式调整然后传给报表.vb生成可打印或可导出的报表。这种分层在工程类软件里很常见因为现场对报表格式的要求往往和数据库里的原始字段不一致需要做一层映射。如果你只是想要数据库读写部分这两个文件可以先放着不动不影响核心功能运行。但如果你后续要加导出 Excel 或者打印预览的功能这两个文件就是现成的起点。我一般会先看数据转换.vb里有没有现成的DataTable转List(Of T)或者转 JSON 的函数有的话直接复用没有的话再自己补。3.3 工程文件结构对二次开发的影响从文件列表来看这个项目是标准的 VB.NET WinForms 结构.sln是解决方案入口.vbproj是项目文件My Project下面放着AssemblyInfo.vb和资源文件bin和obj是编译输出目录。Project1.suo是用户选项文件通常不需要管它换机器的时候甚至可以删掉让 VS 重新生成。_UpgradeReport.htm和UpgradeLog.htm说明这个项目可能是从更早版本的 VB 升级过来的升级报告里可能会提到一些兼容性问题如果你在 VS2019 里打开时遇到“目标框架不匹配”的提示可以翻翻这两个文件找线索。注意如果你拿到的源码包里bin和obj目录带着编译好的旧文件建议先手动清空这两个目录再重新生成否则有时候会出现“代码改了但运行结果没变”的玄学问题其实就是旧的可执行文件在作怪。4. 避坑与排查连接失败、保存无效、数据显示异常4.1 报“无法连接到服务器”或“登录失败”现象是程序一运行就弹异常提示连接不上 SQL Server。原因通常有三个一是app.config里的Data Source写错了比如本机是命名实例却只写了个点二是 SQL Server 的 TCP/IP 协议没启用或者端口不是默认的 1433三是当前 Windows 账户没有登录数据库的权限。解决办法是先用 SSMS 或者 Azure Data Studio 用同样的连接参数手动连一次确认能连上之后再回头看代码。如果 SSMS 能连而程序连不上那多半是连接字符串的格式问题注意Integrated SecurityTrue和User ID两种方式不要混用。4.2 查询有数据但 DataGridView 不显示现象是代码没报错DataTable里也有行但界面上就是空的。原因可能是DataGridView的AutoGenerateColumns属性被设成了False而你又没有手动添加列。解决办法是把AutoGenerateColumns设回True或者在代码里显式绑定列。另一个常见原因是DataSource赋值之后没有调用Refresh()不过这种情况在 WinForms 里比较少见多数时候是列配置的问题。4.3 点击保存后数据库里没变化现象是点了保存按钮也弹了“保存成功”但去数据库里一查数据还是旧的。原因通常是 SQL 语句的WHERE条件没匹配到任何行ExecuteNonQuery返回了 0但代码里没有对返回值做判断照样弹了成功提示。解决办法是在保存逻辑里加一个rows 0的判断如果返回 0 就提示“没有找到匹配的记录”。另外要检查是不是忘了写WHERE条件导致更新了全表但恰好你看的那行没变——这种情况更隐蔽因为受影响行数可能很大。4.4 从 VS2019 升级或打开时提示目标框架不兼容现象是双击.sln之后 VS2019 提示项目需要迁移或者目标框架不支持。原因可能是这个项目最初是在更早的 VS 版本里创建的.vbproj里记录的目标框架版本比较老。解决办法是在 VS2019 里右键项目、属性把目标框架改成.NET Framework 4.7.2或更高版本然后重新生成。如果改完还有大量编译错误可以看看UpgradeLog.htm里有没有具体的迁移建议通常是一些 API 签名变化导致的按提示改就行。4.5 串口打开失败导致整个程序卡住现象是程序启动后界面无响应或者点某个按钮之后卡死。原因可能是串口初始化代码放在了 UI 线程里而指定的 COM 口不存在或者被占用SerialPort.Open()抛异常后没有妥善处理。解决办法是把串口操作放到后台线程或者Try...Catch里并且在打开之前先用SerialPort.GetPortNames()检查一下当前可用的串口列表。如果你不需要串口功能直接把相关代码注释掉或者把窗体上的串口控件移除不影响数据库读写的主流程。5. 进阶用法把这份例程改成参数化查询与配置分离5.1 用 SqlParameter 替换字符串拼接前面提到过示例里的 SQL 拼接方式有注入风险。如果你要把这份代码用到真实项目里第一步改造就是把ExecuteNonQuery升级成支持参数的版本。具体做法是给函数增加一个SqlParameter()数组参数然后在SqlCommand上调用Parameters.AddRange。这样 SQL 语句里用参数名占位值通过参数对象传入既安全又避免了日期、字符串转义带来的格式问题。 改造后的 ExecuteNonQuery支持参数化 Public Function ExecuteNonQuery(ByVal sql As String, ByVal ParamArray params As SqlParameter()) As Integer Dim rows As Integer 0 Dim connStr As String System.Configuration.ConfigurationManager.ConnectionStrings(MyDbConn).ConnectionString Using conn As New SqlConnection(connStr) Using cmd As New SqlCommand(sql, conn) If params IsNot Nothing AndAlso params.Length 0 Then cmd.Parameters.AddRange(params) End If Try conn.Open() rows cmd.ExecuteNonQuery() Catch ex As Exception Throw New Exception(写入失败 ex.Message) End Try End Using End Using Return rows End Function调用的时候写成ExecuteNonQuery(UPDATE 表名 SET 字段值 WHERE 主键键, New SqlParameter(值, value), New SqlParameter(键, key))这样即使value里包含单引号或者分号也不会破坏 SQL 结构。参数类型建议显式指定比如New SqlParameter(值, SqlDbType.NVarChar) With {.Value value}避免 SQL Server 做隐式转换时出现性能问题或者精度丢失。5.2 把连接字符串从 app.config 迁移到外部配置app.config在编译之后会变成Project1.exe.config跟着可执行文件走。如果你希望现场部署的时候不改程序目录下的文件就能换数据库可以把连接字符串放到一个独立的config.ini或者环境变量里程序启动时读取。常见做法是用My.Settings或者自己写一个简单的配置读取函数从Application.StartupPath下的自定义配置文件里加载。这样现场人员只需要改一个文本文件不需要重新编译也不需要动exe.config。5.3 验证改造是否成功的三个检查点改完之后怎么确认没问题我一般会走这三个检查点。第一用一条带单引号的字符串作为参数值去更新看数据库里存进去的是不是完整的原始内容如果被截断或者报错说明参数化没生效。第二把连接字符串改成一个不存在的数据库名看程序是不是抛出明确的连接异常而不是卡死或者静默失败。第三在ExecuteNonQuery返回 0 的时候确认界面提示的是“没有匹配记录”而不是“保存成功”。这三个点过了基本就能放心用到工程里了。提示改造之前建议先把原始版本用 Git 或者手动复制的方式备份一份因为参数化改造会涉及函数签名的变化窗体端的调用代码也要跟着改万一改到一半发现漏了哪里还能回退到能跑的版本。从那以后我每次拿到这种带数据库读写的例程都会先把连接字符串和 SQL 语句的拼接方式检查一遍确认没有硬编码的密码和注入风险之后再开始跑界面。这个习惯帮我省掉了很多后期返工的时间。希望这份拆解能帮到你让你在 VS2019 里跑通第一个 VB.NET 读写 SQL 数据库的例程时少走点弯路。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站