access生成sql脚本,通过VBA调用ADOX
access生成sql脚本,通过VBA调用ADOX。
使用 MS Access 2016 的VBA,读取mdb文件中的所有表结构(数据类型/长度/精度等),生成对应的SQL create table语句,将结果SQL脚本保存到文件,每个表一行。
access数据库中提取表结构,生成sql查询语句,通过sql脚本可以建表
原文来自http://access911.net/fixhtm/72fab11e16dcebf3.htm?tt=
对原文代码做出的修改:
- 原来的代码在生成文件后又使用了生成的sql语句进行创建,下面的代码删除了创建部分。
- 原来的代码decimal数据类型没有保留小数位数,下面的代码进行了添加。
运行原代码的问题:
缺少引用的库出错,在下图中的引用上要加入相应的依赖库。
这个最坑,直接百度、google不到,试出来的……
生成的sql语句在access中不能直接运行
由于access语句不支持decimal、nvarchar等数据类型,如果需要运行生成的sql语句需要在其它的软件中处理,或者使用查找替换更改数据类型。
Option Compare DatabaseFunction CreateSQLString(ByVal FilePath As String) As Boolean'本函数根据当前MDB中的表创建一个 *.jetsql 脚本'这个函数不是最完美的解决方案,因为 JET SQL DDL 语句不支持一些 ACCESS 特有的属性(DAO支持)'This function create a "*.jetsql" script based on current mdb tables.'This function is not the BEST, because the JET SQL DDL never support some DAO property.Dim MyTableName As StringDim MyFieldName As StringDim MyDB As New ADOX.CatalogDim MyTable As ADOX.TableDim MyField As ADOX.ColumnDim proDim iC As LongDim strField() As StringDim strKey As StringDim strSQL As StringDim strSQLScript As StringDim objFile, stmFileDim strText As StringOn Error GoTo CreateSQLScript_ErrMyDB.ActiveConnection = CurrentProject.ConnectionFor Each MyTable In MyDB.TablesIf MyTable.Type = "TABLE" Then'指定表的类型,例如“TABLE”、“SYSTEM TABLE”或“GLOBAL TEMPORARY”或者“ACCESS TABLE”。'ADOX 无法判断该表是否已经被删除,还有两种方式判断,'方法一:(用 DAO)'If CurrentDb.TableDefs(strTableName).Attributes = 0 Then'方法二:(在判断 ADOX.Table.Type 的基础上再判定表名)'If Left(MyTable.Name, 7) <> "~TMPCLP" ThenstrSQL = "create table [" & MyTable.Name & "]("For Each MyField In MyTable.ColumnsReDim Preserve strField(iC)strField(iC) = SQLField(MyField)iC = iC + 1NextstrSQL = strSQL & Join(strField, ",")'获取当前表的字段信息后立即重新初始化 strField 数组iC = 0ReDim strField(iC)'加入键信息strKey = SQLKey(MyTable)If Len(strKey) <> 0 ThenstrSQL = strSQL & "," & strKeyEnd IfstrSQL = strSQL & ");" & vbCrLfstrSQLScript = strSQLScript & strSQL'Debug.Print SQLIndex(MyTable) 'Never support the INDEX,to be continued...'暂未支持 index 脚本,未完待续...End IfNextSet MyDB = Nothing'create the Jet SQL Script FileSet objFile = CreateObject("Scripting.FileSystemObject")Set stmFile = objFile.CreateTextFile(FilePath, True)stmFile.Write strSQLScriptstmFile.CloseSet stmFile = NothingSet objFile = NothingCreateSQLScript = TrueCreateSQLScript_Exit:Exit FunctionCreateSQLScript_Err:MsgBox Err.Description, vbExclamationCreateSQLScript = FalseResume CreateSQLScript_ExitEnd FunctionFunction RunFromText(ByVal FilePath As String)'本函数将 CreateSQLScript 生成的 *.jetsql 脚本来生成 mdb 数据库中的表'This Function run the "*.jetsql" which is created by CreateSQLScript to create the tables in current mdb database.On Error Resume NextDim objFile, stmFileDim strText As StringSet objFile = CreateObject("Scripting.FileSystemObject")Set stmFile = objFile.OpenTextFile(FilePath, 1, False)strText = stmFile.ReadAllstmFile.CloseSet stmFile = NothingSet objFile = NothingDim strSQL() As StringDim i As LongstrSQL = Split(strText, ";" & vbCrLf)For i = LBound(strSQL) To UBound(strSQL)CurrentProject.Connection.Execute Trim(strSQL(i))If Err <> 0 ThenDebug.Print "Error SQL is:" & strSQL(i)Err.ClearEnd IfNextEnd FunctionFunction SQLKey(ByVal objTable As ADOX.Table)'调用 ADOX 生成有关“键”的 JET SQL DDL 子句'Reference ADOX and create the JET SQL DDL clause about the "Key"Dim MyKey As ADOX.KeyDim MyKeyColumn As ADOX.ColumnDim strKey As StringDim strColumns() As StringDim strKeys() As StringDim i As LongDim iC As LongFor Each MyKey In objTable.KeysSelect Case MyKey.TypeCase adKeyPrimarystrKey = "Primary KEY "Case adKeyForeignstrKey = "FOREIGN KEY "Case adKeyUniquestrKey = "UNIQUE "End SelectFor Each MyKeyColumn In MyKey.ColumnsReDim Preserve strColumns(iC)strColumns(iC) = "[" & MyKeyColumn.Name & "]"iC = iC + 1NextReDim Preserve strKeys(i)strKeys(i) = strKey & "(" & Join(strColumns, ",") & ")"'获取信息后,立即初始化数组iC = 0ReDim strColumns(iC)i = i + 1NextSQLKey = Join(strKeys, ",")End FunctionFunction SQLField(ByVal objField As ADOX.Column)'调用 ADOX 生成有关“字段”的 JET SQL DDL 子句'Reference ADOX and create the JET SQL DDL clause about the "Field"Dim p As StringSelect Case objField.TypeCase 11p = " yesno"Case 6p = " money"Case 7p = " datetime"Case 5p = " FLOAT" 'or " Double"Case 72'JET SQL DDL 语句无法创建“自动编号 GUID”字段,这里暂时用'[d] GUID default GenGUID() 代替部分功能,详情请看文章'如何用JET SQL DDL创建自动编号GUID字段'http://access911.net/?kbid;72FABE1E17DCEEF3If objField.Properties("Autoincrement") = True Thenp = " autoincrement GUID"Elsep = " GUID"End IfCase 3If objField.Properties("Autoincrement") = False Thenp = " smallint"Elsep = " AUTOINCREMENT(1," & objField.Properties("Increment") & ")"End IfCase 205p = " image"Case 203p = " memo" 'Access "HyperLink" field is also a MEMO data type.'ACCESS 的超级链接也是 MEMO 类型的Case 131p = " DECIMAL"p = p & "(" & objField.Precision & "," & objField.NumericScale & ")"Case 4p = " single" 'or " REAL"Case 2p = " smallint"Case 17p = " byte"Case 202p = " nvarchar"p = p & "(" & objField.DefinedSize & ")"Case 130'指示一个以 Null 终止的 Unicode 字符串 (DBTYPE_WSTR)。 这种数据类型用 ACCESS 设计器是无法设计出来的。'20100826 新增p = " char"p = p & "(" & objField.DefinedSize & ")"Case Elsep = " (" & objField.Type & " Unknown,You can find it in ADOX's help. Please Check it.)"End Selectp = "[" & objField.Name & "]" & pIf IsEmpty(objField.Properties("Default")) = False Thenp = p & " default " & objField.Properties("Default")End IfIf objField.Properties("Nullable") = False Thenp = p & " not null"End IfSQLField = pEnd Function'Please copy these code in VBA module and press F5 to run the follow function'请将以下代码 COPY 到 VBA 模块中,然后按 F5 键运行以下两段函数 生成的sql文件目标路径Sub RunTest_CreateScript()CreateSQLString "d:\temp.jetsql"End Sub
access生成sql脚本,通过VBA调用ADOX的更多相关文章
- PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。
PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...
- PowerDesigner16.5 生成SQL脚本执行出错:collate chinese_prc_ci_as
PowerDesigner16.5 生成SQL脚本执行出错, collate chinese_prc_ci_as 点DataBase-edit current dbms —— 左边Script - O ...
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...
- (转)powerdesigner 生成sql脚本使用的设置
本文转载自:http://blog.163.com/lizhihaoo@126/blog/static/103121661201036171115/ 1. 生成sql脚本的时候,提示"con ...
- PowerDesigner生成sql脚本
1.打开PowerDesigner->New Project; 2.填写项目名称,选择文件的存放路径: 3.新建一个模型,New Model: 4.选择概念模型,填写模型名称: 5.选择enti ...
- SQL Server ----- 生成sql 脚本
通过生成sql 脚本进行数据库转移 选中需要进行转移的数据库 点击生成脚本后出现 进入的是简介界面 直接点击下一步 进入到选择对象界面. 按照步骤进行设置 选择你需要的 架构和数据 ...
- 读取excel数据生成sql脚本
package com.interact.util; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.b ...
- SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本
在之前介绍一下EasyQuery工具SNF开发平台WinForm-EasyQuery统计分析-效果-非常牛逼的报表查询工具 Winform开发框架之图表报表在线设计器-报表-SNF.EasyQuery ...
- 去掉PowerDesigner生成SQL脚本中字段名带的引号
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照“”中的名称建表,如果没有“”,会按照ORACL ...
随机推荐
- android性能测试与调优:使用 DDMS 查看内存分配情况
1. 启用自己的APK后 2. 点击左边更新heap 3. 点击右边的heap中的垃圾回收cause GC,等待数秒出现回收内存与数据情况(由于内存回收了APK运行出现异常crash) 4. 点击一个 ...
- 使用PowerDesigner导出MySQL数据库建模
数据库服务器在linux上面,客户端本子win8系统 1.安装odbc 1.1 下载odbc,http://dev.mysql.com/downloads/connector/odbc/ Windo ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- HTML5新增元素
由于DIV的滥用,导致页面结构混乱,所以,与HTML4相比,HTML5主要新增了结构元素 新增的元素 1.结构元素: section 表示页面中的一个块或者章节,比如页眉.页脚,或者页面中的其它部分 ...
- [转]sed命令详解
转载:http://blog.chinaunix.net/u/22677/showart_1076318.html 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...
- Java随笔二
1.常量:final可以设置变量,也可以表示这个变量只能被赋值一次(即可以声明一个空变量,只能赋值一次):可以使用关键字static final设置一个类常量,以供一个类中的多个方法使用. 2.字符串 ...
- C# Substring的用法
方法1 Substring(Int32) 从此实例检索子字符串. 子字符串在指定的字符位置开始并一直到该字符串的末尾. 方法2 Substring(Int32, Int32) 从此实例检索子字符串. ...
- iOS8: Ignore manifest download, already have bundleID
在企业分发的app下载过程中,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但始终安装不上程序,的device console发现安装的时候出现 LoadExternalDownl ...
- NOPI Excel插件导入导出 图片批注
dateTable导出到excel的MemoryStream /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// & ...
- android摇一摇实现(仿微信)
这个demo模仿的是微信的摇一摇,是一个完整的demo,下载地址在最下面.下面是demo截图: 步驟: 1.手机摇动监听,首先要实现传感器接口SensorEventLi ...