Attribute VB_Name = "Access_to_Mysql_1_0_8" Option Compare Database Private Const STRUCT_ONLY As Integer = 1 Private Const DATA_ONLY As Integer = 2 Private Const STRUCT_AND_DATA As Integer = 3 ' Access to Mysql v.1.0.8 ' This module need MS DAO 3.6 or later Public Sub main() Dim exportKind As String Dim outputPath As String Dim progressBar Dim labelCount Dim charSet As String Dim isNeedSqlNotes As Boolean Dim engine As String exportKind = STRUCT_AND_DATA outputPath = "C:\" progressBar = Null labelCount = Null isNeedSqlNotes = True charSet = "utf8" 'utf8 o latin1 engine = "InnoDB" 'InnoDB o MyISAM startDumpDb exportKind, outputPath, progressBar, labelCount, isNeedSqlNotes, charSet, engine End Sub Private Function tableCount(db As Database) As Integer Dim retVal As Integer retVal = 0 For Each tbl In db.TableDefs If Not (InStr(tbl.Name, "MSys") > 0) And _ Not (InStr(tbl.Name, "~TMP") > 0) Then retVal = retVal + 1 End If Next tbl tableCount = retVal End Function Private Function recordCount(db As Database) As Double Dim retVal As Double Dim rs As Recordset retVal = 0 For Each tbl In db.TableDefs If Not (InStr(tbl.Name, "MSys") > 0) And _ Not (InStr(tbl.Name, "~TMP") > 0) Then Set rs = db.OpenRecordset("select count(*) as cCount from " & tbl.Name) If Not IsNull(rs!cCount) Then retVal = retVal + rs!cCount End If rs.Close End If Next tbl Set rs = Nothing recordCount = retVal End Function 'Thanks briankejser (http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_20273639.html) Private Sub CreateFile(ByVal pstrFile As String, ByVal pstrData As String, charSet As String) If (charSet = "latin1") Then charSet = "iso-8859-1" If (charSet = "utf8") Then charSet = "utf-8" If Not (charSet = "utf-8" Or charSet = "iso-8859-1") Then charSet = "iso-8859-1" Dim adTypeBinary As Integer, adTypeText As Integer Dim adSaveCreateNotExist As Integer, adSaveCreateOverWrite As Integer adTypeBinary = 1 adTypeText = 2 adSaveCreateNotExist = 1 adSaveCreateOverWrite = 2 'Create streams Dim objStream As Object Set objStream = CreateObject("ADODB.Stream") Dim stmNoBOM As Object Set stmNoBOM = CreateObject("ADODB.Stream") objStream.Open objStream.Type = adTypeText objStream.Position = 0 objStream.charSet = charSet objStream.WriteText pstrData If (charSet = "utf-8") Then 'Stream utf-8 objStream.SaveToFile pstrFile & "tmp.sql", adSaveCreateOverWrite objStream.Position = 0 'Enable Type change. objStream.Type = adTypeBinary objStream.Position = 3 'UTF-8 BOM is in positions 0 through 2. 'UTF8 NO BOM stmNoBOM.Open stmNoBOM.Type = adTypeBinary objStream.CopyTo stmNoBOM stmNoBOM.SaveToFile pstrFile, adSaveCreateOverWrite objStream.Close stmNoBOM.Close 'Clear tmp Set fs = CreateObject("Scripting.FileSystemObject") fs.DeleteFile pstrFile & "tmp.sql" Set fs = Nothing Else 'ISO stream objStream.SaveToFile pstrFile, adSaveCreateOverWrite End If End Sub Public Sub DumpDb(exportKind As String, outputPath As String, progressBar, labelCount, isNeedSqlNotes As Boolean, charSet As String, engine As String) Const ForReading = 1, ForWriting = 2, ForAppending = 3 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Dim db As Database Set db = CurrentDb() Dim dbName As String dbName = Right(db.Name, Len(db.Name) - InStrRev(db.Name, "\")) dbName = Left(dbName, InStr(dbName, ".") - 1) If (exportKind = STRUCT_ONLY Or exportKind = STRUCT_AND_DATA) Then 'dump struct CreateFile outputPath & dbName & "_Struct.sql", getStrStructDb(db, progressBar, labelCount, isNeedSqlNotes, charSet, engine), "latin1" End If If (exportKind = DATA_ONLY Or exportKind = STRUCT_AND_DATA) Then 'dump data CreateFile outputPath & dbName & "_Data.sql", getStrDataDb(db, progressBar, labelCount, isNeedSqlNotes, charSet), charSet End If db.Close Set db = Nothing End Sub Public Sub startDumpDb(exportKind As String, outputPath As String, progressBar, labelCount, isNeedSqlNotes As Boolean, charSet As String, engine As String) If Not (Right(outputPath, 1) = "\") Then outputPath = outputPath & "\" DumpDb exportKind, outputPath, progressBar, labelCount, isNeedSqlNotes, charSet, engine MsgBox "Export fished!" End Sub Private Function getStrStructDb(db As Database, progressBar, labelCount, isNeedSqlNotes As Boolean, charSet As String, engine As String) As String Dim dbName As String dbName = Right(db.Name, Len(db.Name) - InStrRev(db.Name, "\")) dbName = Left(dbName, InStr(dbName, ".") - 1) countRec = tableCount(db) If (Not IsNull(labelCount)) Then labelCount.Caption = countRec If (Not IsNull(progressBar)) Then progressBar.Min = 0 If (countRec > 0) Then progressBar.Max = countRec End If DoEvents Dim retVal As String retVal = "" If (isNeedSqlNotes) Then retVal = retVal & "#-- Weboriented MS Access dump 1.00.03" & Chr(10) retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- Current Database: " & dbName & Chr(10) retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- If not exists" & Chr(10) retVal = retVal & "#-- DROP DATABASE " & dbName & ";" & Chr(10) retVal = retVal & "#-- CREATE DATABASE " & dbName & ";" & Chr(10) Else retVal = retVal & "DROP DATABASE " & dbName & ";" & Chr(10) retVal = retVal & "CREATE DATABASE " & dbName & ";" & Chr(10) End If retVal = retVal & "USE " & dbName & ";" & Chr(10) retVal = retVal & "set foreign_key_checks=0;" & Chr(10) Dim notNull As Boolean Dim tbl As TableDef Dim col As Field Dim fieldKind As String Dim dimField As String Dim ind As Index Dim firstTime As Boolean If (Not IsNull(progressBar)) Then progressBar.Value = progressBar.Min For Each tbl In db.TableDefs If Not (InStr(tbl.Name, "MSys") > 0) And _ Not (InStr(tbl.Name, "~TMP") > 0) Then If (Not IsNull(progressBar)) Then progressBar.Value = progressBar.Value + 1 If (Not IsNull(labelCount)) Then labelCount.Caption = labelCount.Caption - 1 DoEvents 'Dump Struttura ' cod int(11) NOT NULL auto_increment, ' num int(11) NOT NULL default '0', ' tes varchar(50) NOT NULL default '', ' data date NOT NULL default '0000-00-00', ' valuta double NOT NULL default '0', ' bool tinyint(1) NOT NULL default '0', If (isNeedSqlNotes) Then retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- Table structure for table '" & tbl.Name & "'" & Chr(10) retVal = retVal & "#--" & Chr(10) End If retVal = retVal & "DROP TABLE IF EXISTS " & tbl.Name & ";" & Chr(10) retVal = retVal & "CREATE TABLE " & tbl.Name & " (" & Chr(10) firstTime = True For Each col In tbl.Fields If Not firstTime Then retVal = retVal & "," & Chr(10) firstTime = False retVal = retVal & " " & col.Name & " " autoinc = False Select Case col.Type Case 1 'Booleano fieldKind = "TINYINT" dimField = col.Size Case 2 'Byte fieldKind = "BINARY" dimField = col.Size Case 3 'Short fieldKind = "INT" dimField = 4 autoinc = col.Attributes >= dbAutoIncrField Case 4 'Integer fieldKind = "INT" dimField = 11 autoinc = col.Attributes >= dbAutoIncrField Case 5 'Value fieldKind = "NUMERIC" dimField = col.Size Case 6 'Single fieldKind = "INTEGER" dimField = col.Size autoinc = col.Attributes >= dbAutoIncrField Case 7 'Long integer fieldKind = "DOUBLE" dimField = col.Size autoinc = col.Attributes >= dbAutoIncrField Case 8 'Date fieldKind = "DATETIME" dimField = col.Size Case 9 'Binary fieldKind = "BINARY" dimField = col.Size Case 10 'Text fieldKind = "varchar" dimField = col.Size Case 11 'OLE Object fieldKind = "BLOB" Case 12 'Inf text fieldKind = "TEXT" Case 15 'GUID fieldKind = "BLOB" Case 16 'Big Integer fieldKind = "BIGINT" dimField = col.Size Case 17 'VarBinary fieldKind = "VARBINARY" dimField = col.Size Case 18 'Char fieldKind = "CHAR" dimField = col.Size Case 19 'Numeric fieldKind = "NUMERIC" dimField = col.Size Case 20 'Decimal fieldKind = "DECIMAL" dimField = col.Size Case 21 'Float fieldKind = "FLOAT" dimField = col.Size Case 22 'Time fieldKind = "TIME" Case 23 'Time Stamp fieldKind = "TIMESTAMP" Case Else 'Unknow fieldKind = "" dimField = col.Size End Select If Len(fieldKind) = 0 Then MsgBox "One field kind is unknow: run debug (CTRL+Break key)." fieldKind = "" End If If (fieldKind = "datetime") Or _ (fieldKind = "text") Or _ (fieldKind = "double") Then retVal = retVal & fieldKind Else retVal = retVal & fieldKind & "(" & dimField & ")" End If If col.Type = 3 Or col.Type = 4 Then retVal = retVal & " unsigned" End If notNull = False If col.Required Or ((col.Type = 10) And Not col.AllowZeroLength) Then notNull = True retVal = retVal & " NOT NULL" Else For Each ind In tbl.Indexes If ind.Primary Then If (InStr(ind.Fields, col.Name) > 0) Then notNull = True retVal = retVal & " NOT NULL" End If End If Next End If If (autoinc) Then retVal = retVal & " auto_increment" else If Len(Trim(col.DefaultValue)) > 0 Then retVal = retVal & " default '" & col.DefaultValue & "'" Else If Not col.Required And _ Not ((col.Type = 10) And Not col.AllowZeroLength) And _ Not notNull Then retVal = retVal & " default NULL" Else Select Case col.Type Case 1, 2, 3, 4, 5, 6, 7, 9, 16, 19, 20, 21, 23 'Booleano, Intero lungo, Valuta, long retVal = retVal & " default 0" Case 8 'data retVal = retVal & " default '0000-00-00'" Case 10, 12, 18 'text retVal = retVal & " default ''" Case Else retVal = retVal & " default NULL" End Select End If End If End If Next Dim justOne As Boolean justOne = False For Each ind In tbl.Indexes If ind.Primary Then If Not (justOne) Then retVal = retVal & "," & Chr(10) & " PRIMARY KEY(" justOne = True idFieldName = Replace(Replace(ind.Fields, "+", ""), ";", ",") retVal = retVal & idFieldName End If Next If justOne Then retVal = retVal & ")" & Chr(10) Else retVal = retVal & Chr(10) End If retVal = retVal & ")" If (Len(Trim(engine)) > 0) Then retVal = retVal & " ENGINE=" & engine If (Len(Trim(charSet)) > 0) Then retVal = retVal & " DEFAULT CHARSET=" & charSet retVal = retVal & ";" & Chr(10) 'End dump struct End If Next retVal = retVal & getForeignKeys() retVal = retVal & "set foreign_key_checks=1;" & Chr(10) getStrStructDb = retVal End Function Private Function getStrDataDb(db As Database, progressBar, labelCount, isNeedSqlNotes As Boolean, charSet As String) As String Dim dbName As String dbName = Right(db.Name, Len(db.Name) - InStrRev(db.Name, "\")) dbName = Left(dbName, InStr(dbName, ".") - 1) countRec = recordCount(db) If (Not IsNull(labelCount)) Then labelCount.Caption = countRec If (Not IsNull(progressBar)) Then progressBar.Min = 0 If (countRec > 0) Then progressBar.Max = countRec End If DoEvents Dim retVal As String retVal = "" If (isNeedSqlNotes) Then retVal = retVal & "#-- Octopus MS Access dump 0.01.00" & Chr(10) retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- Current Database: " & dbName & Chr(10) retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- If not exists" & Chr(10) End If retVal = retVal & "USE " & dbName & ";" & Chr(10) retVal = retVal & "set foreign_key_checks=0;" & Chr(10) Dim tbl As TableDef Dim col As Field Dim fieldKind As String Dim rs As Recordset Dim dimField As String Dim cValue As String Dim ind As Index If (Not IsNull(progressBar)) Then progressBar.Value = progressBar.Min For Each tbl In db.TableDefs If Not (InStr(tbl.Name, "MSys") > 0) And _ Not (InStr(tbl.Name, "~TMP") > 0) Then 'Dump Dati Set rs = db.OpenRecordset(tbl.Name) If (isNeedSqlNotes) Then retVal = retVal & "#--" & Chr(10) retVal = retVal & "#-- Dumping data for table '" & tbl.Name & "'" & Chr(10) retVal = retVal & "#--" & Chr(10) End If retVal = retVal & "DELETE FROM " & tbl.Name & ";" & Chr(10) 'INSERT INTO (,,...) VALUES (,,...); While Not rs.EOF If (Not IsNull(progressBar)) Then progressBar.Value = progressBar.Value + 1 If (Not IsNull(labelCount)) Then labelCount.Caption = labelCount.Caption - 1 DoEvents retVal = retVal & "INSERT INTO " & tbl.Name & " (" firstTime = True For Each col In rs.Fields If Not firstTime Then retVal = retVal & ", " firstTime = False retVal = retVal & col.Name Next retVal = retVal & ") VALUES (" For Each col In rs.Fields If IsNull(col.Value) Then If col.Type = 10 Then cValue = "''" Else cValue = "NULL" End If Else cValue = "" If col.Type = 10 Or _ col.Type = 12 Or _ col.Type = 18 Or _ col.Type = 8 Then cValue = cValue & "'" End If Select Case col.Type Case 1 'Booleano If col.Value Then cValue = cValue & "1" Else cValue = cValue & "0" End If Case 8 'data cValue = cValue & CStr(Format(col.Value, "yyyy-mm-dd hh:mm:ss")) Case Else cValue = cValue & Replace(CStr(Replace(CStr(col.Value), "\", "/", , -1)), "'", "`", , -1) 'MsgBox cValue If Not col.Type = 10 Then cValue = Replace(cValue, ",", ".") End If End Select If col.Type = 10 Or _ col.Type = 12 Or _ col.Type = 18 Or _ col.Type = 8 Then cValue = cValue & "'" End If End If retVal = retVal & cValue & "," Next retVal = Left(retVal, Len(retVal) - 1) retVal = retVal & ");" & Chr(10) rs.MoveNext Wend rs.Close Set rs = Nothing 'End dump data End If Next retVal = retVal & "set foreign_key_checks=1;" & Chr(10) 'If (charSet = "utf8") Then retVal = StrConv(retVal, vbUnicode) getStrDataDb = retVal End Function 'Rel Access rules (grbit) '0 : Rel (1 to n) '1 : Rel (1 to 1) '2 : No Rel (1 to n) '3 : No Rel (1 to 1) '256 : Rel update cascade (1 to n) '257 : Rel update cascade (1 to 1) '4352 : Rel update-delete cascade (1 to n) '4353 : Rel update-delete cascade (1 to 1) Private Function getForeignKeys() As String Dim retVal As String Dim db As Database Dim rs As Recordset Dim tableFather As String retVal = retVal & "# ALTER TABLE" & Chr(10) retVal = retVal & "#" & Chr(10) Set db = CurrentDb() Set rs = db.OpenRecordset("SELECT * FROM MSysRelationships ORDER BY MSysRelationships.grbit, MSysRelationships.szObject, MSysRelationships.szColumn, MSysRelationships.icolumn;") Dim oldIdColumn As String Dim incrIndex As Integer Dim grbit As Integer incrIndex = 0 While Not rs.EOF idColumn = rs!icolumn If (idColumn = 0) And (Len(strColFather) > 0) Then strColSon = Right(strColSon, Len(strColSon) - 1) strColFather = Right(strColFather, Len(strColFather) - 1) retVal = retVal & "ALTER TABLE " & tableFather & " ENGINE = InnoDB;" & Chr(10) retVal = retVal & "ALTER TABLE " & tableFather & " ADD INDEX `KEY_" & tableFather & "_FK_" & incrIndex & "` USING BTREE (" & strColFather & ");" & Chr(10) retVal = retVal & "ALTER TABLE " & tableSon & " ADD INDEX `KEY_" & tableSon & "_FK_" & incrIndex & "` USING BTREE (" & strColSon & ");" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " INDEX (" & strColFather & ");" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableSon & " INDEX (" & strColSon & ");" & Chr(10) retVal = retVal & "ALTER TABLE " & tableFather & " ADD CONSTRAINT `FK_" & tableFather & "_" & tableSon & "` FOREIGN KEY (" & strColFather & ") REFERENCES `" & tableSon & "` (" & strColSon & ") " & getUpdateCascade(grbit) & " " & getDeleteCascade(grbit) & ";" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP INDEX `KEY_" & tableFather & "_FK_" & incrIndex & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableSon & " DROP INDEX `KEY_" & tableSon & "_FK_" & incrIndex & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP FOREIGN KEY `FK_" & tableFather & "_" & tableSon & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP FOREIGN KEY `FK_" & tableFather & "_" & tableSon & "`;" & Chr(10) strColSon = "" strColFather = "" 'INDEX KEY_tbl_name USING BTREE ON tbl_name (index_col_name) incrIndex = incrIndex + 1 End If tableFather = rs!szObject colFather = rs!szColumn tableSon = rs!szReferencedObject colSon = rs!szReferencedColumn grbit = rs!grbit strColSon = strColSon & ",`" & colSon & "`" strColFather = strColFather & ",`" & colFather & "`" rs.MoveNext Wend If (idColumn = 0) And (Len(strColFather) > 0) Then strColSon = Right(strColSon, Len(strColSon) - 1) strColFather = Right(strColFather, Len(strColFather) - 1) retVal = retVal & "ALTER TABLE " & tableFather & " ENGINE = InnoDB;" & Chr(10) retVal = retVal & "ALTER TABLE " & tableFather & " ADD INDEX `KEY_" & tableFather & "_FK_" & incrIndex & "` USING BTREE (" & strColFather & ");" & Chr(10) retVal = retVal & "ALTER TABLE " & tableSon & " ADD INDEX `KEY_" & tableSon & "_FK_" & incrIndex & "` USING BTREE (" & strColSon & ");" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " INDEX (" & strColFather & ");" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableSon & " INDEX (" & strColSon & ");" & Chr(10) retVal = retVal & "ALTER TABLE " & tableFather & " ADD CONSTRAINT `FK_" & tableFather & "_" & tableSon & "` FOREIGN KEY (" & strColFather & ") REFERENCES `" & tableSon & "` (" & strColSon & ") " & getUpdateCascade(grbit) & " " & getDeleteCascade(grbit) & ";" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP INDEX `KEY_" & tableFather & "_FK_" & incrIndex & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableSon & " DROP INDEX `KEY_" & tableSon & "_FK_" & incrIndex & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP FOREIGN KEY `FK_" & tableFather & "_" & tableSon & "`;" & Chr(10) 'retVal = retVal & "ALTER TABLE " & tableFather & " DROP FOREIGN KEY `FK_" & tableFather & "_" & tableSon & "`;" & Chr(10) strColSon = "" strColFather = "" End If rs.Close Set rs = Nothing db.Close Set db = Nothing retVal = retVal & "#" & Chr(10) retVal = retVal & "# END ALTER TABLE" & Chr(10) getForeignKeys = retVal End Function 'Rel Access rules (grbit) '0 : Rel (1 to n) '1 : Rel (1 to 1) '2 : No Rel (1 to n) '3 : No Rel (1 to 1) '256 : Rel update cascade (1 to n) '257 : Rel update cascade (1 to 1) '4352 : Rel update-delete cascade (1 to n) '4353 : Rel update-delete cascade (1 to 1) Private Function getUpdateCascade(grbit As Integer) As String Dim retVal As String retVal = "" Select Case grbit Case 0: Case 1: Case 2: Case 3: Case 256: retVal = "ON UPDATE CASCADE" Case 257: retVal = "ON UPDATE CASCADE" Case 4352: retVal = "ON UPDATE CASCADE" Case 4353: retVal = "ON UPDATE CASCADE" Case Else: End Select getUpdateCascade = retVal End Function 'Rel Access rules (grbit) '0 : Rel (1 to n) '1 : Rel (1 to 1) '2 : No Rel (1 to n) '3 : No Rel (1 to 1) '256 : Rel update cascade (1 to n) '257 : Rel update cascade (1 to 1) '4352 : Rel update-delete cascade (1 to n) '4353 : Rel update-delete cascade (1 to 1) Private Function getDeleteCascade(grbit As Integer) As String Dim retVal As String retVal = "" Select Case grbit Case 0: Case 1: Case 2: Case 3: Case 256: retVal = "ON DELETE CASCADE" Case 257: retVal = "ON DELETE CASCADE" Case 4352: retVal = "ON DELETE CASCADE" Case 4353: retVal = "ON DELETE CASCADE" Case Else: End Select getDeleteCascade = retVal End Function