Laden...

Excel via OLEDB Updaten

Erstellt von Christoph1972 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.957 Views
Christoph1972 Themenstarter:in
212 Beiträge seit 2008
vor 10 Jahren
Excel via OLEDB Updaten

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

16.842 Beiträge seit 2008
vor 10 Jahren
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);

Christoph1972 Themenstarter:in
212 Beiträge seit 2008
vor 10 Jahren

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

16.842 Beiträge seit 2008
vor 10 Jahren

[FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler kann natürlich auch eine Rolle spielen.

Christoph1972 Themenstarter:in
212 Beiträge seit 2008
vor 10 Jahren

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