在多年的MySQL数据库使用过程中,经常遇到需要复制(或称克隆)表中数据的情况,尤其是当表中存在自增键时。最近,开发了一个VB.NET函数来解决这个问题,并且这个函数非常有效,所以想与大家分享。
这个函数是一个公共的共享布尔值函数,可以在VB.NET代码中调用它。
以下是可以在VB.NET代码中调用的公共共享函数:
Public Shared Function CopyRecord(ByVal tbl As String, ByVal tbl_id_name As String, ByVal tbl_id_value As Long) As Boolean
    Dim dup_query As String = Nothing
    Dim tbl_dat As New DataTable
    Dim next_id As Long = 0
    Dim copy_query As String = Nothing
    Dim col_value As String = Nothing
    Dim did_it As Boolean = False
    dup_query = "select * from " & tbl & " where " & tbl_id_name & " = " & tbl_id_value
    tbl_dat = RetrieveDataToDataGrid(dup_query)
    If Not tbl_dat Is Nothing Then
        ActionRecord("LOCK TABLES " & tbl & " WRITE")
        ActionRecord("insert into " & tbl & " (" & tbl_id_name & ") values(NULL)")
        next_id = Val(get_single_field("select MAX(" & tbl_id_name & ") from " & tbl, 0))
        ActionRecord("UNLOCK TABLES")
        copy_query = "update " & tbl & " set "
        For Each r As DataRow In tbl_dat.Rows
            For Each col As DataColumn In tbl_dat.Columns
                If col.ColumnName <> tbl_id_name Then
                    col_value = r(col).ToString
                    If InStr(col.DataType.ToString, "String") > 0 Or InStr(col.DataType.ToString, "Date") > 0 Then
                        copy_query = copy_query & col.ColumnName & "='" & col_value & "',"
                    Else
                        If IsDBNull(col_value) Or col_value.Length <= 0 Then
                            col_value = 0
                        End If
                        copy_query = copy_query & col.ColumnName & "=" & col_value & ","
                    End If
                End If
            Next
        Next
        copy_query = copy_query.Remove(copy_query.LastIndexOf(","), 1)
        If Right(copy_query, 1) = "=" Then
            copy_query = copy_query & "''"
        End If
        copy_query = copy_query & " where " & tbl_id_name & "=" & next_id
        If ActionRecord(copy_query) > 0 Then
            did_it = True
        End If
    End If
    Return did_it
End Function
    
为了创建这个可以适用于任何表的开放函数,无论字段数量多少,不得不使用足够的变量,并设置检查点以确保代码的清晰和可操作性。
代码的重要部分在于它识别字段类型并创建适当的SQL命令进行复制。