在多年的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命令进行复制。