VB.NET+SQL Server员工管理程序TextBox绑定数据库增删改求助
VB.NET + SQL Server 员工管理系统实现方案
现有代码核心问题
- SQL语法不规范:带空格、特殊符号的字段名未用方括号
[]包裹,多条件查询错误使用逗号分隔字段,SQL Server无法正常解析。 - 资源管理混乱:重复初始化数据库连接对象,连接打开后未做关闭/释放处理,容易触发连接池溢出。
- 数据绑定逻辑缺失:未做控件与数据源的双向绑定,手动传参时存在索引赋值错误(插入逻辑中多个字段参数全部赋值给同一个索引位),且核心执行方法
ExecuteNonQuery被注释,操作无法实际写入数据库。 - 安全隐患:更新逻辑使用字符串拼接SQL,存在SQL注入风险,部分字段值未做类型校验直接传入(如日期字段直接传文本值)。
- 逻辑断层:增删改操作完成后未重新加载数据源,界面数据与数据库不同步。
具体实现代码
全局对象定义
替换原有窗体类开头的全局变量声明,统一管理数据库相关对象,避免重复初始化:
Imports System.Data.SqlClient Imports System.Data Public Class Form1 ' 数据库连接字符串,统一配置 Private ReadOnly connStr As String = "Server=localhost;Data Source=DESKTOP-J9KT12C;Database=r3d$3@$taff;Integrated Security=Yes" Private conn As SqlConnection Private da As SqlDataAdapter Private dt As New DataTable() Private bs As New BindingSource()
窗体加载与双向绑定
在Form_Load事件中完成数据加载、控件绑定,实现「选中DataGridView行自动填充输入框、输入框修改自动同步到数据源」的双向效果,不需要手动逐个读取控件Text属性:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load conn = New SqlConnection(connStr) ' 注意:带空格/特殊符号的字段必须加[]包裹 Dim querySql As String = "SELECT [Oracle ID],[Iqama/ID],Firstname,Lastname,Gender,[Mobile No.],[Starting Date],[Order] FROM Table_1" da = New SqlDataAdapter(querySql, conn) ' 自动生成增删改SQL命令,无需手动编写INSERT/UPDATE/DELETE语句 Dim cmdBuilder As New SqlCommandBuilder(da) ' 填充数据 dt.Clear() da.Fill(dt) bs.DataSource = dt ' 绑定DataGridView Table_1DataGridView.DataSource = bs Table_1DataGridView.AllowUserToAddRows = False ' 配置列头显示文本 Table_1DataGridView.Columns(0).HeaderText = "Oracle ID" Table_1DataGridView.Columns(1).HeaderText = "Iqama/ID" Table_1DataGridView.Columns(2).HeaderText = "Firstname" Table_1DataGridView.Columns(3).HeaderText = "Lastname" Table_1DataGridView.Columns(4).HeaderText = "Gender" Table_1DataGridView.Columns(5).HeaderText = "Mobile No." Table_1DataGridView.Columns(6).HeaderText = "Starting Date" Table_1DataGridView.Columns(7).HeaderText = "Order" ' 绑定所有输入控件,实现双向同步 Oracle_IDTextBox.DataBindings.Add("Text", bs, "[Oracle ID]") Iqama_IDTextBox.DataBindings.Add("Text", bs, "[Iqama/ID]") FirstnameTextBox.DataBindings.Add("Text", bs, "Firstname") LastnameTextBox.DataBindings.Add("Text", bs, "Lastname") GenderComboBox.DataBindings.Add("Text", bs, "Gender") Mobile_No_TextBox.DataBindings.Add("Text", bs, "[Mobile No.]") Starting_DateDateTimePicker.DataBindings.Add("Value", bs, "[Starting Date]") OrderTextBox.DataBindings.Add("Text", bs, "[Order]") End Sub
增删改功能实现
替换原有按钮事件逻辑,不需要手动拼接SQL、循环遍历行,所有数据更新由适配器自动处理:
' 新增记录按钮 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click bs.AddNew() Oracle_IDTextBox.Focus() End Sub ' 保存按钮(新增/修改通用) Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click Try bs.EndEdit() dt.AcceptChanges() ' 提交所有改动到数据库 da.Update(dt) ' 重新加载最新数据 dt.Clear() da.Fill(dt) MsgBox("数据保存成功") Catch ex As Exception MsgBox("保存失败:" & ex.Message) End Try End Sub ' 删除记录按钮 Private Sub Button5_Click_1(sender As Object, e As EventArgs) Handles Button5.Click If bs.Current Is Nothing Then MsgBox("请先选择要删除的记录") Return End If If MsgBox("确认删除当前选中的员工记录?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then bs.RemoveCurrent() da.Update(dt) dt.Clear() da.Fill(dt) End If End Sub ' 关闭窗体按钮 Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click ' 释放数据库连接 If conn IsNot Nothing AndAlso conn.State = ConnectionState.Open Then conn.Close() conn.Dispose() End If Me.Close() End Sub
Excel导出功能
先右键项目 -> 添加 -> 引用 -> 程序集,勾选Microsoft.Office.Interop.Excel后添加以下导出按钮逻辑:
' 导出Excel按钮 Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click Dim excelApp As New Microsoft.Office.Interop.Excel.Application() Try excelApp.Workbooks.Add() ' 写入表头 For colIdx As Integer = 0 To Table_1DataGridView.Columns.Count - 1 excelApp.Cells(1, colIdx + 1) = Table_1DataGridView.Columns(colIdx).HeaderText Next ' 写入行数据 For rowIdx As Integer = 0 To Table_1DataGridView.Rows.Count - 1 For colIdx As Integer = 0 To Table_1DataGridView.Columns.Count - 1 excelApp.Cells(rowIdx + 2, colIdx + 1) = Table_1DataGridView.Rows(rowIdx).Cells(colIdx).Value?.ToString() Next Next ' 自动调整列宽 excelApp.Columns.AutoFit() excelApp.Visible = True Catch ex As Exception MsgBox("导出失败:" & ex.Message) excelApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp) End Try End Sub End Class
注意事项
- 所有SQL语句中,名称带空格、斜杠等特殊字符的字段、表名,必须用方括号
[]包裹,否则会报语法错误。 SqlDataAdapter会自动管理数据库连接的打开和关闭,不需要手动调用conn.Open(),避免连接泄漏。- 原有代码中拼接SQL实现更新的逻辑不要使用,参数化查询可以避免SQL注入风险,
CommandBuilder生成的命令默认就是参数化的。 - 没有用到的空事件方法(比如
TextBox5_TextChanged这类无逻辑的方法)可以直接删除,减少冗余代码。 - 如果不需要依赖Office组件导出Excel,可以换成NPOI等第三方开源库,不需要安装Office也能实现导出。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

