将DataGridview中的数据存入数据库

2023-05-16

在机房收费的时候我们都会用到DataGridView控件,用来显示从数据库中返回的数据。如何用DataGridView将数据存入到数据库,而且是存入到字段与数据库中不一致的表中呢?


前提介绍


为了将如下的11张表中数据录入到数据库中




这是我们设计的数据库,将部门、公司、表类型、行字段、列字段分别抽象成不同的表,然后用他们的主键作为联合主键形成T_dataTable表




这是显示出的DataGridView形式,开始默认为0




Load事件


将DataGridview的标题整体右移一个单位格,将空出的第一个格显示本表名称,列显示:将每列的第一个单位格中数据显示为列值。


     Private Sub frmGovernmentTable1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '增加行数
        dgvData.Rows.Add(8)

        lineNo = 9
        rowsNo = 18
        listNo = 1
        '初始化行表
        dgvData.Columns(0).HeaderText = "党政人才类别统计表1"  '表头名
        dgvData.Columns(1).HeaderText = "男"
        dgvData.Columns(2).HeaderText = "女"
        dgvData.Columns(3).HeaderText = "少数民族"
        dgvData.Columns(4).HeaderText = "中共党员"
        dgvData.Columns(5).HeaderText = "研究生"
        dgvData.Columns(6).HeaderText = "大学本科"
        dgvData.Columns(7).HeaderText = "大学专科"
        dgvData.Columns(8).HeaderText = "中专"
        dgvData.Columns(9).HeaderText = "高中"
        dgvData.Columns(10).HeaderText = "初中"
        dgvData.Columns(11).HeaderText = "小学"
        dgvData.Columns(12).HeaderText = "35岁及以下"
        dgvData.Columns(13).HeaderText = "36岁至40岁"
        dgvData.Columns(14).HeaderText = "41岁至45岁"
        dgvData.Columns(15).HeaderText = "46岁至50岁"
        dgvData.Columns(16).HeaderText = "51岁至54岁"
        dgvData.Columns(17).HeaderText = "55岁及以上"

        '初始化列表
        dgvData.Rows(0).Cells(0).Value = "中国共产党各级机关"
        dgvData.Rows(1).Cells(0).Value = "各级人民代表大会及其常务委员会机关"
        dgvData.Rows(2).Cells(0).Value = "各级行政机关"
        dgvData.Rows(3).Cells(0).Value = "中国人民政治协商会议各级委员会机关"
        dgvData.Rows(4).Cells(0).Value = "各级审判机关"
        dgvData.Rows(5).Cells(0).Value = "各级检察机关"
        dgvData.Rows(6).Cells(0).Value = "各民主党派和工商联的各级机关"
        dgvData.Rows(7).Cells(0).Value = "参公管理人民团体和群众团体机关"
        dgvData.Rows(8).Cells(0).Value = "参公管理的其它事业单位"

        Call ShowInfo(listNo, rowsNo, lineNo, dgvData)

    End Sub

显示数据模块


U层:循环嵌套遍历所有数据格,将单位格对应的行Id,列Id,以及部门Id、公司Id,表Id赋值给实体传递三层。


Imports BLL
Imports Entity
Module ModuleTable
    Public rowsNo As Integer
    Public lineNo As Integer
    Public listNo As Integer
    Property intno As Integer = 0  '定义一个初始变量,用来判断是否已经录入
    ''' <summary>
    '''显示数据信息
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ShowInfo(listNo As Integer, rowsNo As Integer, lineNo As Integer, dgvData As DataGridView)
        Dim simpleQuerybll As New BLL.BLLInfoInpute
        Dim table As DataTable

        '定义部门ID、公司ID、表ID、行ID、列ID、UserID
        Dim departmentInfo As New Entity.DepartMentEntity
        Dim companyInfo As New Entity.ComPanyEntity
        Dim listInfo As New Entity.ListEntity
        Dim rowInfo As New Entity.RowEntity
        Dim lineInfo As New Entity.LineEntity

        departmentInfo.id = _companytypeid
        companyInfo.id = _companyNameid
        listInfo.id = listNo

        For s = 1 To rowsNo - 1  '18
            For h = 0 To lineNo - 1  '9
                '获得行列名称
                rowInfo.name = dgvData.Columns(s).HeaderText.ToString
                lineInfo.name = dgvData.Rows(h).Cells(0).Value

                '走三层传递
                table = simpleQuerybll.ShowData(departmentInfo, companyInfo, listInfo, rowInfo, lineInfo)  '走三层

                '数据填充
                If table.Rows.Count = 0 Then
                    dgvData.Rows(h).Cells(s).Value = 0
                Else
                    dgvData.Rows(h).Cells(s).Value = table.Rows(0).Item(0)
                    'btnInput.Enabled = False
                End If
            Next
        Next

    End Sub


D层:在SQL语句中查询单位格所对应的data数据,公司行Id和列Id为进行跨表查询name得到。


    ''' <summary>
    ''' 根据表单显示表的数据
    ''' </summary>
    ''' <param name="departmentInfo"></param>
    ''' <param name="companyInfo"></param>
    ''' <param name="listInfo"></param>
    ''' <param name="rowInfo"></param>
    ''' <param name="lineInfo"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ShowData(ByVal departmentInfo As Entity.DepartMentEntity, ByVal companyInfo As Entity.ComPanyEntity, ByVal listInfo As Entity.ListEntity, ByVal rowInfo As Entity.RowEntity, ByVal lineInfo As Entity.LineEntity) As DataTable
        Dim sql As String
        Dim table As DataTable
        Dim helper As New SqlHelper
        '定义参数
        Dim sqlparam As SqlParameter() = {New SqlParameter("@departmentId", departmentInfo.id),
                                          New SqlParameter("@unitId", companyInfo.id),
                                          New SqlParameter("@listId", listInfo.id),
                                          New SqlParameter("@rowName", rowInfo.name),
                                          New SqlParameter("@lineName", lineInfo.name)}
        'Sql 查询语句
        sql = "select data from T_dataTable where departmentId=@departmentId and unitId=@unitId and listId=@listId and rowId=(select id from T_rowTable where name=@rowName) and lineId=(select id from T_lineTable  where name=@lineName)"
        '传入SQLHelper
        table = helper.ExecSelect(sql, CommandType.Text, sqlparam)

        Return table

    End Function


录入模块


U层:循环嵌套遍历所有数据格,将单位格对应的行Id,列Id,以及部门Id、公司Id,表Id赋值给实体传递三层。


Private Sub btnInput_Click(sender As Object, e As EventArgs) Handles btnInput.Click
        listNo = 1
        Call ShowInsert(listNo, rowsNo, lineNo, dgvData)
End Sub

    ''' <summary>
    ''' 插入功能
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ShowInsert(listNo As Integer, rowsNo As Integer, lineNo As Integer, dgvData As DataGridView)

        Dim simpleQuerybll As New BLL.BLLInfoInpute

        '定义部门ID、公司ID、表ID、行ID、列ID、UserID
        Dim departmentInfo As New Entity.DepartMentEntity
        Dim companyInfo As New Entity.ComPanyEntity
        Dim listInfo As New Entity.ListEntity
        Dim rowInfo As New Entity.RowEntity
        Dim lineInfo As New Entity.LineEntity
        Dim dataInfo As New Entity.DataEntity
        If intno = 1 Then
            MsgBox("该条数据已经录入,如需修改请更新!", , "提示")
            Exit Sub
        End If

        '传递部门ID、公司ID、表ID、行ID、列ID、UserID
        departmentInfo.id = _companytypeid
        companyInfo.id = _companyNameid
        listInfo.id = listNo

        Dim s As Integer
        Dim h As Integer
        Dim i As Integer

        For s = 1 To dgvData.Columns(s).HeaderText.Count - 1 's行号
            For h = 0 To dgvData.Rows.Count - 1 '列号

                rowInfo.name = dgvData.Columns(s).HeaderText.ToString
                lineInfo.name = dgvData.Rows(h).Cells(0).Value
                dataInfo.data = dgvData.Rows(h).Cells(s).Value

                i = simpleQuerybll.InsertData(departmentInfo, companyInfo, listInfo, rowInfo, lineInfo, dataInfo)

            Next
        Next

        MsgBox("数据录入成功!", , "提示")

        intno = 1
    End Sub


D层:在SQL语句中插入data数据到所对应的单位格,公司行Id和列Id为进行跨表查询name得到。


    ''' <summary>
    ''' 根据表插入数据
    ''' </summary>
    ''' <param name="departmentInfo"></param>
    ''' <param name="companyInfo"></param>
    ''' <param name="listInfo"></param>
    ''' <param name="rowInfo"></param>
    ''' <param name="lineInfo"></param>
    ''' <param name="dataInfo"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function InsertData(ByVal departmentInfo As Entity.DepartMentEntity, ByVal companyInfo As Entity.ComPanyEntity, ByVal listInfo As Entity.ListEntity, ByVal rowInfo As Entity.RowEntity, ByVal lineInfo As Entity.LineEntity, ByVal dataInfo As Entity.DataEntity) As Integer
        Dim sql As String
        Dim i, j As Integer
        Dim helper As New SqlHelper
        '定义参数集合
        Dim sqlparam As SqlParameter() = {New SqlParameter("@departmentId", departmentInfo.id),
                                          New SqlParameter("@unitId", companyInfo.id),
                                          New SqlParameter("@listId", listInfo.id),
                                          New SqlParameter("@rowName", rowInfo.name),
                                          New SqlParameter("@lineName", lineInfo.name),
                                          New SqlParameter("@data", dataInfo.data)}
        'SQL语句插入T_dataTable表
        sql = "insert into T_dataTable (departmentId,unitId,listId,rowId,lineId,data,isDelete) values (@departmentId,@unitId,@listId,(select id from T_rowTable where name=@rowName),(select id from T_lineTable where name=@lineName),@data,1)"

        i = helper.ExecAddDelUpdate(sql, CommandType.Text, sqlparam)

        Dim sqlparam1 As SqlParameter() = {New SqlParameter("@departmentId", departmentInfo.id),
                                          New SqlParameter("@unitId", companyInfo.id),
                                          New SqlParameter("@listId", listInfo.id)}
        'SQL语句插入已经录入表T_alreadyinputTable
        sql = "Insert into T_alreadyinputTable (departmentId,unitId,listId) values (@departmentId,@unitId,@listId)"
        j = helper.ExecAddDelUpdate(sql, CommandType.Text, sqlparam1)
        Return i

    End Function

(这里面连个语句的连写最好使用存储过程)


更新功能同插入功能类似,只是D层稍有不同。


数据库结果显示




小结


这个功能重要的是理清思路,开始我们做的时候都很迷茫,也许有思路但是实现起来却是没有头脑,但是慢慢地去做,一点点理清,找到结果,当数据显示出来的那一刻很开心。团队合作是一个大的趋势,感谢小伙伴们的支持和帮助~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将DataGridview中的数据存入数据库 的相关文章

随机推荐

  • Android 未进行依赖管理导致的问题:IDE 报错 “Unresolved reference: registerForActivityResult“但是能正常编译运行

    前言 谷歌前段时间废弃了 startActicityForResult 取而代之的是 ActicityResultApi xff0c 作为一个紧跟谷歌步伐走的菜鸟开发者 xff0c 当然想着的是第一时间学习并替换项目中的相关代码 但是 xf
  • 基于DataBinding的基类(Activity、Fragment、Adapter)

    基于DataBinding的基类 xff08 Activity Fragment Adapter xff09 1 BaseBindActivity public abstract class BaseBindActivity lt DB e
  • STM32 LwIP单网卡绑定多个IP地址

    STM32 LwIP单网卡绑定多个IP地址 芯片 xff1a STM32F107VC 编译器 xff1a KEIL4 作者 xff1a SY 日期 xff1a 2018 6 28 11 02 53 概述 在只有一个物理网卡的情况下 xff0
  • nginx 配置https 并兼容http 或强制http 转为https

    当我们升级http 为https时 xff0c 为了兼顾一些访问者还是通过http访问的方式 xff0c 我们通常采用两种方式 第一种 xff1a http 可以访问 xff0c https也可以访问 第二种 xff1a http 访问时
  • 滤波学习理解----EKF(一)

    最近回到slam方向了 xff0c 所以有时间整理一下最近的收获 最复杂也是最简单的模块 滤波 引入 那么滤波是什么呢 xff1f 滤波就是由于观测observation xff08 OB xff09 天生具备的误差和噪声 当有多个信号源观
  • systemd开机启动和关机回调脚本

    一 开机执行一次的脚本 我们通过可以创建一个 etc rc local文件 xff1a etc rc local文件内容如下 xff1a span class token operator span span class token ope
  • (五)Selenium自动化测试实战—PO模式

    nbsp 上一篇 四 selenium自动化测试之上传本地文件 要开朗的spookypop的博客 CSDN博客 selenium上传本地文件 先看下测试代码运行效果 在做自动化测试时 测试框架设计很重要 测试代码写法也很多种 最简单的莫过于
  • 网络隧道技术

    隧道技术摘要 隧道技术 xff08 Tunneling xff09 是网络基础设置在网络之间传递数据的方式 xff0c 使用隧道技术传递可以是不同协议的数据包 xff0c 隧道协议将这些其他协议的数据包重新封装在新的包头中发送 被封装的数据
  • 数据库的备份和还原

    数据库的备份和还原是一个很重要的问题 xff0c 有时候我们一个误删可能数据库里的数据就都没有了 xff0c 所以一定要做好备份的工作 备份 1 右击 任务 备份 2 选择要备份的数据库 xff0c 和备份的类型 完整 xff0c 添加 3
  • 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南

    用过海信双面屏或者eink手机的朋友都知道 xff0c 海信手机就是死活安装不了谷歌全家桶 xff0c 因为海信的领导说跟谷歌有协议不能安装谷歌框架 xff08 还说后期google审核坚决不给安装 xff0c 人家其他ov mui都可以安
  • Windows Terminal无法加载WSL [process exited with code 4294967295 (0xffffffff)]

    在Windows Terminal中WSL无法打开错误代码是 process exited with code 4294967295 0xffffffff xff0c 但在命令行中 通过 34 C Windows System32 wsl
  • 【经验分享】PC端免费高效的同声翻译

    2022 09 26 谷歌翻译退出中国市场 translate googleapis com 与 谷歌翻译web translate google cn现在无法用了 最新解决方法见 https blog csdn net sinat 240
  • 巧用Prometheus来扩展kubernetes调度器

    Overview 本文将深入讲解 如何扩展 Kubernetes scheduler 中各个扩展点如何使用 xff0c 与扩展scheduler的原理 xff0c 这些是作为扩展 scheduler 的所需的知识点 最后会完成一个实验 xf
  • 【C】目录

    ch0 idech01 变量和数据结构ch02 格式化与流程控制ch03 数组ch04 函数ch05 指针ch06 关于C语言的内存布局ch07 复合结构ch08 文件处理
  • 协议数据单元 帧 包 段 报文之间的区别

    Overview 1 协议数据单元 Protocol Data Unit PDU 是应用于OSI模型中的数据结构 xff0c 在OSI模型中每一层都会被添加一个header xff0c tailer进行封装 xff0c header tai
  • 官方摆烂这就是haproxy所谓的云原生架构

    只支持 systemd 这种方式管理 xff0c 其他方式重启失败 xff0c 搜索关键字 xff0c 17个相关问题并未有良好的解决方法 使用master worker方式管理 xff0c data plane api 重启不能拉起hap
  • 【github开源】Linux iptables 界面化 分布式 管理平台 go vue,底座firewalld

    快速部署 xff1a Uranus 目前最优的firewalld前端 如果你觉得项目符合你的使用场景 劳烦大佬点个 x1f31f x1f31f x1f31f 吧 好人一生平安 Uranus Gateway Uranus使命是将iptable
  • iOS真机调试报错(0xE8008016)相关错误

    经常真机运行时候会报错 xff0c 原因之一是之前对项目进行过打包进行如下设置 将Edit Scheme gt Run gt Build Configuration 设置为Release 将其勾选为 Debug状态 xff0c 接下来继续运
  • 支付宝快捷登录相关事宜

    接近年关 xff0c 公司产品提出新需求 xff0c 和支付宝合作 xff0c 需要开发快捷登录 无线账户授权 xff0c 手机端装有支付宝钱包 xff0c 直接唤起支付宝钱包 xff0c 若没有支付宝钱包就直接走HTML5页面操作 xff
  • 将DataGridview中的数据存入数据库

    在机房收费的时候我们都会用到DataGridView控件 xff0c 用来显示从数据库中返回的数据 如何用DataGridView将数据存入到数据库 xff0c 而且是存入到字段与数据库中不一致的表中呢 xff1f 前提介绍 为了将如下的1