2009-06-17 7 views
4

Ich arbeite an einem SharePoint-Workflow, und der erste Schritt erfordert, dass ich eine Excel-Arbeitsmappe öffne und zwei Dinge lese: eine Reihe von Kategorien (aus einem Bereich mit dem Namen Categories) und einem Kategorieindex (in der benannten Bereich CategoryIndex). Categories ist eine Liste von etwa 100 Zellen, und CategoryIndex ist eine einzelne Zelle.Warum funktioniert eine ADO.NET Excel-Abfrage und eine andere nicht?

ich ADO.NET bin mit der Arbeitsmappe zur Abfrage

string connectionString = 
    "Provider=Microsoft.ACE.OLEDB.12.0;" + 
    "Data Source=" + temporaryFileName + ";" + 
    "Extended Properties=\"Excel 12.0 Xml;HDR=YES\""; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

OleDbCommand categoryIndexCommand = new OleDbCommand(); 
categoryIndexCommand.Connection = connection; 
categoryIndexCommand.CommandText = "Select * From CategoryIndex"; 

OleDbDataReader indexReader = categoryIndexCommand.ExecuteReader(); 
if (!indexReader.Read()) 
    throw new Exception("No category selected."); 
object indexValue = indexReader[0]; 
int categoryIndex; 
if (!int.TryParse(indexValue.ToString(), out categoryIndex)) 
    throw new Exception("Invalid category manager selected"); 

OleDbCommand selectCommand = new OleDbCommand(); 
selectCommand.Connection = connection; 
selectCommand.CommandText = "SELECT * FROM Categories"; 
OleDbDataReader reader = selectCommand.ExecuteReader(); 

if (!reader.HasRows || categoryIndex >= reader.RecordsAffected) 
    throw new Exception("Invalid category/category manager selected."); 

connection.Close(); 

Sie den Code nicht beurteilen, selbst zu hart; es hat viel durchgemacht. Wie auch immer, der erste Befehl wird nie korrekt ausgeführt. Es wird keine Ausnahme ausgelöst. Es gibt nur einen leeren Datensatz zurück. (HasRows ist true, und Read() gibt false zurück, aber es gibt keine Daten dort) Der zweite Befehl funktioniert tadellos. Dies sind beide benannte Bereiche.

Sie sind jedoch unterschiedlich bevölkert. Es gibt einen Web-Service-Anruf, der Categories füllt. Diese Werte werden in einer Dropdown-Box angezeigt. Der ausgewählte Index geht in CategoryIndex. Nach stundenlangem Kopfschütteln habe ich beschlossen, ein paar Codezeilen zu schreiben, so dass der Wert des Drop-downs in eine andere Zelle geht. Dann kopiere ich den Wert mit ein paar Zeilen C# in CategoryIndex, damit die Daten identisch gesetzt werden . Das stellte sich als eine Sackgasse heraus.

Fehle ich etwas? Warum funktioniert eine Abfrage einwandfrei und die andere gibt keine Daten zurück?

Antwort

2

Ich habe das Problem gefunden. Excel konnte den Wert in der Zelle offenbar nicht analysieren, also gab es nichts zurück. Was ich tun musste, war die Verbindungszeichenfolge an folgenden einstellen:

string connectionString = 
    "Provider=Microsoft.ACE.OLEDB.12.0;" + 
    "Data Source=" + temporaryFileName + ";" + 
    "Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\""; 

Es wäre hilfreich gewesen, wenn es eine Ausnahme oder gegeben geworfen hätte jeden Hinweis darauf, warum es versagt, aber das ist nebensächlich jetzt. Die Option IMEX=1 weist Excel an, alle Werte nur als Zeichenfolgen zu behandeln. Ich bin durchaus in der Lage, meine eigenen Zahlen zu analysieren, vor allem Excel, also brauchte ich seine Hilfe nicht.

Verwandte Themen