CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

DAO 访问 ACCESS数据库,如何得到指定名称的数据表sTableName当中的所有字段的名称和类型?

楼主woshihuzi(我是胡子)2006-03-05 23:00:21 在 VB / 数据库(包含打印,安装,报表) 提问

总感觉如下代码太过繁琐:  
   
  Public   Function   FieldIsInTableOfDatabase(ByVal   sFieldName   As   String,   ByVal   sTableName   As   String,   ByRef   db   As   Database)   As   Boolean  
                                           
          Dim   bExists   As   Boolean  
          bExists   =   False  
           
          '   用DAO对象,逐个读取数据库db的表名,查找数据表sTableName的字段sFieldName是否存在  
          Dim   objTable   As   TableDef  
          For   Each   objTable   In   db.TableDefs  
                  Debug.Print   objTable.Name  
                  If   LCase(objTable.Name)   =   LCase(sTableName)   Then  
                          bExists   =   True  
                          Exit   For  
                  End   If  
          Next  
                 
          If   bExists   Then  
                  bExists   =   False  
                  Dim   i   As   Integer  
                  For   i   =   0   To   objTable.Fields.Count   -   1  
                          If   LCase(objTable.Fields(i).Name)   =   LCase(sFieldName)   Then  
                                  bExists   =   True  
                                  Exit   For  
                          End   If  
                  Next   i  
          End   If  
                   
          Set   objTable   =   Nothing  
          FieldIsInTableOfDatabase   =   bExists  
   
  End   Function 问题点数:20、回复次数:3Top

1 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-05 23:37:02 得分 10

基本上也就是这样做了,如果用ADO,在检测表是否存在时,可以不用循环:  
   
  通过查询系统表MSysObjects,判断指定表是否存在(需要设置权限:打开Access,工具/选项/视图/选中  
   
  系统对象,确定后,工具/安全/用户与组权限/对象名称/选中MSysObjects--->权限/读取数据,确定,  
   
  关闭Access)  
  Public   Function   FieldIsInTableOfDatabase(ByVal   sFieldName   As   String,   ByVal   sTableName   As   String,   ByRef   db   As   Database)   As   Boolean  
                                           
          Dim   bExists   As   Boolean  
          bExists   =   False  
           
          Dim   cn   As   New   ADODB.Connection,   rs   As   New   ADODB.Recordset  
          cn.CursorLocation   =   adUseClient  
          cn.Open   "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source="   &   App.Path   &   "\Test.mdb;User   Id=admin;Password=;"  
          rs.Open   "SELECT   [Name]   FROM   MsysObjects   WHERE   [name]=   "   &   sTableName,   cn,   adOpenDynamic,   adLockOptimistic  
                 
          If   Not   (rs.BOF   And   rs.EOF)   Then  
                  bExists   =   False  
                  Dim   i   As   Integer  
                  For   i   =   0   To   rs.RecordCount   -   1  
                          If   LCase(rs(i).Name)   =   LCase(sFieldName)   Then  
                                  bExists   =   True  
                                  Exit   For  
                          End   If  
                  Next   i  
          End   If  
           
          rs.Close  
          cn.Close  
          Set   rs   =   Nothing  
          Set   cn   =   Nothing  
          FieldIsInTableOfDatabase   =   bExists  
   
  End   Function  
   
  Top

2 楼daisy8675(莫依 沉迷)回复于 2006-03-05 23:42:29 得分 10

差不了多少,ADO也是这样的,从访问ACCESS的角度上来说.DAO比ADO强一些,从代码上来说,ADO少几行而已  
   
  Option   Explicit  
   
  Public   Rs   As   New   ADODB.Recordset  
  Public   Conn   As   New   ADODB.Connection  
   
  Private   Sub   Command1_Click()  
        On   Error   Resume   Next  
        Conn.Open   "Provider=Microsoft.Jet.OLEDB.4.0;Persist   Security   Info=False;Data   Source=C:\test.mdb"  
        Set   Rs   =   Conn.Execute("Student")           '2  
        If   Err.Number   <>   0   Then  
              Debug.Print   "Table   不存在"  
              Exit   Sub  
        End   If  
  End   Sub  
  Top

3 楼woshihuzi(我是胡子)回复于 2006-03-06 09:40:37 得分 0

Dim   objTable   As   TableDef  
          For   Each   objTable   In   db.TableDefs  
                  Debug.Print   objTable.Name  
                  If   LCase(objTable.Name)   =   LCase(sTableName)   Then  
                          bExists   =   True  
                          Exit   For  
                  End   If  
          Next  
   
  这段代码,能不能简化一下,让objTable直接打开以sTableName命名的表,而不用通过循环列举表名?  
   
  我记得VC当中的CDaoTableDef类倒是可以。Top

相关问题

  • 数据表字段类型的问题?
  • 如何检测数据表中某个字段是否存在?
  • VFP中,怎样动态修改数据表的字段名称?
  • 怎样在Image中显示数据表中的Image字段值?
  • 如何用代码删除数据表的一个字段?(keani)
  • 如何动态创建数据表,实现增、删改字段
  • 怎么判断数据表中某个字段是否存在?
  • 如何动态插入一个数据表的字段?
  • PB6.5中判断数据表中某个字段是否存在
  • 数据表中字段内容压缩的问题。。。

关键词

  • debug
  • db
  • objtable
  • bexists
  • stablename
  • tabledefs
  • lcase
  • sfieldname
  • 表
  • 是否存在

得分解答快速导航

  • 帖主:woshihuzi
  • faysky2
  • daisy8675

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo