当前位置: 首页 > news >正文

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案2

目的,判断是否主键重复,不重复则登录新数据,重复则不登录。

定义类型:
DataRecord
  tableName 表名
  rowNumber 行号
  columnName 列名
  data 数据

想要实现的代码逻辑如下:
模拟数据库的登录过程。
第1步,现在初始化数据,dataCollection里面一条数据没有。
第2步,现在插入了第1行数据。
第3步,然后插入第2行数据。
第4步,插入后,第2行数据和第1行数据比较。
第5步,如果不重复,则继续插入第3行数据。
第6步,如果重复了则重新生成第2行第1列的数据,并更新数据。
第7步,然后判断新的第2行的数据是否和第1行的数据重复,如果不重复,则继续第5步插入第3行的数据。
第8步,如果重复则继续重新生成第2行第1列的数据,直到不重复为止。
第9步,如果第8步尝试了100次后仍然重复,则继续第6步,生成第2行第2列的数据并更新数据。
第10步,如果第6步到第9步都进行完了,判断第2行的所有列,在重复100次后都是重复的,则停止生成数据,删除第2列的数据。程序终止。
第11步,如果经过第6步到第9步,获得了新的第2行的数据,进行第5步直到插入了所有行的数据。或某一行的任何数据都是重复的,则程序终止。

代码结构如下:
私有DataRecordType类
模块1
在这里插入图片描述

DataRecordType类代码

' DataRecordType 类模块
Private pTableName As String
Private pRowNumber As Long
Private pColumnName As String
Private pData As String

' 定义公共属性以访问私有变量
Public Property Get tableName() As String
    tableName = pTableName
End Property
Public Property Let tableName(value As String)
    pTableName = value
End Property

Public Property Get rowNumber() As Long
    rowNumber = pRowNumber
End Property
Public Property Let rowNumber(value As Long)
    pRowNumber = value
End Property

Public Property Get columnName() As String
    columnName = pColumnName
End Property
Public Property Let columnName(value As String)
    pColumnName = value
End Property

Public Property Get data() As String
    data = pData
End Property
Public Property Let data(value As String)
    pData = value
End Property

模块1代码

'主程序入口
Sub MainTest()
    Dim dataCollection As Collection
    Set dataCollection = New Collection
    Dim dataStr As String
    Dim hasDiffData As Boolean
    Dim record As DataRecordType
    Dim rowNum As Long, columnIndex As Long, tryCount As Long
    Dim rowNumMax As Long, columnIndexMax As Long, tryCountMax As Long
    
    rowNumMax = 30 '最大行
    columnIndexMax = 5 '最大列
    tryCountMax = 100  '最大尝试次数
    
    For rowNum = 1 To rowNumMax
        hasDiffData = False
        
        '先登录一行数据(所有列,主键+非主键)
        For columnIndex = 1 To columnIndexMax
            '插入当前列数据
            dataStr = GetNewData()
            Call AddData(dataCollection, "Table1", CLng(rowNum), CStr(columnIndex), CStr(dataStr))
        Next columnIndex
        
        '遍历一行的数据(只有主键的列)
        For columnIndex = 1 To columnIndexMax
            '是否重复
            Do While tryCount < tryCountMax And IsExistsData(dataCollection, "Table1", CLng(rowNum))
                '取得新数据
                dataStr = GetNewData()
                '更新第2行第1列数据
                Call UpdateData(dataCollection, "Table1", CLng(rowNum), CStr(columnIndex), CStr(dataStr))
                
                '尝试次数+1
                tryCount = tryCount + 1
            Loop
            
            '所有列的数据登录的过程中,有某一列插入更新的时候,不重复了
            If Not IsExistsData(dataCollection, "Table1", CLng(rowNum)) Then
                hasDiffData = True
                Exit For
            End If
        Next columnIndex
        
        If hasDiffData = False Then
            '如果当前行一定是重复数据,则终止
            Call DeleteData(dataCollection, "Table1", CLng(rowNum))
            Exit For
        End If
    Next rowNum
    
    '输出最后的结果
    For rowNum = 1 To 30
        For i = 1 To dataCollection.Count
            Set record = dataCollection(i)
            If record.rowNumber = rowNum Then
                Debug.Print record.tableName & "," & CLng(record.rowNumber) & "," & record.columnName & "," & record.data
            End If
        Next i
    Next rowNum

End Sub

Function GetNewData()
    GetNewData = "AAA" & CInt(10 * Rnd)
End Function

'插入数据
Sub AddData(dataCollection As Collection, tableName As String, rowNumber As Long, columnName As String, data As String)
    Dim record As DataRecordType
    Set record = New DataRecordType  ' 关键:实例化对象
    record.tableName = tableName
    record.rowNumber = rowNumber
    record.columnName = columnName
    record.data = data
    dataCollection.Add record
End Sub

'更新数据
Sub UpdateData(dataCollection As Collection, tableName As String, rowNumber As Long, columnName As String, newData As String)
    Dim record As DataRecordType
    Dim i As Integer
    
    ' 遍历集合中的每个记录
    For i = 1 To dataCollection.Count
        Set record = dataCollection(i)
        
        ' 检查是否匹配 tableName、rowNumber 和 columnName
        If record.tableName = tableName And record.rowNumber = rowNumber And record.columnName = columnName Then
            ' 更新数据
            record.data = newData
            Exit Sub  ' 找到并更新后退出
        End If
    Next i
    
    ' 如果没有找到匹配的记录,可以选择抛出错误或添加新记录
    MsgBox "未找到匹配的记录", vbExclamation
End Sub

'删除数据
Sub DeleteData(dataCollection As Collection, tableName As String, rowNumber As Long)
    Dim record As DataRecordType
    Dim i As Integer
    
    ' 遍历集合中的每个记录
    For i = dataCollection.Count To 1 Step -1
        Set record = dataCollection(i)
        
        ' 检查是否匹配 tableName、rowNumber 和 columnName
        If record.tableName = tableName And record.rowNumber = rowNumber Then
            ' 删除记录
            dataCollection.Remove i
        End If
    Next i
    
    ' 如果没有找到匹配的记录,可以选择抛出错误
    MsgBox "未找到匹配的记录", vbExclamation
End Sub

Function IsExistsData(dataCollection As Collection, ptableName As String, prowNumber As Long) As Boolean
    Dim i As Long, k As Long, j As Long
    Dim record1 As DataRecordType
    Dim record2 As DataRecordType
    Dim maxRowNum As Long
    
    Dim sameTableRowData As String
    Dim otherTableRowData As String
    
    '取得最大行数
    maxRowNum = GetMaxRowNum(dataCollection)
    
    sameTableRowData = ""
    '取得最后一行,所有列的数据拼接后的结果
    For i = 1 To dataCollection.Count
        Set record1 = dataCollection(i)
        If record1.tableName = ptableName And record1.rowNumber = prowNumber Then
            sameTableRowData = sameTableRowData & record1.data
        End If
    Next i
    
    '保证同一行
    For k = 1 To maxRowNum
        '保证各个列的数据连接的时候,按照相同的列的顺序
        For i = 1 To dataCollection.Count
            Set record1 = dataCollection(i)
            '找到当前行,依次与其他行进行比较
            If record1.rowNumber = prowNumber Then
                otherTableRowData = ""
                '其他行的数据
                For j = 1 To dataCollection.Count
                    Set record2 = dataCollection(j)
                    '同一行 不同列,按照顺序拼接
                    If record2.tableName = record1.tableName And record2.rowNumber <> record1.rowNumber And record2.columnName = record1.columnName And record2.rowNumber = k Then
                        otherTableRowData = otherTableRowData & record2.data
                    End If
                Next j
                
                '如果有重复的数据,则返回True
                If otherTableRowData = sameTableRowData Then
                    IsExistsData = True
                    Exit Function
                End If
                
                Exit For
            End If
        Next i
    Next k
    
    '不存在重复的数据
    IsExistsData = False
    
End Function

'取得最大行
Function GetMaxRowNum(dataCollection As Collection)
    Dim maxRowNum As Long
    maxRowNum = 0
    For i = 1 To dataCollection.Count
        If dataCollection(i).rowNumber > maxRowNum Then
             maxRowNum = dataCollection(i).rowNumber
        End If
    Next i
    GetMaxRowNum = maxRowNum
End Function

输入内容如下:

运行MainTest()

运行结果如下:

Table1,1,1,AAA4
Table1,1,2,AAA3
Table1,1,3,AAA9
Table1,1,4,AAA8
Table1,1,5,AAA3
Table1,2,1,AAA7
Table1,2,2,AAA3
Table1,2,3,AAA1
Table1,2,4,AAA0
Table1,2,5,AAA3
Table1,3,1,AAA8
Table1,3,2,AAA3
Table1,3,3,AAA2
Table1,3,4,AAA5
Table1,3,5,AAA3
Table1,4,1,AAA3
Table1,4,2,AAA0
Table1,4,3,AAA5
Table1,4,4,AAA2
Table1,4,5,AAA9
Table1,5,1,AAA6
Table1,5,2,AAA8
Table1,5,3,AAA9
Table1,5,4,AAA3
Table1,5,5,AAA5
Table1,6,1,AAA1
Table1,6,2,AAA6
Table1,6,3,AAA4
Table1,6,4,AAA10
Table1,6,5,AAA1
Table1,7,1,AAA9
Table1,7,2,AAA6
Table1,7,3,AAA3
Table1,7,4,AAA1
Table1,7,5,AAA5
Table1,8,1,AAA2
Table1,8,2,AAA10
Table1,8,3,AAA1
Table1,8,4,AAA0
Table1,8,5,AAA3
Table1,9,1,AAA5
Table1,9,2,AAA9
Table1,9,3,AAA5
Table1,9,4,AAA4
Table1,9,5,AAA8
Table1,10,1,AAA8
Table1,10,2,AAA7
Table1,10,3,AAA7
Table1,10,4,AAA10
Table1,10,5,AAA3
Table1,11,1,AAA5
Table1,11,2,AAA4
Table1,11,3,AAA7
Table1,11,4,AAA2
Table1,11,5,AAA4
Table1,12,1,AAA5
Table1,12,2,AAA8
Table1,12,3,AAA5
Table1,12,4,AAA4
Table1,12,5,AAA5
Table1,13,1,AAA2
Table1,13,2,AAA6
Table1,13,3,AAA5
Table1,13,4,AAA7
Table1,13,5,AAA9
Table1,14,1,AAA4
Table1,14,2,AAA3
Table1,14,3,AAA3
Table1,14,4,AAA2
Table1,14,5,AAA5
Table1,15,1,AAA2
Table1,15,2,AAA6
Table1,15,3,AAA4
Table1,15,4,AAA9
Table1,15,5,AAA5
Table1,16,1,AAA2
Table1,16,2,AAA7
Table1,16,3,AAA7
Table1,16,4,AAA6
Table1,16,5,AAA8
Table1,17,1,AAA2
Table1,17,2,AAA8
Table1,17,3,AAA2
Table1,17,4,AAA10
Table1,17,5,AAA1
Table1,18,1,AAA1
Table1,18,2,AAA8
Table1,18,3,AAA4
Table1,18,4,AAA5
Table1,18,5,AAA1
Table1,19,1,AAA1
Table1,19,2,AAA2
Table1,19,3,AAA0
Table1,19,4,AAA7
Table1,19,5,AAA5
Table1,20,1,AAA6
Table1,20,2,AAA2
Table1,20,3,AAA5
Table1,20,4,AAA7
Table1,20,5,AAA8
Table1,21,1,AAA4
Table1,21,2,AAA9
Table1,21,3,AAA7
Table1,21,4,AAA1
Table1,21,5,AAA6
Table1,22,1,AAA7
Table1,22,2,AAA0
Table1,22,3,AAA4
Table1,22,4,AAA4
Table1,22,5,AAA3
Table1,23,1,AAA10
Table1,23,2,AAA8
Table1,23,3,AAA7
Table1,23,4,AAA4
Table1,23,5,AAA7
Table1,24,1,AAA3
Table1,24,2,AAA4
Table1,24,3,AAA4
Table1,24,4,AAA9
Table1,24,5,AAA1
Table1,25,1,AAA6
Table1,25,2,AAA3
Table1,25,3,AAA1
Table1,25,4,AAA2
Table1,25,5,AAA1
Table1,26,1,AAA4
Table1,26,2,AAA10
Table1,26,3,AAA5
Table1,26,4,AAA5
Table1,26,5,AAA10
Table1,27,1,AAA2
Table1,27,2,AAA4
Table1,27,3,AAA4
Table1,27,4,AAA3
Table1,27,5,AAA5
Table1,28,1,AAA1
Table1,28,2,AAA5
Table1,28,3,AAA10
Table1,28,4,AAA6
Table1,28,5,AAA9
Table1,29,1,AAA7
Table1,29,2,AAA4
Table1,29,3,AAA7
Table1,29,4,AAA1
Table1,29,5,AAA8
Table1,30,1,AAA7
Table1,30,2,AAA5
Table1,30,3,AAA2
Table1,30,4,AAA2
Table1,30,5,AAA3

相关文章:

  • 双写一致的门道
  • 主流大语言模型中Token的生成过程本质是串行的
  • Java基础系列:深入解析反射机制与代理模式及避坑指南
  • 江科大51单片机笔记【11】AT24C02数据存储秒表
  • 文心一言:中国大模型时代的破局者与探路者
  • pytorch 50 大模型导出的onnx模型优化尝试
  • linux环保监测4G边缘网关:环境数据的可靠传输者
  • 在基于Arm架构的华为鲲鹏服务器上,针对openEuler 20.03 LTS操作系统, 安装Ansible 和MySQL
  • 洛谷每日1题-------Day15__P1307 [NOIP 2011 普及组] 数字反转
  • EasyCVR平台赋能农业产业园:AIoT驱动的视频监控与大数据分析解决方案
  • 订单支付系统如何做到一致性
  • 自动控制原理【知识点总结、复习笔记】-2
  • OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示
  • 【Recon】CTF Web类题目主要类型
  • 【GPT入门】第1课准备环境
  • c语言笔记 数组指针
  • 英语开口说(先开口,再完善)——主动牺牲学习成本高昂的语法规则收益,来最大程度满足即刻对话交流需求
  • 高效数据分析实战指南:Python零基础入门
  • Unity开发时,visual studio编辑器中文注释的解决办法
  • 13.C语言指针的易错点
  • 上海徐汇 “家 + 书屋”,创新服务广大家庭
  • 人民日报大家谈:为基层减负,治在根子上减到点子上
  • 人民日报头版:紧盯“学查改”,推动作风建设走深走实
  • 泽连斯基与美国副总统及国务卿会谈,讨论伊斯坦布尔谈判等问题
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突
  • 浙江美术馆馆长人民日报撰文:打开更辽阔的审美场域