Database 检索Access数据库中的索引列表

Database 检索Access数据库中的索引列表,database,ms-access,ms-access-2007,Database,Ms Access,Ms Access 2007,我知道有一种方法可以通过查询MsysObjects来获取Access数据库中所有表的列表: SELECT MSysObjects.Name FROM MsysObjects WHERE Left$([Name],1)<>'~' AND Left$([Name],4)<>'Msys' AND MSysObjects.Type=1 从MSysObjects中选择MSysObjects.Name 哪里 左$([Name],1)~”和 左$([Name],4)“Ms

我知道有一种方法可以通过查询MsysObjects来获取Access数据库中所有表的列表:

SELECT MSysObjects.Name FROM MsysObjects
WHERE
  Left$([Name],1)<>'~' AND
  Left$([Name],4)<>'Msys' AND
  MSysObjects.Type=1
从MSysObjects中选择MSysObjects.Name
哪里
左$([Name],1)~”和
左$([Name],4)“Msys”和
MSysObjects.Type=1

有人知道检索MS Access数据库中所有索引列表的类似(或其他)方法吗?

您可以检查
TableDef
对象以访问索引名称

公共子ShowIndexNames()
将tdf调暗为TableDef
Dim-idx作为索引
Dim num_索引的长度
关于错误转到错误处理程序
对于CurrentDb.TableDefs中的每个tdf
num_index=tdf.index.Count
如果左$(tdf.Name,4)“MSys”,则
如果num_索引>0,则
对于tdf.索引中的每个idx
Debug.Print tdf.Name,idx.Name
下一个idx
如果结束
如果结束
下一个tdf
出口:
出口接头
错误处理程序:
选择案例错误编号
案件3110
'无法读取定义;无需阅读定义'
“表或查询“”的权限。”
调试。打印“无读取定义权限”_
&名称
num_索引=0
下一步继续
其他情况
调试.打印错误编号&“->”&错误说明
去那里
结束选择
端接头
编辑:修改sub以忽略MSys*(访问系统)表

您还可以使用ADO的
OpenSchema
方法来检索有关索引的信息。下面的代码列出了索引名称、关联表以及索引是否为主键。我编写它是为了使用ADO的后期绑定,因为这不需要设置Microsoft ActiveX数据对象[version]库的引用

Const adSchemaIndexes作为Long=12
Dim cn作为对象的ADODB.Connection
将rs设置为对象“ADODB.Recordset”
我想我会坚持多久
设置cn=CurrentProject.Connection
Set rs=cn.OpenSchema(adSchemaIndexes)
用rs
'启用下三行以查看所有记录集列名
'对于i=0到(.Fields.Count-1)
'调试.Print.Fields(i).Name
“接下来我
做而不做
调试,打印!表格名称!索引名称!主键
.下一步
环
.结束
以
设置rs=无
设置cn=Nothing
如果希望检查单个表的索引,而不是数据库中每个表的索引,请将表名作为数组的第五个元素传递

Set rs=cn.OpenSchema(adschemaindex,Array(Empty,Empty,Empty,Empty,“tblFoo”))

如果您需要使用.Net OleDb provider,并且不能再使用其他任何东西

DataTable indexes = 
(myOleDbConnection.GetOleDbSchemaTable(
System.Data.OleDb.OleDbSchemaGuid.Indexes,
new object[] { null, null, null, null, tableName});
(指定正确的连接和正确的表)

在indexes数据表中,索引和字段一起出现。

扩展到

除了知道索引的名称外,几乎总是需要知道这些索引中引用了哪些字段。例如,当将表从access DB导入SQL Server 2008 R2时,它不会复制键和索引,因此我需要重新生成它们。Thusfar此脚本不能正确处理外键约束,但应生成主键和标准索引。我将在FK问题排序后对其进行编辑

Public Sub Generate_tSQLIndex()
    Dim tdf As TableDef
    Dim idx As Index
    Dim num_indexes As Long
    Dim indexdef_tsql As String
    Dim pk As Boolean
    On Error GoTo ErrorHandler
    For Each tdf In CurrentDb.TableDefs
        num_indexes = tdf.Indexes.Count
        If Left$(tdf.Name, 4) <> "MSys" Then
            If num_indexes > 0 Then
                For Each idx In tdf.Indexes
                    pk = idx.Primary
                    If pk Then indexdef_tsql = "ALTER TABLE [" + tdf.Name + "] WITH CHECK ADD CONSTRAINT [PK_" + tdf.Name + "_" + idx.Name + "] PRIMARY KEY " Else indexdef_tsql = "CREATE "
                    If idx.Unique And Not pk Then indexdef_tsql = indexdef_tsql + "UNIQUE "
                    If idx.Clustered Then indexdef_tsql = indexdef_tsql + "CLUSTERED " Else indexdef_tsql = indexdef_tsql + "NONCLUSTERED "
                    If Not pk Then indexdef_tsql = indexdef_tsql + "INDEX [" + idx.Name + "] ON [" + tdf.Name + "] "
                    indexdef_tsql = indexdef_tsql + "("
                    For Each fld In idx.Fields
                        indexdef_tsql = indexdef_tsql + "[" + fld.Name + "]"
                        If fld.Attributes = 1 Then indexdef_tsql = indexdef_tsql + " DESC, " Else indexdef_tsql = indexdef_tsql + " ASC, "
                    Next fld
                    If idx.Fields.Count > 0 Then indexdef_tsql = Left(indexdef_tsql, Len(indexdef_tsql) - 2)
                    indexdef_tsql = indexdef_tsql + ")"
                    Debug.Print indexdef_tsql
                Next idx
            End If
         End If
    Next tdf

ExitHere:
        Exit Sub

ErrorHandler:
    Select Case Err.Number
        Case 3110
        'Could not read definitions; no read definitions '
        'permission for table or query '<Name>'. '
        Debug.Print "No read definitions permission for " + tdf.Name
        num_indexes = 0
        Resume Next
    Case Else
        Debug.Print Err.Number & "-> " & Err.Description
        GoTo ExitHere
    End Select

End Sub
Public子生成_tSQLIndex()
将tdf调暗为TableDef
Dim-idx作为索引
Dim num_索引的长度
Dim indexdef_tsql作为字符串
Dim pk作为布尔值
关于错误转到错误处理程序
对于CurrentDb.TableDefs中的每个tdf
num_index=tdf.index.Count
如果左$(tdf.Name,4)“MSys”,则
如果num_索引>0,则
对于tdf.索引中的每个idx
pk=idx.Primary
如果pk然后indexdef_tsql=“ALTER TABLE[”+tdf.Name+”]并选中添加约束[pk_u“+tdf.Name+”“+idx.Name+”]主键”否则indexdef_tsql=“创建”
如果idx.Unique而不是pk,则indexdef_tsql=indexdef_tsql+“Unique”
如果是idx.Clustered,则indexdef_tsql=indexdef_tsql+“集群化”否则indexdef_tsql=indexdef_tsql+“非集群化”
如果不是pk,则indexdef_tsql=indexdef_tsql+“索引[“+idx.Name+”]位于[“+tdf.Name+”]”
indexdef_tsql=indexdef_tsql+“(”
对于idx.字段中的每个fld
indexdef_tsql=indexdef_tsql+“[”+fld.Name+“]
如果fld.Attributes=1,则indexdef_tsql=indexdef_tsql+“DESC”,否则indexdef_tsql=indexdef_tsql+“ASC,”
下一个fld
如果idx.Fields.Count>0,则indexdef_tsql=Left(indexdef_tsql,Len(indexdef_tsql)-2)
indexdef_tsql=indexdef_tsql+”)
Debug.Print indexdef_tsql
下一个idx
如果结束
如果结束
下一个tdf
出口:
出口接头
错误处理程序:
选择案例错误编号
案件3110
'无法读取定义;无需阅读定义'
“表或查询“”的权限。”
调试.打印“+tdf.Name”的“无读取定义权限”
num_索引=0
下一步继续
其他情况
调试.打印错误编号&“->”&错误说明
去那里
结束选择
端接头

谢谢您的帮助。非常有用。您需要添加一个额外的行Dim fld作为DAO.Field