a65306805 发表于 2005-4-16 09:25:00

[VBA]请教:ADO如何在ACCESS数据库中新建一个表

请教高手:ADO如何在ACCESS数据库中新建一个表

leeyeafu 发表于 2005-4-18 11:13:00

解决思路:



建立Access数据表可以使用ADO编程模型的Command对象执行SQL语句CREATE TABLE来实现。


<BR>问题的关键是若数据库中已经存在相同名称的数据表时,SQL语句的执行会出错。要避免这个错误,执行SQL语句前需要判断数据库中是否存在同名数据表。<BR>另外,执行SQL语句也可以使用ADODB.Connection.Execute方法。


<BR>        具体步骤


<BR>1. 创建ADO连接(ADODB.Connection)对象,创建与Access数据库的连接,以下假设该连接对象名为cn。


<BR>2. 判断Access数据库中是否存在要创建的同名数据表<BR>ADODB.Connection对象的OpenSchema方法可以从数据库中获取其摘要信息。该方法返回一个包含数据库摘要信息的RecordSet记录集对象。以下VBA函数判断连接对象cn所连接的数据库中是否存在与输入字符串InputStr同名的数据表。


<BR>'函数HasTable,判断数据库中是否存在某数据表<BR>'输入参数:cn--ADODB.Connection类型,ADO数据库连接对象<BR>'                                                                       InputStr--字符串,要判断是否存在的数据表名称,忽略大小写区别<BR>'返回值:若数据库中存在与InputStr同名的数据表,返回True,否则返回False<BR>Function HasTable(cn As ADODB.Connection, InputStr As String) As Boolean<BR>       Dim rst As New ADODB.Recordset               '新建记录集集对象<BR>       Set rst = cn.OpenSchema(adSchemaTables, TABLE_NAME)       '获取数据库全部数据表名称<BR>       Dim i As Integer<BR>       rst.MoveFirst<BR>       For i = 0 To rst.RecordCount - 1<BR>                       If UCase(rst.Fields("TABLE_NAME")) = UCase(InputStr) Then               '比较数据表名称与输入字符串<BR>                                       Ch17_3_HasTable = True               '存在与InputStr同名的数据表<BR>                                       rst.Close                               '及时关闭记录集对象<BR>                                       Exit Function<BR>                       End If<BR>                       rst.MoveNext<BR>       Next i<BR>       HasTable = False               '不存在与InputStr同名的数据表<BR>       rst.Close               '及时关闭记录集对象<BR>End Function


<BR>3. 创建ADODB.Command命令对象执行SQL语句<BR>建立与ADO数据源的连接后,可以先声明一个ADODB.Command类型的对象变量,然后设置该对象变量的ActiveConnection属性和CommandText属性,指定命令使用的连接和命令文本字符串。命令文本字符串就是完整的SQL语句串,新建Access表使用SQL语句CREATE TABLE,其完整语法为:


<BR>CREATE TABLE 表名 (字段名1       类型[,字段名2       类型,……] [其它参数]);


<BR>其中可选项[其它参数]是与物理存贮有关的参数,由具体数据库系统决定,在Access数据库中无须指定。以上参数表中每个字段的类型后加SQL关键字NOT NULL指定某些字段不允许使用NULL值。


例如以下代码段创建一个基于连接cn的命令对象cmd,并指定其命令文本为建立数据表line,该表四个字段分别存储AutoCAD直线对象的起点和终点坐标值,字段数据类型为float浮点数。


Set cmd = New ADODB.Command<BR>Set cmd.ActiveConnection = cn<BR>If HasTable(cn, “line”) = False Then<BR>       cmd.CommandText = "CREATE TABLE line(X1 float,Y1 float,X2 float,Y2 float);"<BR>       cmd.Execute<BR>Else<BR>       MsgBox "数据库中已经存在数据表line,不能创建", , "明经通道VBA示例"<BR>End If


<BR>另外,执行SQL语句,也可以不新建Command对象而直接使用Connection对象的Execute方法:<BR>cn.Execute "CREATE TABLE line(X1 float,Y1 float,X2 float,Y2 float);"<BR>

a65306805 发表于 2005-4-18 20:56:00

谢谢指教!我这里用 rst.RecordCount 属性总是通不过,rst.RecordCount 为零,但是用do until         rst.EOF 却没有问题,表都能出来,真是搞不懂。

hh168 发表于 2008-4-20 15:54:00

<p><u><strong>试试下面实例代码中标注红色的代码,也许对你有帮助</strong></u></p><p><em>'返回满足条件的记录的总数目</em><br/>Function getRecordCount(database As ADODB.connection, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql As String) As Integer<br/>&nbsp;&nbsp;&nbsp; Dim rst As ADODB.Recordset<br/>&nbsp;&nbsp;&nbsp; Set rst = New ADODB.Recordset<br/><font color="#ff0000">&nbsp;&nbsp;&nbsp; rst.Open sql, database, adOpenStatic, adLockReadOnly</font><br/>&nbsp;&nbsp;&nbsp; getRecordCount = rst.recordCount<br/>End Function<br/></p>
页: [1]
查看完整版本: [VBA]请教:ADO如何在ACCESS数据库中新建一个表