VBA来实现已存在的数据库,取得所有表的结构

问题描述

用VBA来取出MySQL数据库中的所有表的结构后生成一个Excel的文档

首先创建MySQL的数据源,如何创建数据源在前章已经写过,之后把下面的信息填写上即可

说明

DSN是你所创建的数据源的名称

SERVER是你本地的数据库

DB是你的数据库的名称

UID是登入数据库的用户名

PWD是登入数据库的密码

SCHEMA是你所创建的数据库的SCHEMA

之后在MysqlDbTable按钮下写入下面的代码即可

‘----------------mysqlからテーブル一覧出力---------------------------
Private Sub getMysqlDbTeble_Click()

    Dim fiStr As String
    Dim dsnStr As String
    Dim serverStr As String
    Dim dbStr As String
    Dim uidStr As String
    Dim pwdStr As String
    Dim schemaStr As String

    Dim sheet As Worksheet
    Set sheet = ThisWorkbook.Sheets("Sheet1")
    dsnStr = sheet.Range("C2")
    serverStr = sheet.Range("C3")
    dbStr = sheet.Range("C4")
    uidStr = sheet.Range("C5")
    pwdStr = sheet.Range("C6")
    schemaStr = sheet.Range("C7")

    fiStr = ThisWorkbook.Path & "\QR_DBテーブル一覧.xlsx"
    Dim wb As Workbook
    Set wb = Workbooks.Open(fiStr)

    Dim sht As Object
    Set sht = wb.Sheets("テーブル一覧")
    sht.Range("A3:D" & sht.UsedRange.Rows.Count) = ""

    ‘MySql接続
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    ‘テーブル情報取得
    conn.ConnectionString = "DSN=" & dsnStr & ";Server=" & serverStr & ";DB=" & dbStr & ";UID=" & uidStr & ";PWD=" & pwdStr & ";OPTION=3;"

    sqlStr = "select TABLE_NAME, TABLE_COMMENT from information_schema.tables where table_schema=‘" & schemaStr & "‘"
    conn.Open connStr

    Set rs = conn.Execute(sqlStr)

    Dim index As Integer
    index = 3
    While Not rs.EOF
         sht.Range("A" & index) = index - 2
         sht.Range("B" & index) = rs!TABLE_NAME
         sht.Range("C" & index) = rs!TABLE_COMMENT

        ‘テーブル定義情報
        Dim shtName As String
        shtName = tebleInfo(conn, wb, rs!TABLE_NAME, rs!TABLE_COMMENT, index)

        sht.Hyperlinks.Add Anchor:=sht.Range("B" & index), Address:="", SubAddress:="‘" & shtName & "‘" & "!C2"
        rs.MoveNext
        index = index + 1
    Wend

    rs.Close: Set rs = Nothing
    conn.Close: Set conn = Nothing
    wb.Close savechanges:=False

    MsgBox "完了"
End Sub

‘----------------mysqlからテーブル定義出力---------------------------
Function tebleInfo(connTable As ADODB.Connection, wbTable As Workbook, tableNm As String, tableComment As String, idx As Integer)

    Dim rsTable As ADODB.Recordset
    Set rsTable = New ADODB.Recordset

    ‘検索テーブル定義情報
    sqlStr = "select COLUMN_NAME, COLUMN_COMMENT, COLUMN_KEY, COLUMN_TYPE, COLUMN_DEFAULT ,IS_NULLABLE  from information_schema.columns where TABLE_SCHEMA=‘zhd_sale_demo‘ and TABLE_NAME = ‘" & tableNm & "‘"
    Set rsTable = connTable.Execute(sqlStr)

    Worksheets("テンプレート").Copy before:=Worksheets("テンプレート")

    ‘シート名の長さが31文字以内
    Dim sheetNm As String
    If Len(tableNm) > 31 Then
        sheetNm = Right(tableNm, 31)
    Else
        sheetNm = tableNm
    End If

    ‘シート名存在チェック
    Dim flag As Boolean
    flag = SheetIsExist(wbTable, sheetNm)
    If flag Then
        Application.DisplayAlerts = False
        ‘シート名存在したら、削除
        wbTable.Sheets(sheetNm).Delete
        Application.DisplayAlerts = True

    End If

    ActiveSheet.Name = sheetNm
    Dim shtTable As Object
    Set shtTable = ActiveSheet
    shtTable.Range("C2") = tableNm
    shtTable.Range("E2") = tableComment

    ‘取得した
    Dim indexTable As Integer
    indexTable = 7
    While Not rsTable.EOF
        ‘No
        shtTable.Range("A" & indexTable) = indexTable - 6
        ‘項目物理名(EN)
        shtTable.Range("B" & indexTable) = rsTable!COLUMN_NAME
        ‘項目論理名(CH)
        shtTable.Range("C" & indexTable) = rsTable!COLUMN_COMMENT
        ‘KEY
        shtTable.Range("D" & indexTable) = rsTable!COLUMN_KEY
        ‘属性
        shtTable.Range("E" & indexTable) = rsTable!COLUMN_TYPE
        ‘黙認
        shtTable.Range("F" & indexTable) = rsTable!COLUMN_DEFAULT
        ‘NULL
        shtTable.Range("G" & indexTable) = rsTable!IS_NULLABLE
        rsTable.MoveNext
        indexTable = indexTable + 1
    Wend
    tebleInfo = sheetNm
End Function

Function SheetIsExist(wbCheck As Workbook, shtNm As String)

    SheetIsExist = False
    On Error GoTo lab1
    Set shtSheet = wbCheck.Sheets(shtNm)
    If shtSheet Is Nothing Then
        SheetIsExist = False
    Else
        SheetIsExist = True
    End If

    Set shtSheet = Nothing
    Exit Function

lab1:
    SheetIsExist = False
End Function

最总实现的效果:

原文地址:https://www.cnblogs.com/killclock048/p/9429778.html

时间: 2024-08-29 11:07:51

VBA来实现已存在的数据库,取得所有表的结构的相关文章

SQL语句查询出数据库中所有表的结构

</pre><pre name="code" class="sql">SELECT TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END, TableDesc=ISNULL(CASE WHEN C.column_id=1 THEN PTB.[value] END,N''), Column_id=C.column_id, ColumnName=C.name, PrimaryKey=

EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表

怎样从一个已存在的数据库中映射表到 entity 实体? Entity Framework 提供了一个简便方法,可以为已存在的数据库里的所有表和视图创建实体类(entity class),并且可以用 DataAnnotation 特性和 Fluent API 来配置. 首先,右键你的 Visual Studio 项目 -> 添加 -> 新建项目: 选择 ADO.NET实体数据模型(ADO.NET Entity Data Model ),并指定模型名称(这个名称将会是 contenxt 类的类名

《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型 (转)

不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创建模型 问题 有一个存在的数据库,它拥有表.也许还有视图.外键.你想通过它来创建一个模型. 解决方案 让我们设想,你拥有一个描述诗人(Poet)以及他们的诗(Poem),还有他们之间关系的数据库.如图2-7所示. 图2-7 一个关于诗人及他们的诗的简单数据库 从上图可以看出,一个诗人可能是一首或多首

复制已存在的数据库结构(不包括库中的数据)

我这里的需求是做若干个结构完全一样的数据库,这些数据库是并列的关系(当然这些库中的数据不一样) 使用的VS2013,SQL Server2010 1.选中要复制的数据库,右击,任务,生成脚本(E) 2.弹出“生成和发布脚本”的页面,下一步,若复制整个数据库,则选中“编写这个那个数据库及所有数据库对象的脚本(E)";若只是复制已有数据库中部分表.视图,则选中“选择特定数据库对象(O)”.这里我选中”编写整个数据库及所有数据库对象的脚本(E)“.下一步. 3.文件名(I)路径,就是把生成的SQL语句

Java代码实现向Oracle数据库中导入已备份的数据库文件

今天将很早就实现的一个Oracle数据库备份功能粘贴出来,这个功能是在大学做阶段设计时写的: import java.io.IOException; /** * Java代码实现向Oracle数据库中导入已备份的数据库文件 * * @author:Gaohuanjie */ public class OracleImportDatabase { /** * 向Oracle数据库中导入已备份的数据库文件 * * @author:Gaohuanjie * @param userName 进入数据库所

物理磁盘空间使用已满导致数据库hang起

情况描述 一天公司小张过来咨询,说是数据库查询报错了:乍一看好像是数据库有坏快了,为了排查更加详细的错误信息,决定查看一下告警日志,发现问题所在,原来是数据库的物理磁盘空间满了 Writing to the above trace file is disabled for now on... Tue Jul 29 17:30:32 2014 Non critical error ORA-48181 caught while writing to trace file "/u01/app/orac

计算数据库中各个表的数据量和每行记录所占用空间--添加架构信息-读后感及知识整理

参考文章: SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 监控SQLServer 数据库表每天的空间变化情况 仔细拜读上面三位的文章,不会的知识点又参考了MSDN,巩固了知识点如下: 知识点: 1.表的架构信息,涉及的系统对象 sys.schemas 和 INFORMATION_SCHEMA.TABLES,但后者不是官方推荐方式,

MySQL数据库存储过程动态表建立(PREPARE)

PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 这是我项目当中用到的,用作参考使用: DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`r

[SQL]复制数据库某一个表到另一个数据库中

SQL:复制数据库某一个表到另一个数据库中 SELECT * INTO 表1 FROM 表2 --复制表2如果只复制结构而不复制内容或只复制某一列只要加WHERE条件就好了 例子:SELECT * INTO [IMCDB].[dbo].[SysLog] FROM [AimManageDB].[dbo].[SysLog] (将数据库AimManageDB中的SysLog表复制到数据库IMCDB中) 跨服务器复制表 select * INTO [SMSDB].[dbo].[SysLog] FROM