2012-04-09 8 views
2

Ich habe ein wirklich seltsames Problem mit ADOX Interop.Kann Access-Datenbank mit ADOX nicht erstellen

Ich habe diesen Code:

 try 
     { 
      if (File.Exists(path)) 
       File.Delete(path); 

      var cat = new CatalogClass(); 
      cat.Create("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = d:\\Test.mdb; Jet OLEDB:Engine Type=5"); 

      Marshal.ReleaseComObject(cat); 
      cat = null; 
      GC.Collect(); 
     } 
     catch (FileNotFoundException e) 
     { 
      throw new FileNotFoundException("El archivo no se encuentra", e); 
     } 
     catch (COMException e) 
     { 
      throw new COMException(connStr + e.Message); 
     } 
     catch (Exception e) 
     { 
      throw new Exception(connStr, e); 
     } 

Der Code wird in der cat.Create() Linie versagt. Was wirklich komisch ist, ist, dass es auf meinem lokalen Entwickler-Rechner funktioniert, aber auf dem Produktions-Server nicht ... Es ist kein Schreibberechtigungs-Problem, weil ich versucht habe, eine zufällige Datei vor der Problem-Zeile zu erstellen und zu arbeiten perfekt. Die COMException Nachricht ist nur "Nicht angegeben Fehler" HResult: -2147467259

Das Server OS ist Windows 2008 32 Bit. Ich denke, es ist ein Serverkonfigurationsproblem, aber können Sie mir etwas Licht geben? Ich weiß nicht, was ich sonst noch tun kann ...

+0

Ist Ihr Zielserver eine x64-Maschine? Sind Sie auf Ihre Anwendung für AnyCPU ausgerichtet? – Steve

+0

Ich peile für AnyCPU –

+0

Haben Sie die gleiche Version von ADOX in beiden Computern? – Steve

Antwort

3

Wenn Sie Ihre Anwendung auf einer 64-Bit-Maschine bereitstellen, könnte Ihr Code ADOX nicht über JET.OleDB.4.0
verwenden. Wenn dies der Fall ist, Eine schnelle Lösung könnte sein, Ihre Zielarchitektur auf x86 zu ändern.

Andernfalls könnten Sie versuchen, die 64-Bit-Version der Microsoft Access Database Engine Treiber auf dem Zielcomputer herunterzuladen und zu installieren, aber ich weiß nicht, ob sie ADOX unterstützen. Sie müssen auch Ihre Verbindungszeichenfolge ändern

+0

Das Server-Betriebssystem ist ein Windows 2008 32bits –

+0

Dies könnte nicht die richtige Antwort sein, habe ich gelöscht und dann gelöscht nach dem Lesen [dieser Beitrag] (http://meta.stackexchange.com/questions/37738/when-or-should -you-delete-your-incorrect-antwort) auf META SO. – Steve

+0

Sie haben meinen Tag gerettet –

1

Sehen Sie, ob Sie ADOX Catalog außerhalb Ihres C# -Codes verwenden können. Wenn Access installiert ist, versuchen Sie es mit Access VBA, wie von Steve vorgeschlagen. Wenn Office nicht installiert ist, versuchen Sie es mit VBScript.

Dieser funktioniert auf meinem 32-Bit-Windows 7. Auf 64-Bit-Windows 7 schlägt es mit einem Fehler über "Klasse nicht registriert" fehl. Ich weiß, dass das nicht deine Situation ist, da du gesagt hast, dein Server sei 32 Bit (als Antwort auf eine Antwort, die seitdem gelöscht wurde). Allerdings hoffe ich, dass das Skript entweder erfolgreich sein wird oder Ihnen eine informativere Fehlermeldung als die C# -Fehlerbedingung liefert.

'Const cPath = "C:\Users\hans\Documents\Test.mdb" 
Const cPath = "d:\Test.mdb" 
Dim objCat 
Dim strConnect 
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=" & cPath & ";Jet OLEDB:Engine Type=5" 
WScript.Echo strConnect 

Set objCat = CreateObject("ADOX.Catalog") 
objCat.Create strConnect 
Set objCat = Nothing 

Ich nannte diese Datei AdoxCreateDb.vbs und lief es mit cscript aus einem Fenster der Eingabeaufforderung.

cscript AdoxCreateDb.vbs 
+0

Danke Mann. Ich werde es versuchen, wenn ich die Chance dazu habe. Seltsamerweise an diesem Morgen funktioniert alles gut, ohne etwas zu ändern ... –