ACCESS (R) MDB

Auf eine Access MDB zugreifen.

WICHTIG FÜR 64Bit:
AUF 32Bit umstellen!!!

Beispiel:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As  _
                               System.EventArgs) Handles MyBase.Load
  
        DB.Open(DB.Get_AppPath & "KOMBIMATION.MDB")
End Sub

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As  _
                                 System.Windows.Forms.FormClosedEventArgs) _
                                 Handles Me.FormClosed
        Try
            DB.Close()
            DB = Nothing
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim schließ?en der Datenbank", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub
 

LESEN
Dim SQL As String
Dim DT As DataTable

SQL = "SELECT [ID], [FRAGE], [TASTE_1],"
SQL
+= " [TASTE_2], [TASTE_3]"
SQL += " FROM  [TASTEN_KOMBI]"

DT = DB.Datatable(SQL)

SCHREIBEN
SQL = "INSERT INTO [TASTEN_KOMBI] (FRAGE, TASTE_1, TASTE_2, TASTE_3)"
SQL += "VALUES ('" & DB.Get_SQL_String(FRAGE) & "', " & TASTE1
SQL += ", " & TASTE2 & ", " & TASTE3 & ");"
'ausfü?hren des SQL Befehls
DB.Execute(SQL)

 

Weitere Features:

  • erstellen  & komprimeieren einer DB
  • erzeugen von Indizes
  • Lesen von Feldern / Tabellen
  • CSV Export
  • ...

Option Strict Off
'zum testen:
'verweis:
'ADOX (Microsoft ADO Ext. 2.x for DDL and Security)
'
'-----------------------------------------------------------------
'
Imports System.Data.OleDb
'
Public Structure tField
    '
    Public Overrides Function ToString() As String
        Return Name
    End Function
    Public Name As String
    Public Type As tField_Type
End Structure

Public Structure tIndex
    '
    Public Overrides Function ToString() As String
        Return Name
    End Function
    Public Name As String
    Public Target_fld As String
End Structure



Public Enum tField_Type
    Text_Field
    Memo_Field
    Integer_Field
    Date_Field
    Real_Field
    Currency_Field
    Boolean_Field
    SmallInt_Field
    single_Field
    Binary_Field
    _unknown
    '  Bool_Field nicht nehmen, da access -1 hat, aber sql-server + oracle 1 nehmen!!

End Enum

Public Class DB_MDB_CLS
    Private Const vbCrLf As String = Microsoft.VisualBasic.vbCrLf
    '
    Private cn As OleDbConnection
    Private mFilename As String = ""
    Private mError As String = ""
    Private mSimple_Error As String = ""
    '
    Public Function Open(ByVal Filename As String) As Boolean
        Open = False : mError = ""
        Try
            Me.Close()
            cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " & _
                             "Data Source=" & Filename & ";")
            cn.Open()
            mFilename = Filename

            Return True
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Get_SQL_String(ByVal inStr As String) As String
        Get_SQL_String = inStr
        Try
            Get_SQL_String = inStr.Replace("'", "''")
        Catch ex As Exception

        End Try
    End Function

    ''' <summary>
    ''' Erstellt aus einer Datenbank eine Textdatei,
    ''' die via Resorce in das Projekt eingebunden werden kann
    ''' </summary>
    ''' <param name="Filename_of_MDB"> Der Name der Access Datei </param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function MDB_TO_Text(ByVal Filename_of_MDB As String) As Boolean
        MDB_TO_Text = False
        Try
            Dim Test() As Byte = System.IO.File.ReadAllBytes(Filename_of_MDB)
            Dim Ret As String = Convert.ToBase64String(Test)
            '
            System.IO.File.WriteAllText(Filename_of_MDB & ".txt", Ret)
            Return True
        Catch : End Try
    End Function

    Public Function Check_DB(ByVal Filename_of_MDB As String, ByVal Res As _
                             String) As Boolean
        Check_DB = False
        Try
            If Not IO.File.Exists(Filename_of_MDB) Then
                Dim Ret As String = ""
                Dim rm As System.Resources.ResourceManager
                rm = New Resources.ResourceManager(Me.GetType().Namespace + _
                                                   ".Resources", _
                                                   Me.GetType().Assembly)
                '
                Ret = rm.GetString(Res)
                rm = Nothing
                Dim Test() As Byte = Convert.FromBase64String(Ret)
                System.IO.File.WriteAllBytes(Filename_of_MDB, Test)
            End If
            Return True
        Catch : End Try
    End Function

    Public ReadOnly Property Get_Error_Message() As String
        Get
            Get_Error_Message = ""
            Try
                Return mError
            Catch : End Try
        End Get
    End Property

    Public ReadOnly Property Get_Simple_Error_Message() As String
        Get
            Get_Simple_Error_Message = ""
            Try
                Return mSimple_Error
            Catch : End Try
        End Get
    End Property

    Public Function Get_SQL_Date(ByVal Data As Date) As String
        Get_SQL_Date = "" : mError = ""
        Try
            '#2/10/2009 23:49:14#
            Dim Ret As String = "#" & Microsoft.VisualBasic.Format(Data, _
                                                "MM/dd/yyyy HH:mm:ss") & "#"
            Ret = Ret.Replace(".", "/")
            Return Ret
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function


    Public Function Close() As Boolean
        Close = False
        Try
            If Not cn Is Nothing Then
                If cn.State <> 0 Then cn.Close()
                cn.Dispose()
            End If
            cn = Nothing
            Return True
        Catch : End Try
    End Function

    Public Function Get_Val(ByVal Field$, ByVal mReader As  _
                            OleDb.OleDbDataReader) As String
        Get_Val = "" : mError = ""
        Try
            If mReader.HasRows Then
                If Not Microsoft.VisualBasic.IsDBNull(mReader(Field)) Then
                    Return mReader(Field).ToString
                End If
            End If
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Get_AppPath() As String
        Get_AppPath = ""
        Try

            Get_AppPath = "" : mError = ""
            Get_AppPath = My.Application.Info.DirectoryPath
            If Microsoft.VisualBasic.Right(Get_AppPath, 1) <> "\" Then
                Get_AppPath += "\"
            End If
        Catch : End Try
    End Function

    Public Function Read(ByVal SQL As String, ByRef mReader As  _
                         OleDb.OleDbDataReader) As Boolean
        Read = False : mError = ""
        Try
            Dim cmd As New OleDbCommand(SQL, cn)
            '
            If cn Is Nothing Then Exit Function
            mReader = cmd.ExecuteReader(CommandBehavior.Default)
            cmd = Nothing
            Return True
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function


    Public Function Get_Table_Names(ByRef Tables() As String) As Integer
        Get_Table_Names = -1 : Erase Tables
        Try
            Dim dbSchemaTable As DataTable = cn.GetOleDbSchemaTable _
                              (OleDbSchemaGuid.Tables, New Object() _
                              {Nothing, Nothing, Nothing, "TABLE"})
            For Each row As DataRow In dbSchemaTable.Rows
                ' Console.WriteLine(row("TABLE_NAME"))
                Get_Table_Names += 1
                ReDim Preserve Tables(Get_Table_Names)
                Tables(Get_Table_Names) = CStr(row("TABLE_NAME"))
            Next

            Return Get_Table_Names + 1
        Finally
        End Try
    End Function

#Region "Export to CSV"
    Public Function Export_To_CSV(ByVal Table_Name As String, _
                                  ByVal CSV_Full_filename As String, _
                                  Optional ByVal Seperator As Char = ";") As Boolean
        Export_To_CSV = False
        Try
            'Vorname;Nachname;"Bemerkung;oder so"
            'Thomas;Mller;"R”merstr. 18c; 2OG rechts"
            '
            Dim iCol As Integer, CNT_Col As Integer 'für die feldnamen
            Dim OK As Boolean, mReader As Data.OleDb.OleDbDataReader = Nothing
            Dim Fields() As tField = Nothing
            Dim SQL As String = "SELECT * FROM [" & Table_Name & "]"
            Dim mLine As String = "", Value As String = ""
            '
            'holen der Feldernamen:
            CNT_Col = Me.Get_Fields_Info(Table_Name, Fields) - 1
            'Datei anlegen


            Using FN As New IO.StreamWriter(CSV_Full_filename, False, _
                                               System.Text.Encoding.UTF8)
                'GetEncoding(1252)) 'Encoding.UTF8) ' '.GetEncoding(1252))
                'Using FS As IO.FileStream = IO.File.Create(CSV_Full_filename)

                'Dim preamble = System.Text.Encoding.Unicode.GetPreamble
                'FS.Write(preamble, 0, preamble.Length)

                'header schreiben:
                'Vorname;Nachname;"Bemerkung;oder so"
                For iCol = 0 To CNT_Col
                    mLine += Replace_Sep(Fields(iCol).Name, Seperator)
                    '; hinten ran, wenns nicht das letzte feld ist
                    If iCol <> CNT_Col Then
                        mLine += Seperator
                    End If
                Next
                '  mLine += vbCrLf
                'header schreiben
                ' Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(mLine)
                'FN.BaseStream.Write(data, 0, data.Length)
                FN.WriteLine(mLine)
                'FS.Write(data, 0, data.Length)
                '
                'Datensätze schreiben
                'Thomas;Mller;"R”merstr. 18c; 2OG rechts"
                OK = Me.Read(SQL, mReader)
                While OK AndAlso mReader.Read
                    mLine = ""
                    For iCol = 0 To CNT_Col
                        Value = Me.Get_Val(Fields(iCol).Name, mReader)
                        mLine += Replace_Sep(Value, Seperator)
                        '; hinten ran, wenns nicht das letzte feld ist
                        If iCol <> CNT_Col Then
                            mLine += Seperator
                        End If
                    Next
                    'mLine += vbCrLf
                    FN.WriteLine(mLine)
                    'data = System.Text.Encoding.Unicode.GetBytes(mLine)
                    'System.Text.Encoding.GetEncoding(1252).GetBytes(mLine)
                    ' System.Text.Encoding.UTF8.GetBytes(mLine)
                    'FN.WriteLine( mLine)
                    'FS.Write(data, 0, data.Length)

                End While
                If OK Then mReader.Close()
                mReader = Nothing
                'fertig: alle puffer leeren:
                FN.Flush()
                FN.Close()
            End Using

            Return True
        Catch ex As Exception

        End Try
    End Function

    Private Function Replace_Sep(ByVal Content As String, ByVal Seperator As _
                                 String) As String
        Replace_Sep = Content
        Try
            If Replace_Sep.Contains(Seperator) Then
                Replace_Sep = """" & Replace_Sep & """" 'in anführungszeichen setzen
            End If
        Catch ex As Exception

        End Try
    End Function

#End Region

    Public Function Get_Fields_Info(ByVal Table As String, ByRef Fields() As  _
                                     tField) As Integer
        Get_Fields_Info = -1 : Erase Fields
        Try

            'Dim dbSchemaTable As DataTable = cn.GetOleDbSchemaTable _
            '                  (OleDbSchemaGuid.Tables, New Object() _
            '                  {Nothing, Nothing, Nothing, "TABLE"})
            'For Each row As DataRow In dbSchemaTable.Rows
            '    ' Console.WriteLine(row("TABLE_NAME"))
            '    If row("TABLE_NAME") = Table Then
            '        For Each fld As DataColumn In row.Field("TABLE_NAME")
            '            Get_Fields_Names += 1
            '            ReDim Preserve Fields(Get_Fields_Names)
            '            Fields(Get_Fields_Names) = CStr(row("TABLE_NAME"))
            '        Next
            '        Exit For
            '    End If
            'Next
            'Dim SQL As String = "SELECT * FROM [" & Table & "]"
            'Dim mReader As OleDb.OleDbDataReader = Nothing, OK As Boolean
            ''
            'OK = Me.Read(SQL, mReader)
            ''
            'For i As Integer = 0 To mReader.FieldCount - 1
            '    ' Debug.WriteLine(mReader.GetName(i))
            '    Get_Fields_Names += 1
            '    ReDim Preserve Fields(Get_Fields_Names)
            '    Fields(Get_Fields_Names) = mReader.GetName(i)

            'Next
            'If OK Then mReader.Close()
            'mReader = Nothing


            Dim schemaTable As DataTable, i As Integer ', DR As DataRow
            schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
                   New Object() {Nothing, Nothing, Table, Nothing})

            'List the column name from each row in the schema table.
            For i = 0 To schemaTable.Rows.Count - 1
                '  Console.WriteLine(schemaTable.Rows(i)!COLUMN_NAME.ToString)
                Get_Fields_Info += 1
                ReDim Preserve Fields(Get_Fields_Info)
                ' Fields(Get_Fields_Info) = New tField
                Fields(Get_Fields_Info).Name = schemaTable.Rows(i)!COLUMN_NAME.ToString
                'Debug.WriteLine(schemaTable.Rows(i)!COLUMN_NAME.ToString & _
                '               " " & schemaTable.Rows(i)!DATA_TYPE.ToString & _
                '               " " & schemaTable.Rows(i)!CHARACTER_MAXIMUM_LENGTH.ToString())

                With Fields(Get_Fields_Info)
                    Select Case schemaTable.Rows(i)!DATA_TYPE
                        Case 3 ' Integer_Spalte 3
                            .Type = tField_Type.Integer_Field
                        Case 5 ' Real_Spalte 5
                            .Type = tField_Type.Real_Field
                        Case 6 ' Currencey_Spalte 6
                            .Type = tField_Type.Currency_Field
                        Case 7 ' Date_Spalte 7
                            .Type = tField_Type.Date_Field
                        Case 130
                            Select Case schemaTable.Rows(i)!CHARACTER_MAXIMUM_LENGTH
                                Case 0
                                    ' Memo_Spalte 130 0
                                    .Type = tField_Type.Memo_Field
                                Case Else
                                    ' Text_Spalte 130 255
                                    .Type = tField_Type.Text_Field
                            End Select
                        Case 11 'Boolean
                            .Type = tField_Type.Boolean_Field
                        Case 2 'SmallInt
                            .Type = tField_Type.SmallInt_Field
                        Case 4 'single
                            .Type = tField_Type.single_Field
                        Case 128 'Binary
                            .Type = tField_Type.Binary_Field
                        Case Else
                            .Type = tField_Type._unknown
                    End Select
                End With
            Next i


            'Dim oledbAdapter As New OleDbDataAdapter("SELECT * FROM [" & Table & "]", cn)
            'Dim ds As New DataSet
            'Dim dt As DataTable
            'oledbAdapter.Fill(ds, "OLEDB Temp Table")
            'oledbAdapter.Dispose()

            'dt = ds.Tables(0)
            'For i = 0 To dt.Columns.Count - 1
            '    '  MsgBox(dt.Columns(i).ColumnName)
            '    Debug.WriteLine(dt.Columns(i).ColumnName & " " & _
            '                    dt.Columns(i).DataType.ToString & " " & _
            '                    dt.Columns(i).AllowDBNull & " " & _
            '                    dt.Columns(i).ExtendedProperties.ToString)
            'Next


            Return Get_Fields_Info + 1
        Finally
        End Try
    End Function

    Public Function Get_Table_Info(ByVal Table_Name As String) As DataTable
        Get_Table_Info = Nothing
        Try
            Dim DT As DataTable
            Dim Restrictions() As String = {Nothing, Nothing, Table_Name} ' "[" & Table_Name & "]"}
            DT = cn.GetSchema("COLUMNS", Restrictions)
            For Each row As DataRow In DT.Rows
                For Each col As DataColumn In DT.Columns
                    Console.WriteLine("{0} = {1}", col.ColumnName, row(col))
                Next
                '   Console.WriteLine("============================")
            Next

            Return DT
        Catch ex As Exception

        End Try
    End Function

    Public Function Get_Index_Info(ByVal Table As String) As tIndex()
        Get_Index_Info = Nothing
        Try
            Me.Close()
            '
            Const adUseClient As Integer = 3
            Const adModeShareDenyNone As Integer = 16

            Dim xDB As Object 'New ADOX.Catalog '  Object ' Database
            Dim xCN As Object 'New ADODB.Connection
            Dim CNT As Integer, i As Integer, Ret() As tIndex = Nothing
            '
            xCN = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADODB.Connection"))
            ' Server.CreateObject("ADOX.Catalog")

            '
            With xCN
                '.CursorLocation = CType(adUseClient, ADODB.CursorLocationEnum)
                mInvoke_prop(xCN, "CursorLocation", New Object() {adUseClient})
                '.Mode = CType(adModeShareDenyNone, ADODB.ConnectModeEnum)
                mInvoke_prop(xCN, "Mode", New Object() {adModeShareDenyNone})
                '.Provider = "Microsoft.Jet.OLEDB.4.0"
                mInvoke_prop(xCN, "Provider", New Object() _
                             {"Microsoft.Jet.OLEDB.4.0"})
                '.ConnectionString = "Data Source=" & mFilename & ""
                mInvoke_prop(xCN, "ConnectionString", New Object() _
                             {"Data Source=" & mFilename})
                '.Open()
                mInvoke(xCN, "Open", Nothing)
            End With
            'Create object and connect to DB...
            xDB = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADOX.Table"))
            mInvoke_prop(xDB, "ActiveConnection", New Object() {xCN})
            ''Change the name...
            'xDB.Tables(Old_Name).Name = New_Name

            'Dim xDB As New ADOX.Table
            CNT = xDB.Indexes.Count - 1
            If CNT > -1 Then
                ReDim Ret(0 To CNT)
            End If
            For i = 0 To CNT
                Ret(i) = New tIndex
                Ret(i).Name = xDB.Indexes(0).Name
                Ret(i).Target_fld = xDB.Indexes(0).Columns(0)
            Next


            xDB = Nothing
            mInvoke(xCN, "Close", Nothing)
            xCN = Nothing
            'reopen
            Me.Open(mFilename)
            '
            Application.DoEvents()
            '
            Return Ret
        Catch ex As Exception

        End Try
    End Function

    Public Function Rename_Table(ByVal Old_Name As String, ByVal New_Name As _
                                 String) As Boolean
        Rename_Table = False
        Try
            Me.Close()
            '
            Const adUseClient As Integer = 3
            Const adModeShareDenyNone As Integer = 16

            Dim xDB As Object 'New ADOX.Catalog '  Object ' Database
            Dim xCN As Object 'New ADODB.Connection
            '
            xCN = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADODB.Connection"))
            ' Server.CreateObject("ADOX.Catalog")

            '
            With xCN
                '.CursorLocation = CType(adUseClient, ADODB.CursorLocationEnum)
                mInvoke_prop(xCN, "CursorLocation", New Object() {adUseClient})
                '.Mode = CType(adModeShareDenyNone, ADODB.ConnectModeEnum)
                mInvoke_prop(xCN, "Mode", New Object() {adModeShareDenyNone})
                '.Provider = "Microsoft.Jet.OLEDB.4.0"
                mInvoke_prop(xCN, "Provider", New Object() _
                             {"Microsoft.Jet.OLEDB.4.0"})
                '.ConnectionString = "Data Source=" & mFilename & ""
                mInvoke_prop(xCN, "ConnectionString", New Object() _
                             {"Data Source=" & mFilename})
                '.Open()
                mInvoke(xCN, "Open", Nothing)
            End With
            'Create object and connect to DB...
            xDB = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADOX.Catalog"))
            ' Server.CreateObject("ADOX.Catalog")
            ' mInvoke_prop(xDB, "ActiveConnection", New Object() { _
            '           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & mFilename})
            'xDB.ActiveConnection = xCN ' "Provider=Microsoft.Jet.OLEDB.4.0;" _
            '&                              "Data(Source = " & mFilename")
            mInvoke_prop(xDB, "ActiveConnection", New Object() {xCN})
            'Change the name...

            xDB.Tables(Old_Name).Name = New_Name
            ' mInvoke_prop(xDB, "Tables(" & Old_Name & ").Name", _
            '                           New Object() {New_Name})

            'Debug.WriteLine(xDB.GetType().InvokeMember("Tables", _
            '                 Reflection.BindingFlags.GetProperty Or _
            '                 Reflection.BindingFlags.Instance Or Reflection. _
            '                 BindingFlags.[Public], Nothing, xDB, _
            '                 New Object() {Old_Name}).GetType().InvokeMember _
            '                 ("Name", Reflection.BindingFlags.SetProperty Or _
            '                 Reflection.BindingFlags.Instance Or Reflection. _
            '                 BindingFlags.[Public], Nothing, xDB, _
            '                 New Object() {New_Name}))

            '.GetType().InvokeMember("Name", _
            '            Reflection.BindingFlags.SetProperty Or _
            '            Reflection.BindingFlags.Instance Or _
            '            Reflection.BindingFlags.[Public], _
            '            Nothing, xDB, New Object() {New_Name}))


            xDB = Nothing
            'xCN.Close()
            mInvoke(xCN, "Close", Nothing)
            xCN = Nothing
            'reopen
            Me.Open(mFilename)
        Catch ex As Exception

        End Try
    End Function

    Public Function Rename_Field(ByVal Table As String, ByVal Old_Name As _
                                 String, ByVal New_Name As String) As Boolean
        Rename_Field = False
        Try
            Me.Close()
            '
            Const adUseClient As Integer = 3
            Const adModeShareDenyNone As Integer = 16

            Dim xDB As New Object 'ADOX.Catalog '   'Object '
            Dim xCN As Object 'New ADODB.Connection
            '
            xCN = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADODB.Connection"))
            ' Server.CreateObject("ADOX.Catalog")

            '
            With xCN
                '.CursorLocation = CType(adUseClient, ADODB.CursorLocationEnum)
                mInvoke_prop(xCN, "CursorLocation", New Object() {adUseClient})
                '.Mode = CType(adModeShareDenyNone, ADODB.ConnectModeEnum)
                mInvoke_prop(xCN, "Mode", New Object() {adModeShareDenyNone})
                '.Provider = "Microsoft.Jet.OLEDB.4.0"
                mInvoke_prop(xCN, "Provider", New Object() {"Microsoft.Jet." _
                                                            & "OLEDB.4.0"})
                '.ConnectionString = "Data Source=" & mFilename & ""
                mInvoke_prop(xCN, "ConnectionString", New Object() _
                             {"Data Source=" & mFilename})
                '.Open()
                mInvoke(xCN, "Open", Nothing)
            End With
            'Create object and connect to DB...
            xDB = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADOX.Catalog"))
            ' Server.CreateObject("ADOX.Catalog")
            ' mInvoke_prop(xDB, "ActiveConnection", New Object() { _
            '           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & mFilename})
            'xDB.ActiveConnection = xCN ' "Provider=Microsoft.Jet.OLEDB.4.0;" _
            '           & "Data Source= " & mFilename
            mInvoke_prop(xDB, "ActiveConnection", New Object() {xCN})
            'Change the name...

            xDB.Tables(Table).Columns(Old_Name).Name = New_Name

            xDB = Nothing
            'xCN.Close()
            mInvoke(xCN, "Close", Nothing)
            xCN = Nothing
            'reopen
            Me.Open(mFilename)
        Catch ex As Exception

        End Try
    End Function


    Public Function Drop_Field(ByVal Table As String, ByVal Field_Name As _
                               String) As Boolean
        Drop_Field = False
        Try
            Me.Close()
            '
            Const adUseClient As Integer = 3
            Const adModeShareDenyNone As Integer = 16

            Dim xDB As Object 'New  ADOX.Catalog 'ADOX.Catalog '   'Object '
            Dim xCN As Object 'New ADODB.Connection
            Dim Tbl As Object
            '
            xCN = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADODB.Connection"))
            ' Server.CreateObject("ADOX.Catalog")

            '
            With xCN
                '.CursorLocation = CType(adUseClient, ADODB.CursorLocationEnum)
                mInvoke_prop(xCN, "CursorLocation", New Object() {adUseClient})
                '.Mode = CType(adModeShareDenyNone, ADODB.ConnectModeEnum)
                mInvoke_prop(xCN, "Mode", New Object() {adModeShareDenyNone})
                '.Provider = "Microsoft.Jet.OLEDB.4.0"
                mInvoke_prop(xCN, "Provider", New Object() {"Microsoft.Jet." _
                                                            & "OLEDB.4.0"})
                '.ConnectionString = "Data Source=" & mFilename & ""
                mInvoke_prop(xCN, "ConnectionString", New Object() _
                             {"Data Source=" & mFilename})
                '.Open()
                mInvoke(xCN, "Open", Nothing)
            End With
            'Create object and connect to DB...
            xDB = Activator.CreateInstance(Type.GetTypeFromProgID _
                                           ("ADOX.Catalog"))
            ' Server.CreateObject("ADOX.Catalog")
            ' mInvoke_prop(xDB, "ActiveConnection", New Object() { _
            '           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & mFilename})
            'xDB.ActiveConnection = xCN ' "Provider=Microsoft.Jet.OLEDB.4.0;" _
            '                                   & "Data Source= " & mFilename
            mInvoke_prop(xDB, "ActiveConnection", New Object() {xCN})
            'Change the name...

            Tbl = xDB.Tables(Table)

            ' Drop the field.
            Tbl.Columns.Delete(Field_Name)
            Tbl = Nothing
            xDB = Nothing
            'xCN.Close()
            mInvoke(xCN, "Close", Nothing)
            xCN = Nothing
            'reopen
            Me.Open(mFilename)
        Catch ex As Exception

        End Try
    End Function


    Public ReadOnly Property Is_Opened() As Boolean
        Get
            Is_Opened = False
            Try
                If Not cn Is Nothing Then
                    Return True
                End If
            Catch ex As Exception

            End Try
        End Get
    End Property


    Public Function Datatable(ByVal SQL As String) As DataTable
        Datatable = New DataTable : mError = ""
        Try
            SQL = Clean_SQL(SQL)
            Dim DA As New OleDb.OleDbDataAdapter(SQL, cn)
            Datatable.Locale = System.Globalization.CultureInfo.InvariantCulture
            DA.Fill(Datatable)
            DA = Nothing
        Catch ex As Exception
            ' If Microsoft.VisualBasic.Err.Number = 5 Then
            'MessageBox.Show("Please open a database first!", "", _
            '       MessageBoxButtons.OK, MessageBoxIcon.Information)
            '  Else
            mError = ex.StackTrace & vbCrLf & ex.Message
            mSimple_Error = ex.Message
            'Debug.WriteLine(Microsoft.VisualBasic.Err.Number)
            '  End If

            Return Nothing
        End Try
    End Function

    Public Function DataAdapter(ByVal SQL As String) As OleDbDataAdapter
        mError = ""
        Try
            SQL = Clean_SQL(SQL)
            Dim DA As New OleDb.OleDbDataAdapter(SQL, cn)
            Return DA
        Catch ex As Exception
            ' If Microsoft.VisualBasic.Err.Number = 5 Then
            'MessageBox.Show("Please open a database first!", "", _
            '       MessageBoxButtons.OK, MessageBoxIcon.Information)
            '  Else
            mError = ex.StackTrace & vbCrLf & ex.Message
            mSimple_Error = ex.Message
            'Debug.WriteLine(Microsoft.VisualBasic.Err.Number)
            '  End If

            Return Nothing
        End Try
    End Function

    Private Function Clean_SQL(ByVal SQL As String) As String
        Clean_SQL = SQL
        Try
            Dim Start As Integer, Ende As Integer
            '

            Start = SQL.IndexOf("/*")
            While Start <> -1
                Ende = SQL.IndexOf("*/")
                SQL = SQL.Substring(0, Start) & " " & SQL.Substring(Ende + 2)
                Start = SQL.IndexOf("/*")
            End While
            Return SQL
        Catch ex As Exception

        End Try
    End Function

    Public Function Get_Entry(ByVal x As Object) As String
        Get_Entry = ""
        Try
            If Microsoft.VisualBasic.IsDBNull(x) Then
                Return ""
            Else
                Return x.ToString
            End If
        Catch ex As Exception

        End Try
    End Function

    Public Function Read_Single_Value(ByVal SQL As String) As String
        Read_Single_Value = "" : mError = ""
        Try
            Dim cmd As New OleDbCommand(SQL, cn)
            Dim Ret As Object
            '
            If cn Is Nothing Then Exit Function
            Ret = cmd.ExecuteScalar
            If Not Ret Is Nothing Then
                Return Ret.ToString
            End If
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Get_Record_Count(ByVal SQL As String) As Integer
        Get_Record_Count = 0 : mError = ""
        Try
            Dim mSQL As String = "SELECT COUNT(*) FROM (" & SQL & ")"
            Dim Ret As String = Me.Read_Single_Value(mSQL)
            If Microsoft.VisualBasic.IsNumeric(Ret) Then
                Return CInt(Ret)
            End If
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Delete(ByVal Where_SQL As String, _
  ByVal TableName As String) As Integer
        Delete = -1 : mError = ""
        Try
            Dim SQL As String
            SQL = "DELETE FROM " & TableName
            SQL += " " & Where_SQL

            Dim cmd As New OleDb.OleDbCommand(SQL, cn)
            Delete = cmd.ExecuteNonQuery
            cmd = Nothing
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function


    Public Overloads Function Update(ByVal Fields() As String, _
     ByVal Values() As String, _
     ByVal Where_SQL As String, _
     ByVal TableName As String) As Integer
        Update = -1 : mError = ""
        Try
            Dim SQL As String = "", i As Integer, CNT As Integer, mVal As String = ""
            SQL = "UPDATE " & TableName & " SET"

            CNT = Fields.Length - 1
            For i = 0 To CNT
                If Values(i) <> "" Then
                    If Values(i).Trim.Substring(0, 1) <> "#" AndAlso _
                        Values(i).Trim.Substring(Values(i).Trim.Length - 1, 1) _
                                                                    <> "#" Then
                        mVal = "'" & Values(i).Replace("'", "''") & "'"
                    Else
                        mVal = Values(i)
                    End If
                Else
                    mVal = "NULL"
                End If
                SQL += " [" & Fields(i) & "]=" & mVal ', "'", "''")
                If i <> CNT Then SQL += ","
            Next
            SQL = SQL & " " & Where_SQL
            Dim cmd As New OleDb.OleDbCommand(SQL, cn)
            Update = cmd.ExecuteNonQuery
            cmd = Nothing
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Execute(ByVal SQL As String) As Boolean
        Execute = False
        Try
            Dim ret As Integer, OK As Boolean
            Dim cmd As New OleDb.OleDbCommand(SQL, cn)
            '
            ret = cmd.ExecuteNonQuery
            cmd = Nothing
            If ret = 1 Then
                OK = True
            Else
                OK = False
            End If
            Return ok
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function

    Public Function Insert(ByVal Fields() As String, _
     ByVal Values() As String, ByVal TableName As String) As Integer
        Insert = -1 : mError = "" 'error
        Dim SQL As String = ""
        Try
            Dim i As Integer, CNT As Integer
            Dim aSQL As String, bSql As String, mVal As String = ""
            '
            SQL = "INSERT INTO " & TableName
            aSQL = " (" : bSql = "VALUES("
            CNT = Fields.Length - 1
            For i = 0 To CNT
                aSQL += "[" & Fields(i) & "]"
                If i <> CNT Then aSQL += ","
                If Values(i) <> "" Then
                    If Values(i).Trim.Substring(0, 1) <> "#" AndAlso _
                        Values(i).Trim.Substring(Values(i).Trim.Length - 1, 1) _
                                                                    <> "#" Then
                        mVal = "'" & Values(i).Replace("'", "''") & "'"
                    Else
                        mVal = Values(i)
                    End If
                Else
                    mVal = "NULL"
                End If
                bSql += mVal
                If i <> CNT Then bSql += ","
            Next
            aSQL += ")"
            bSql += ")"
            SQL += aSQL & bSql
            Dim cmd As New OleDb.OleDbCommand(SQL, cn)
            Insert = cmd.ExecuteNonQuery
            cmd = Nothing
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        End Try
    End Function


    Public Function CreateDatabase(ByVal DB_FullName As String, ByVal _
                                   Table_Name As String) As Boolean
        CreateDatabase = False
        Try
            'Dim Engine As Object
            Dim oParams() As Object
            Dim objJRO As Object = _
              Activator.CreateInstance(Type.GetTypeFromProgID("ADOX.Catalog"))
            '
            oParams = New Object() _
            {"Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data" _
                                            & " Source=" + DB_FullName + ";"}
            '
            objJRO.GetType().InvokeMember("Create", _
             System.Reflection.BindingFlags.InvokeMethod, _
               Nothing, objJRO, oParams)
            '
            oParams = Nothing
            objJRO = Nothing
            Me.Open(DB_FullName)
            CreateDatabase = Create_Table(Table_Name)
        Catch ex As Exception

        End Try
    End Function

    Private Function mInvoke(ByRef mObject As Object, ByVal mMethode As String, _
                                ByVal Paras() As Object) As Boolean
        mInvoke = False
        Try

            mObject.GetType().InvokeMember(mMethode, _
                System.Reflection.BindingFlags.InvokeMethod, _
                Nothing, mObject, Paras)

            Return True
        Catch ex As Exception

        End Try
    End Function

    Private Function mInvoke_prop(ByRef mObject As Object, ByVal mProperty As _
                                  String, ByVal Paras() As Object) As Boolean
        mInvoke_prop = False
        Try

            'mObject.GetType().InvokeMember(mMethode, _
            '   System.Reflection.BindingFlags.SetProperty, _
            '   Nothing, mObject, Paras)

            mObject.GetType().InvokeMember(mProperty, _
                    Reflection.BindingFlags.SetProperty Or _
                    Reflection.BindingFlags.Instance Or Reflection. _
                    BindingFlags.[Public], Nothing, mObject, Paras)


            Return True
        Catch ex As Exception

        End Try
    End Function

    Public Function Drop_Table(ByVal Table_Name As String) As Boolean
        Drop_Table = False
        Try
            Dim Ret As String
            Dim SQL As String = "drop table [" & Table_Name & "]"
            '
            Ret = Me.Read_Single_Value(SQL)

            Return True
        Catch ex As Exception

        End Try
    End Function

    Public Function Create_Table(ByVal Table_Name As String) As Boolean
        Create_Table = False
        Try
            '  Dim Cn As New Object 'ADODB.Connection
            Dim SqlSatement As String = ""
            '
            '  Cn = Activator.CreateInstance(Type.GetTypeFromProgID _
            '                               ("ADODB.Connection"))
            'Open the connection
            ' cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DB_FullName)
            'mInvoke(Cn, "Open", New Object() {"Provider=Microsoft.Jet.OLEDB.4" _
            '                               & ".0;Data Source=" & DB_FullName})
            '

            SqlSatement = "CREATE TABLE " & Table_Name & " ("
            SqlSatement += "         ID autoincrement NOT NULL  )"
            'AUTOINCREMENT PRIMARY KEY)"

            'mInvoke(Cn, "Execute", New Object() {SqlSatement})
            Me.Read_Single_Value(SqlSatement)
            'mInvoke(Cn, "Close", Nothing)
            '
            'Cn = Nothing
            '
            Return True
        Catch ex As Exception

        End Try
    End Function


    Public Function Create_Index(ByVal DB_FullName As String, ByVal Table_Name _
                         As String, ByVal Field_Name As String) As Boolean
        Create_Index = False
        Try
            Dim Cn As New Object 'ADODB.Connection
            Dim SqlSatement As String = ""
            '
            Cn = Activator.CreateInstance(Type.GetTypeFromProgID("ADODB.Connection"))
            'Open the connection
            'Cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DB_FullName)
            mInvoke(Cn, "Open", New Object() {"Provider=Microsoft.Jet.OLEDB.4.0" _
                                              & ";Data Source=" & DB_FullName})
            '

            SqlSatement = "CREATE UNIQUE INDEX  " & Field_Name & "_IDX " _
        & "ON " & Table_Name & " (" & Field_Name & ") "

            mInvoke(Cn, "Execute", New Object() {SqlSatement})
            'Cn.Execute(SqlSatement)
            mInvoke(Cn, "Close", Nothing)
            '
            Cn = Nothing
            '
            Return True


            Return True
        Catch ex As Exception

        End Try
    End Function

    Public Function Create_Field(ByVal DB_FullName As String, ByVal Table_Name _
                                 As String, ByVal Field_Name As String, _
                                 ByVal Field_Type As tField_Type) As Boolean
        Create_Field = False
        Try
            Dim Cn As New Object 'ADODB.Connection
            Dim SqlSatement As String = ""
            '
            Cn = Activator.CreateInstance(Type.GetTypeFromProgID("ADODB.Connection"))
            'Open the connection
            'Cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DB_FullName)
            mInvoke(Cn, "Open", New Object() {"Provider=Microsoft.Jet.OLEDB.4.0" _
                                              & ";Data Source=" & DB_FullName})
            '

            SqlSatement = "ALTER TABLE [" & Table_Name & "] ADD COLUMN [" _
                                                & Field_Name.Trim & "]  "
            'ALTER TABLE Employees ADD COLUMN Notes TEXT(25)
            ' autoincrement NOT NULL  )" 'AUTOINCREMENT PRIMARY KEY)"
            Select Case Field_Type
                Case tField_Type.Date_Field
                    SqlSatement += "DATE"
                Case tField_Type.Integer_Field
                    SqlSatement += "INTEGER"
                Case tField_Type.Memo_Field
                    SqlSatement += "MEMO"
                Case tField_Type.Real_Field
                    SqlSatement += "DOUBLE"
                Case tField_Type.Text_Field
                    SqlSatement += "TEXT (255)"
                    'Case tField_Type.Bool_Field
                    '    SqlSatement += "YESNO"
                Case tField_Type.Currency_Field
                    SqlSatement += "CURRENCY"
            End Select
            mInvoke(Cn, "Execute", New Object() {SqlSatement})
            'Cn.Execute(SqlSatement)
            mInvoke(Cn, "Close", Nothing)
            '
            Cn = Nothing
            '
            Return True


            Return True
        Catch ex As Exception

        End Try
    End Function

    Public Function CompactAccessDB() As Boolean
        CompactAccessDB = False : mError = ""
        Try
            Dim oParams() As Object
            Dim TempFile As String = System.IO.Path.GetTempFileName() & ".mdb"
            Dim objJRO As Object = _
              Activator.CreateInstance(Type.GetTypeFromProgID("JRO.JetEngine"))
            Dim CN_Str As String = cn.ConnectionString
            Me.Close()
            oParams = New Object() { _
                 CN_Str, _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data" & _
                " Source=" & TempFile & ";Jet OLEDB:Engine Type=5"}
            objJRO.GetType().InvokeMember("CompactDatabase", _
              System.Reflection.BindingFlags.InvokeMethod, _
                Nothing, _
                objJRO, _
                oParams)
            System.IO.File.Delete(mFilename)
            System.IO.File.Move(TempFile, mFilename)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objJRO)
            objJRO = Nothing
            Return True
        Catch ex As Exception
            mError = ex.StackTrace & vbCrLf & ex.Message
        Finally
            Try
                Open(mFilename)
            Catch : End Try
        End Try
    End Function

End Class