Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Database Access, Compattarlo e Ripristinarlo...

Ciao a tutti,
Come da oggetto devo, finalmente (perchč ciň significa che i programmi
funzionano o_O), devo fare l'operazione di compattazione e ripristino sui
database Access che uso per VB.NET...
Volevo sapere se č presente una funzione o un comando per poter includere
questa operazione nel programma (Senza dover aprire il database da
Access...)...
Mi aiutate a trovarla?
Grazie...^_^
-- 
Alessandro Vaia,
PANGUANETA S.p.a.

 Grazie...^_^
Sub Compatta()
    On Error GoTo ErrorHandler
    Dim db As DAO.Database, vBookMark As Variant, _
      rsMSysCompactError As DAO.Recordset, strErrorTable As String, _
      rsErrorTable As DAO.Recordset, fldErrorField As DAO.Field, _
      strSQLSEL As String, strColumnValue As Variant, _
      qdTemp As QueryDef, strSQLINS As String, intLoop As Integer, _
      lngTableNameLength As Long, _
      colErrorCollection As New Collection, intErrorCount As Integer
    Set db = ** ' Qui tuo db
    ' Walk through the MSysCompactError table to find rows that reflect
    ' lost data values.
    Set rsMSysCompactError = db.OpenRecordset("SELECT * FROM
MSysCompactError WHERE ErrorRecId IS NOT NULL", dbOpenDynaset)
    intErrorCount = 0
    While Not rsMSysCompactError.EOF
        ' Get the name of the table that had column data missing.
        strErrorTable = rsMSysCompactError!ErrorTable
        ' Check to see that tablename is not greater than 48 characters
        ' to stay under 64 character tablename limit.
        lngTableNameLength = Len(strErrorTable)
        If lngTableNameLength > 48 Then
            strErrorTable = Mid(strErrorTable, 1, 48)
            ' See if this truncated table name already exists.
            On Error Resume Next
            colErrorCollection.Add strErrorTable, strErrorTable
            ' If this already exists in the collection, then there is a
            ' duplicate table name.
            If Err = 457 Then
                ' Truncate one more digit to append on the intErrorCount
                ' number to eliminate the duplicate table name.
                strErrorTable = Mid(strErrorTable, 1, 47)
                strErrorTable = strErrorTable & Mid((Str(intErrorCount)), 2,
1)
                intErrorCount = (intErrorCount + 1)
            End If
        End If
        ' Get the bookmark value of the row that had lost column data.
        vBookMark = rsMSysCompactError!ErrorRecId
        ' Open table that has lost column data.
        Set rsErrorTable = db.OpenRecordset(strErrorTable, dbOpenTable,
dbReadOnly)
        ' Move to row that has lost column data.
        rsErrorTable.Bookmark = vBookMark
        ' Start to build SQL string to call up in a table window.
        strSQLSEL = "SELECT * INTO MSysCompactError" & strErrorTable & "
FROM " & strErrorTable & " WHERE "
        strSQLINS = "INSERT INTO MSysCompactError" & strErrorTable & "
SELECT * FROM " & strErrorTable & " WHERE "
        intLoop = 0
        For Each fldErrorField In rsErrorTable.Fields
            strColumnValue = fldErrorField.Value
            ' Logic to build predicate based on various data types.
            If Not IsNull(strColumnValue) Then
                ' Can't use ordinal as no guarantee of first column
                ' being zero.
                ' Check to see if this is the first column or not to
                ' build SQL statement.
                If intLoop = 0 Then
                    If fldErrorField.Type = dbDate Then
                        strSQLSEL = strSQLSEL & "[" & fldErrorField.Name &
"] = " & "#" & strColumnValue & "#"
                        strSQLINS = strSQLINS & "[" & fldErrorField.Name &
"] = " & "#" & strColumnValue & "#"
                    Else
                        If fldErrorField.Type = dbText Or fldErrorField.Type
= dbChar Or fldErrorField.Type = dbMemo Then
                            strSQLSEL = strSQLSEL & "[" & fldErrorField.Name
& "] = " & "'" & strColumnValue & "'"
                            strSQLINS = strSQLINS & "[" & fldErrorField.Name
& "] = " & "'" & strColumnValue & "'"
                        Else
                            strSQLSEL = strSQLSEL & "[" & fldErrorField.Name
& "] = " & strColumnValue
                            strSQLINS = strSQLINS & "[" & fldErrorField.Name
& "] = " & strColumnValue
                        End If
                    End If
                Else
                    If fldErrorField.Type = dbDate Then
                        strSQLSEL = strSQLSEL & " AND " & "[" &
fldErrorField.Name & "] = " & "#" & strColumnValue & "#"
                        strSQLINS = strSQLINS & " AND " & "[" &
fldErrorField.Name & "] = " & "#" & strColumnValue & "#"
                    Else
                        If fldErrorField.Type = dbText Or fldErrorField.Type
= dbChar Or fldErrorField.Type = dbMemo Then
                            strSQLSEL = strSQLSEL & " AND " & "[" &
fldErrorField.Name & "] = " & "'" & strColumnValue & "'"
                            strSQLINS = strSQLINS & " AND " & "[" &
fldErrorField.Name & "] = " & "'" & strColumnValue & "'"
                        Else
                            strSQLSEL = strSQLSEL & " AND " & "[" &
fldErrorField.Name & "] = " & strColumnValue
                            strSQLINS = strSQLINS & " AND " & "[" &
fldErrorField.Name & "] = " & strColumnValue
                        End If
                    End If
                End If
            End If
            intLoop = (intLoop + 1)
            ' QJet limitation for maximum conditions is reached.
            If intLoop = 39 Then
                Exit For
            End If
        Next fldErrorField
        On Error Resume Next
        ' Create error table if it does not exist.
        db.Execute strSQLSEL, dbFailOnError
        If Err = 3010 Then
            On Error GoTo ErrorHandler
            ' Add rows to error table if it already exists.
            db.Execute strSQLINS, dbFailOnError
        End If
        rsErrorTable.Close
        rsMSysCompactError.MoveNext
    Wend
    rsMSysCompactError.Close
    MsgBox "Done!"
    Exit Sub
ErrorHandler:
    MsgBox "An error has occurred " & Err & " " & Error
    Resume Next

 Grazie...^_^
Ops...
Ho letto dopo che lavori con 
VB.NET
, scusami...
quello che ho mandato va bene con VB6.
Ciao,
Mattia

 Ciao,
Quello che ti dico ora, per favore, non dirlo al lupone, perchè se no
ricomincia con le sue filippiche (faccione enorme mooolto sorridente)
In 
ado.net
 almeno nel 2002, per il 2003 non so, non esiste alcun supporto
per effettuare il compattamento del db.
L'unica è utilizzare la vecchia strada, quella che hai postato tu, o la
seminuova tramite i jro
Salutoni
Sergio

 supporto per effettuare il compattamento del db.
Ci sono rimasto male, sigh...
:-(
Ciao,
Mattia

 seminuova tramite i jro
approfondimento (o meglio, ufficializzazione)
http://support.microsoft.com/default.aspx?scid=KB;en-us;306287
ciao
-- 
Fabio Angela (aka Red Angel) ICQ: 95966807
http://www.redangel.it
 : il portale sulla programmazione