You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:22:05