2012-03-28 15 views
0

Hier ist die Geschichte:Oledb auf WCF hat einige Probleme mit großen Excel-Dateien?

Ich möchte ein Excel-Blatt in eine Datenbank importieren. Ich mache einige Vorbereitungen auf dem Client, wie die Auswahl der Datei, das richtige Blatt und die Konfiguration des Blattes.

Wenn das alles fertig ist, sende ich die Datei an meinen lokalen WCF-Server.
Dann schreibt wcf die Datei in den temporären Ordner (C: \ Windows \ Temp).
Ich erstelle eine oledb Verbindung und führe einen Count (*) Befehl auf dem Blatt, und das ist, wo es schief geht.

Der Code:

  _connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\""); 
      OleDbCommand command = new OleDbCommand("SELECT COUNT(*) FROM [" + .SheetName + "]", _connection); 
      if (_connection.State == ConnectionState.Closed) 
       _connection.Open(); 
      TotalRows = (int)command.ExecuteScalar(); 

Ja, ich bin ein hier nicht verwenden verwenden, haben nichts dagegen, dass Sie ...
Wenn (int)command.ExecuteScalar(); ausgeführt wird es schief geht.
Ich erhalte den Fehler: System resource exceeded.. Dies ist eine OleDBException.

Der Speicher meines Computers wird nicht gefüllt und es sieht so aus, als ob er nicht einmal versucht, die Datei zu lesen. Es stürzt sofort ab.

Einige Informationen über die Datei, die ich zu lesen versuchen:

  • Es hat 154k Zeilen
  • Es hat 114 Spalten
  • Die Größe 90MB ist

Wenn ich eine Teilmenge von nehmen 50k Zeilen davon stürzt es nicht ab.
Obwohl es besagt, dass TotalRows ist 2536.
Zuerst ich, obwohl die Datei beschädigt war, aber das ist nicht der Fall, da dieser exakt gleiche Code auf dem Client mit der gleichen Datei funktioniert.

Wenn ich eine Teilmenge von 2500 Reihen nehme, geht alles gut und es gibt jetzt Probleme.
Wenn ich eine Teilmenge von 2600 Zeilen nehmen (keine Rolle spielt, welche Zeilen) die Zeilenanzahl 2536.

Meine Fragen nach wie vor ist:

  • Was nicht in Ordnung ist?
  • Wer ist verantwortlich für den Fehler und die falschen Ergebnisse?
  • Warum funktioniert es auf dem Client, aber nicht auf meinem Server (selbe Maschine!)
  • Warum stürzt es nicht mit einer kleineren Datei ab?

Benötigen Sie weitere Informationen? Bitte lass ein Kommentar da.

Update 1:
Sowohl der Client als auch der Server läuft als 32-Bit-Anwendungen.

+0

Schnelle Frage; Läuft der Server im 32-Bit-Modus? während der Client im 64-Bit-Modus läuft? – Alxandr

+0

@Alxandr: Überprüfen Sie bitte mein Update. – Mixxiphoid

Antwort

2

Haben Sie das gleiche Problem. Ich versuche, Excel-Datei mit 30k Zeilen über die Website zu lesen. Aber ich nehme nur eine Teilmenge von 8007 Zeilen. Ich habe festgestellt, dass alles in Ordnung ist, wenn ich Application Pool Identity zum Administrator statt zum Netzwerkdienst ändere. Auch wenn ich meine Excel-Datei in .xls umwandelte, kann Jet Provider auch 30k-Zeilen lesen.

Dann schaue ich durch die Foren und fand das und versuche meinen Code mit ExtendedProperties Parameter IMEX = 1 und alle 30k Zeilen wurde gelesen.

+0

Das ist in der Tat das gleiche Problem, das ich habe. Ich werde Ihren Vorschlag in ein paar Tagen versuchen. – Mixxiphoid

+0

Dann schaue ich durch die Foren und fand das und versuche meinen Code mit ExtendedProperties Parameter IMEX = 1 und alle 30k Zeilen wurde gelesen. – askito