解决思路:
建立Access数据表可以使用ADO编程模型的Command对象执行SQL语句CREATE TABLE来实现。
问题的关键是若数据库中已经存在相同名称的数据表时,SQL语句的执行会出错。要避免这个错误,执行SQL语句前需要判断数据库中是否存在同名数据表。 另外,执行SQL语句也可以使用ADODB.Connection.Execute方法。
具体步骤
1. 创建ADO连接(ADODB.Connection)对象,创建与Access数据库的连接,以下假设该连接对象名为cn。
2. 判断Access数据库中是否存在要创建的同名数据表 ADODB.Connection对象的OpenSchema方法可以从数据库中获取其摘要信息。该方法返回一个包含数据库摘要信息的RecordSet记录集对象。以下VBA函数判断连接对象cn所连接的数据库中是否存在与输入字符串InputStr同名的数据表。
'函数HasTable,判断数据库中是否存在某数据表 '输入参数:cn--ADODB.Connection类型,ADO数据库连接对象 ' InputStr--字符串,要判断是否存在的数据表名称,忽略大小写区别 '返回值:若数据库中存在与InputStr同名的数据表,返回True,否则返回False Function HasTable(cn As ADODB.Connection, InputStr As String) As Boolean Dim rst As New ADODB.Recordset '新建记录集集对象 Set rst = cn.OpenSchema(adSchemaTables, TABLE_NAME) '获取数据库全部数据表名称 Dim i As Integer rst.MoveFirst For i = 0 To rst.RecordCount - 1 If UCase(rst.Fields("TABLE_NAME")) = UCase(InputStr) Then '比较数据表名称与输入字符串 Ch17_3_HasTable = True '存在与InputStr同名的数据表 rst.Close '及时关闭记录集对象 Exit Function End If rst.MoveNext Next i HasTable = False '不存在与InputStr同名的数据表 rst.Close '及时关闭记录集对象 End Function
3. 创建ADODB.Command命令对象执行SQL语句 建立与ADO数据源的连接后,可以先声明一个ADODB.Command类型的对象变量,然后设置该对象变量的ActiveConnection属性和CommandText属性,指定命令使用的连接和命令文本字符串。命令文本字符串就是完整的SQL语句串,新建Access表使用SQL语句CREATE TABLE,其完整语法为:
CREATE TABLE 表名 (字段名1 类型[,字段名2 类型,……] [其它参数]);
其中可选项[其它参数]是与物理存贮有关的参数,由具体数据库系统决定,在Access数据库中无须指定。以上参数表中每个字段的类型后加SQL关键字NOT NULL指定某些字段不允许使用NULL值。
例如以下代码段创建一个基于连接cn的命令对象cmd,并指定其命令文本为建立数据表line,该表四个字段分别存储AutoCAD直线对象的起点和终点坐标值,字段数据类型为float浮点数。
Set cmd = New ADODB.Command Set cmd.ActiveConnection = cn If HasTable(cn, “line”) = False Then cmd.CommandText = "CREATE TABLE line(X1 float,Y1 float,X2 float,Y2 float);" cmd.Execute Else MsgBox "数据库中已经存在数据表line,不能创建", , "明经通道VBA示例" End If
另外,执行SQL语句,也可以不新建Command对象而直接使用Connection对象的Execute方法: cn.Execute "CREATE TABLE line(X1 float,Y1 float,X2 float,Y2 float);"
'返回满足条件的记录的总数目 Function getRecordCount(database As ADODB.connection, _ sql As String) As Integer Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.Open sql, database, adOpenStatic, adLockReadOnly getRecordCount = rst.recordCount End Function