2016-08-08 94 views
2

Ich versuche, eine Tabelle von FoxPro in C# zu erhalten. Ich verwende die folgende Aussage;OleDB konnte den Dezimalwert nicht ermitteln

sqlCmd.CommandText = @"SELECT ew.ew_pplid, ew.ew_name, ew.ew_from, ew_to, ew.ew_totdays 
         FROM empwork ew 
         INNER JOIN employs emp ON ew.ew_pplid = emp.em_pplid 
         WHERE emp.em_netname NOT LIKE '' 
         AND TRIM(emp.em_netname) <> '' 
         AND emp.em_type <> 2 
         AND ew.ew_from > ?"; 
sqlCmd.Parameters.AddWithValue("pDate", Convert.ToDateTime("01/08/2016")); 

aber ich bekomme einen Fehler, den ich noch nie zuvor gesehen habe;

The Provider could not determine the Decimal value. For example, the row was just created, the default for the Decimal column was not available, and the consumer had not yet set a new Decimal value.

Hat diesen Fehler jemand zuvor gesehen, und wenn ja, wie kann ich dieses Problem umgehen?

+0

Nebenbei bemerkt bedeutet die Verwendung von TRIM() und LIKE in der Abfrage, dass es unwahrscheinlich Rushmore-optimiert und für große Datensätze langsam sein kann. –

Antwort

1

IF, wenn sie am Tag Zeit mit einer falschen Meldung Würgen, könnten Sie mit einer leichten Veränderung versuchen über

AND ew.ew_from > CTOD(?)"; 

und den Parameter als String nur das Datums

sqlCmd.Parameters.AddWithValue("pDate", "01/08/2016"); 

VFP der Befehl CTOD() bedeutet Character-To-Date, und da Sie bereits im erwarteten Monat/Tag/Jahr-Format sind, sollte durchlaufen werden.

Wenn sich der Fehler tatsächlich in einem anderen Feld befindet, z. B. "ew.totdays", könnten Sie immer zuerst die Abfrage aktualisieren, um die zurückgegebenen Felder auf einen ID-Schlüssel zu beschränken. Lassen Sie die WHERE-Klausel unverändert. Wenn es durchgeht, fügen Sie jeweils ein Feld zurück. Sie können einen NULL-Wert irgendwo in den Daten haben.

Wenn alle Felder in Ordnung sind, müssen Sie möglicherweise die Abfrage basierend auf der WHERE-Klausel und den Stripping-Kriterien jeweils einzeln anwenden, bis alle angewendet wurden.