Oledb Provider sperrt Dateien (Excel, Accdb)

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von BlueLagoonX.

    Oledb Provider sperrt Dateien (Excel, Accdb)

    Moin,

    beim öffnen von Excel/Access Daten sperrt mir der OledbConnector/OledbDataAdapter/Whatever die Datei solange, bis man das Programm beendet.

    VB.NET-Quellcode

    1. Dim CSB As New OleDbConnectionStringBuilder()
    2. With CSB
    3. .DataSource = File.FullName
    4. .Provider = "Microsoft.ACE.OLEDB.12.0"
    5. Select Case File.Extension.ToLower
    6. Case ".xls".ToLower
    7. .Add("Extended Properties", "Excel 8.0")
    8. Case ".xlsx".ToLower
    9. .Add("Extended Properties", "Excel 12.0")
    10. Case Else
    11. Exit Sub
    12. End Select
    13. End With
    14. Using Conn As New OleDbConnection(CSB.ConnectionString)
    15. With Conn
    16. If Not .State = ConnectionState.Open Then .Open()
    17. 'DoStuff
    18. If .State = ConnectionState.Open Then .Close()
    19. End With
    20. End Using


    Hier mal ein Beispiel für Excel Dateien, ohne den unwichtigen Code dazwischen.

    End Using sollte ja die Connection disposen und die Datei wieder freigeben, tut es aber nicht.
    Auch wenn ich vor dem End Using noch ein .Dispose() ausführe, sind die Dateien weiterhin im Zugriff.
    Das .Close am Ende der Connection hilft ebenfalls nicht.
    Bei Access Dateien behob sich das Problem, wenn ich die nächste Datei öffne. Dabei gibt der Oledb Provider anscheinend die vorherige Datei(en) wieder frei, bei Excel funktioniert dies nicht.

    Habt ihr ähnliche Erfahrungen bzw. Probleme damit gehabt und eine Lösung für mich?
    Grüße :)
    @BlueLagoonX Pack mal den ganzen Code in eine separate Klasse, mach die IDisposable und darüber ein Using.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    IDisposable hat auch nicht geholfen. In einer VM mit VS2019 läuft das Projekt so wie gewollt, die Excel Dateien werden nach dem Using geschlossen.
    Neu hinzugekommen ist zudem, dass ein anderes Programm von mir auf dem selben Computer, welches Accdb Dateien ausgibt, nach 20-28 Dateien den Dienst verweigert und jedliches Öffnen von Access Datenbanken mit "Unbekannter Fehler" unterbricht.
    Wird das Programm neu gestartet, funktioniert es wieder für 20-28 Dateien.

    Es scheint ein grundlegendes Problem mit dem Oledb Provider auf dem Computer zu geben, was sowohl installierte als auch durch VS gestartete Projekte betrifft.

    Installiert sind Office 365 Business, VS 2019, Windows 10, SQL Server 2017 Standard.
    Alles, was irgendwie mit dem Oledb Provider zusammenhängt, habe ich bereits de-und/oder neuinstalliert/repariert, ohne Erfolg.

    In der VM kann ich keinen der Fehler nachstellen.
    Wird wohl auf eine Neuinstallation hinauslaufen, oder habt ihr noch eine Idee?

    Das .ToLower habe ich mit Absicht gesetzt, damit ich nicht durch irgendwelche dummen Zufälle doch etwas Großgeschriebenes im Case stehen habe und ich dann den Fehler suchen darf.

    BlueLagoonX schrieb:

    ...
    Das .ToLower habe ich mit Absicht gesetzt, damit ich nicht durch irgendwelche dummen Zufälle doch etwas Großgeschriebenes im Case stehen habe und ich dann den Fehler suchen darf.

    Das solltest du noch mal reflektieren !
    Der zu vergleichende String ist doch schon low ...
    Select Case File.Extension.ToLower
    ... ergo, Case ".xls" ist ausreichend, noch nen .ToLower drann zu hängen ist redundant !
    Zum Testen habe ich den zwischenteil ('DoStuff) auch schon komplett weggelassen und nur die Connection wie in meinem ersten Beitrag geöffnet und geschlossen.
    Dazwischen passiert schlicht und einfach nichts, keine DataAdapter, CommandBuilder oder sonstiges.
    ConnectionString erstellen, Connection aufbauen, schließen und das wars.

    Wie gesagt, der selbe Code funktioniert in der VM problemlos, nur auf meinem PC scheint etwas nicht zu stimmen.
    Auch andere Programme von mir, welche ich seit einiger Zeit nicht angefasst habe, sperren Access/Excel Dateien und geben diese nicht mehr frei.
    Diese Programme laufen bei Kunden problemlos.

    Zum .ToLower
    Ich verstehe, was du meinst und ich gebe dir auch Recht damit :)
    @BlueLagoonX Lass mal ne vollständige Codeanalyse drüber laufen und sieh Dir an, wasser zu Dispose zu sagen hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Codeanalyse spuckt keine Meldungen zum Dispose() aus, nur Hinweise zu SqlStrings die mit Parametern verwendet werden sollen, wenn diese Benutzeringaben beinhalten können.

    Und jetzt kommts, heute lief es mal wieder. Keine Dateien gesperrt, auch nach etwa 500 Imports am Stück. Auch die anderen Programme funktionieren ohne die Fehlermeldungen der letzten Tage