Hallo Leute,
ich hole mit via OLEDB ein DataSet aus Excel, das funktioniert soweit. Das erledige ich so:
public static DataSet GetExcelDataSet(string excelFile, string[] sheets, bool hasHeaders)
{
DataSet ds = new DataSet();
using (OleDbConnection con = new OleDbConnection(ConnectionString(excelFile, hasHeaders)))
{
con.Open();
foreach (string sheet in sheets)
{
string tableName = sheet + "$";
string sql = "SELECT * FROM [" + tableName + "]";
OleDbDataAdapter adap = new OleDbDataAdapter(sql, con);
adap.Fill(ds, sheet);
}
}
return ds;
}
Der ConnectionString setzt sich so zusammen:
private static string ConnectionString(string file, Boolean hasHeaders)
{
string conString = "Data Source=" + file + ";Provider=Microsoft.ACE.OLEDB.12.0;";
if (hasHeaders)
conString += @"Extended Properties=""Excel 12.0;HDR=Yes;IMEX=0""";
else
conString += @"Extended Properties=""Excel 12.0;HDR=No;IMEX=0""";
return conString;
}
Die eingelesenen Tabellen enthalten Felder vom Type Double, mit 14 Nachkommastellen. Damit war ich bisher auch einverstanden. Nun zu meinem Problem: Ich möchte bestimmte Zellen updaten, das wollte ich so machen:
public static void UpdateExcelFile(string file, string sheet, double rTime, string sub)
{
string rt = rTime.ToString().Replace(",", ".");
using (OleDbConnection myConnection = new OleDbConnection(ConnectionString(file, true)))
{
string sql = "Update [" + sheet + "$] set Stoff = '" + sub + "' where RetTime=" + rt;
OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(sql, myConnection);
myConnection.Open();
myCommand.ExecuteNonQuery();
}
}
So funktioniert es nicht, das war und ist mir unerklärlich. Ich habe dann die Excel-Tabelle unter die Lupe genommen und festgestellt, das in dieser nur 9 Nachkommastellen angezeigt werden. Erst wenn man die Zelle in den Bearbeitungsmodus versetzt werden 14 Nachkommas angezeigt. Nun vermute ich, das bei dem Update 9 gegen 14 Nachkommastellen verglichen werden und daher kein Update erfolgt, weil kein Treffer.
Hat jemand eine Erklärung dafür und kann mir sagen was ich anders machen könnte? Auf die schnelle habe ich mir erstmal so geholfen:
rTime = Math.Round(rTime, 5)
string sql = "Update [" + sheet + "$] set Stoff = '" + sub + "' where ROUND(RetTime,5)=" + rt;
Wirklich glücklich macht mich das aber nicht.....
Gruß
Christoph
string rt = rTime.ToString().Replace(",", ".");
🤔
sagt Dir CultureInfo
nichts?
Jedenfalls verwendet Double.ToString
standardmäßig das NumberFormat "G". Du willst aber wahrscheinlich gegen "R" testen.
string rt = rTime.ToString("R", CultureInfo.InvariantCulture);
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Super, danke für die schnelle Antwort! Ich werde es morgen mit der Culture versuchen! Ich hätte nicht gedacht das es damit zusammenhängen kann, da ich ja beim konsumieren und updaten die selbe Technik verwende.
Gruß
Christoph
[FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler kann natürlich auch eine Rolle spielen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich habe heute noch mal getestet. Das Update funktioniert nur mit dem "G" Format, sonst gibt es eine Exception dass das Format ungültig ist und ich muss immer auf 9 Nachkommastellen ruden, sonst geht es auch nicht. Beim lesen und updaten liegt demnach der selbe Effekt vor wie in der offenen Excel-Tabelle. So lange die Zelle nur angezeigt wird sind es 9 Nachkommastellen, erst wenn die Zelle im Bearbeitungsmodus ist sind es 14.
Den Workaround mit dem Runden werde ich nun beibehalten, ich denke es sollte relativ sicher sein das beim Runden auf 5 Nachkommastellen immer eine Übereinstimmung vorliegt.
Vielleicht versuche ich am Montag noch mal einen verschachtelten Zugriff ala:
UPDATE Excel WHERE (SELECT * FROM Excel.....) = 'was aus dem Sheet mit 14 NKS'
Gruß
Christoph