복붙노트

[SQL] 액세스 테이블이 존재하는지 확인

SQL

액세스 테이블이 존재하는지 확인

나는 액세스 데이터베이스에 웹 사이트 방문 'IP, 날짜, 클라이언트와 refferer 데이터를 기록 할하지만 2010년 6월 6일이 2010_06_06라는 이름의 테이블에 기록됩니다에 대한 모든 일이 예를 로그에 별도의 테이블의 데이터를 기록 로그온 할 계획입니다. 날짜가 변경되면 나는 2010_06_07라는 이름의 테이블을 만듭니다. 이 테이블은 이미 생성 된 경우 그러나 문제는있다.

테이블 액세스에 존재하는 경우 모든 제안을 확인하는 방법?

해결법

  1. ==============================

    1.테이블이 존재하는 경우 확인 숨겨진 시스템 테이블으로 MSysObjects을 사용할 수 있습니다 :

    테이블이 존재하는 경우 확인 숨겨진 시스템 테이블으로 MSysObjects을 사용할 수 있습니다 :

    If Not IsNull(DlookUp("Name","MSysObjects","Name='TableName'")) Then
        'Table Exists
    

    그러나, 나는 매일 새 테이블을 만드는 아주 나쁜 생각에 동의합니다.

    편집 : 나는 테이블이 유형 1, 4, 6을하고 말을 더 나은 것 그래서, 테이블과 같은 이름을 가지고 다른 유형의 다른 개체에 대한 수 있음을 추가해야합니다 :

    If Not IsNull(DlookUp("Name","MSysObjects","Name='TableName' And Type In (1,4,6)")) Then
        'Table Exists
    

    그러나, 당신이 이름에 대한 테스트까지 살펴 필요 그렇다면, 쿼리와 같은 이름의 테이블을 만들 수 없습니다, 그것은 형식 목록을 쿼리입니다, 5를 추가하는 것이 가장 좋습니다.

  2. ==============================

    2.나는 테이블이 몇 년 전에 존재하는지 알아 내기 위해 다양한 방법을 시험했다. 여기 내 간단한 테스트 루틴을 포함하여 구현 된 그들 모두를위한 코드입니다.

    나는 테이블이 몇 년 전에 존재하는지 알아 내기 위해 다양한 방법을 시험했다. 여기 내 간단한 테스트 루틴을 포함하여 구현 된 그들 모두를위한 코드입니다.

    Public Function TableExists(strTableName As String, Optional ysnRefresh As Boolean, Optional db As DAO.Database) As Boolean
    ' Originally Based on Tony Toews function in TempTables.MDB, http://www.granite.ab.ca/access/temptables.htm
    ' Based on testing, when passed an existing database variable, this is the fastest
    On Error GoTo errHandler
      Dim tdf As DAO.TableDef
    
      If db Is Nothing Then Set db = CurrentDb()
      If ysnRefresh Then db.TableDefs.Refresh
      Set tdf = db(strTableName)
      TableExists = True
    
    exitRoutine:
      Set tdf = Nothing
      Exit Function
    
    errHandler:
      Select Case Err.Number
        Case 3265
          TableExists = False
        Case Else
          MsgBox Err.Number & ": " & Err.Description, vbCritical, "Error in mdlBackup.TableExists()"
      End Select
      Resume exitRoutine
    End Function
    
    Public Function TableExists2(strTableName As String, Optional ysnRefresh As Boolean, Optional db As DAO.Database) As Boolean
    On Error GoTo errHandler
      Dim bolCleanupDB As Boolean
      Dim tdf As DAO.TableDef
    
      If db Is Nothing Then
         Set db = CurrentDb()
         bolCleanupDB = True
      End If
      If ysnRefresh Then db.TableDefs.Refresh
      For Each tdf In db.TableDefs
        If tdf.name = strTableName Then
           TableExists2 = True
           Exit For
        End If
      Next tdf
    
    exitRoutine:
      Set tdf = Nothing
      If bolCleanupDB Then
         Set db = Nothing
      End If
      Exit Function
    
    errHandler:
      MsgBox Err.Number & ": " & Err.Description, vbCritical, "Error in mdlBackup.TableExists1()"
      Resume exitRoutine
    End Function
    
    Public Function TableExists3(strTableName As String, _
         Optional db As DAO.Database) As Boolean
    ' Based on testing, when NOT passed an existing database variable, this is the fastest
    On Error GoTo errHandler
      Dim strSQL As String
      Dim rs As DAO.Recordset
    
      If db Is Nothing Then Set db = CurrentDb()
      strSQL = "SELECT MSysObjects.Name FROM MSysObjects "
      strSQL = strSQL & "WHERE MSysObjects.Name=" & Chr(34) & strTableName & Chr(34)
      strSQL = strSQL & " AND MSysObjects.Type=6;"
      Set rs = db.OpenRecordset(strSQL)
      TableExists3 = (rs.RecordCount <> 0)
    
    exitRoutine:
      If Not (rs Is Nothing) Then
         rs.Close
         Set rs = Nothing
      End If
      Exit Function
    
    errHandler:
      MsgBox Err.Number & ": " & Err.Description, vbCritical, _
         "Error in TableExists1()"
      Resume exitRoutine
    End Function
    
    Public Sub TestTableExists(strTableName As String, intLoopCount As Integer)
      Dim dteStart As Date
      Dim i As Integer
      Dim bolResults As Boolean
    
      dteStart = Now()
      For i = 0 To intLoopCount
        bolResults = TableExists(strTableName, , CurrentDB())
      Next i
      Debug.Print "TableExists (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss")
    
      dteStart = Now()
      For i = 0 To intLoopCount
        bolResults = TableExists2(strTableName, , CurrentDB())
      Next i
      Debug.Print "TableExists2 (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss")
    
      dteStart = Now()
      For i = 0 To intLoopCount
        bolResults = TableExists3(strTableName, CurrentDB())
      Next i
      Debug.Print "TableExists3 (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss")
    End Sub
    
  3. ==============================

    3.여기에 또 다른 솔루션입니다, 모든 테이블을 통해 반복보다 조금 빠를 것이다.

    여기에 또 다른 솔루션입니다, 모든 테이블을 통해 반복보다 조금 빠를 것이다.

    Public Function doesTableExist(strTableName As String) As Boolean
        Dim db As DAO.Database
        Dim td As DAO.TableDef
        Set db = CurrentDb
        On Error Resume Next
        Set td = db.TableDefs(strTableName)
        doesTableExist = (Err.Number = 0)
        Err.Clear
    End Function
    
  4. ==============================

    4.나는 신뢰할 수와 테이블을 정기적으로 작성 떨어받을 경우 스크립트에서 예기치 않은 동작을 소개하는 질의 시스템 테이블 또는의 TableDefs을 발견했다.

    나는 신뢰할 수와 테이블을 정기적으로 작성 떨어받을 경우 스크립트에서 예기치 않은 동작을 소개하는 질의 시스템 테이블 또는의 TableDefs을 발견했다.

    내 결과를 바탕으로, 내 가설은 이러한 테이블은 반드시이 CREATE 정확한 순간에 업데이트되지 않습니다 또는 DROP이 실행될 때, 또는 동시성 문제는 정확한 결과를 얻기에서 저를 방지하는 것입니다.

    나는 다음과 같은 방법이 더 신뢰할 수 발견했습니다 :

    Public Function TableExists(theDatabase As Access.Application, _
        tableName As String) As Boolean
    
        ' Presume that table does not exist.
        TableExists = False
    
        ' Define iterator to query the object model.
        Dim iTable As Integer
    
        ' Loop through object catalogue and compare with search term.
        For iTable = 0 To theDatabase.CurrentData.AllTables.Count - 1
            If theDatabase.CurrentData.AllTables(iTable).Name = tableName Then
                TableExists = True
                Exit Function
            End If
        Next iTable
    
    End Function
    

    테이블의 비틀 거리며 거대한 컬렉션이하지 않는 한 런타임 문제를 반복하는이 없어야합니다.

  5. ==============================

    5.이 질문은 꽤 오래 그러나 나는 아무 대답이 때문에, 만족되지 않는 것을 발견 :

    이 질문은 꽤 오래 그러나 나는 아무 대답이 때문에, 만족되지 않는 것을 발견 :

    그래서 여기 내 간단하지만보다 완벽한 솔루션입니다 :

    Function isTableOk(tblName As String) As Boolean
    'works with local or linked tables
        Dim db As DAO.Database, rs As DAO.Recordset
        Dim sSql As String
        sSql = "SELECT TOP 1 ""xxx"" AS Expr1 FROM [" & tblName & "]"
    
        On Error Resume Next
        Err.Clear
        Set db = CurrentDb
        Set rs = db.OpenRecordset(sSql)
        isTableOk = (Err.Number = 0)
        rs.Close
    End Function
    

    이 버전의 외부 액세스 DB에 테이블을 확인조차 할 수 있습니다 :

    Function isTableOk(tblName As String, Optional dbName As String) As Boolean
    'works with local or linked tables, or even tables in external db (if dbName is provided)
    
        Dim db As DAO.Database, rs As DAO.Recordset
        Dim sSql As String
    
        Set db = CurrentDb
        sSql = "SELECT TOP 1 'xxx' AS Expr1 FROM [" & tblName & "]"
        If Len(dbName) > 0 Then 'external db 
            sSql = sSql & " IN '" & dbName & "'"
        End If
        Err.Clear
        On Error Resume Next
        Set rs = db.OpenRecordset(sSql)
        isTableOk = (Err.Number = 0)
        rs.Close
    End Function
    
  6. from https://stackoverflow.com/questions/2985513/check-if-access-table-exists by cc-by-sa and MIT license