2016-06-05 14 views
1

Ich habe den folgenden Code, der eine Auswahl basierend auf einem Zeichenfolgenfeld und einem Datum und wenn es nichts zurückgibt dann versucht es, ein Update zu tun. Das select gibt etwas zurück, aber wenn ich ein Update mache, wird die Variable "affected" auf Null gesetzt. Könnte das an Daten liegen? Meine Datumsvariable wird auf {in britischem Format) {02/06/2016 13:10:00} gesetzt, wenn ich sie überprüfe, also hat sie eine Zeitkomponente.oledbcommand ExecuteNonQuery wird nicht aktualisiert

// DateTime Md, string ht = these are set at this point 

var conn = new OleDbConnection(); 
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyPath\\MyDb.accdb"; 
conn.Open(); 

var cmdSel = conn.CreateCommand(); 
cmdSel.CommandText = @"SELECT * FROM MyTable WHERE Md = @MD AND [email protected]"; 
cmdSel.Parameters.AddWithValue("@MD", Md); 
cmdSel.Parameters.AddWithValue("@HT", ht); 

var da = new OleDbDataAdapter(cmdSel); 
var ds = new DataSet(); 
da.Fill(ds); 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    var cmd = conn.CreateCommand(); 
    cmd.CommandText = @"UPDATE MyTable SET [email protected] WHERE Md = @MD AND [email protected]"; 
    cmd.Parameters.AddWithValue("@MD", Md); 
    cmd.Parameters.AddWithValue("@HT", ht); 
    cmd.Parameters.AddWithValue("@HS", hs); 
    var affected = cmd.ExecuteNonQuery(); 
} 
+0

Ist es Updates in Ihrem Zugriff? Wie sieht Ihr Update-Befehl nach dem Hinzufügen von Werten aus? Was sind Ihre Spaltentypen? –

+0

Sie sollten auschecken [Können wir AddWithValue() bereits beenden?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/) und beenden Sie die Verwendung von '.AddWithValue()' - es kann zu unerwarteten und überraschenden Ergebnissen führen ... –

+0

Verwenden Sie auch 'using' Anweisung, um Ihre Verbindung und Befehl automatisch zu entsorgen. –

Antwort

1

Access/OleDB verwendet keine benannten Parameter als solche, sie sind nur positionelle Platzhalter. Daher müssen Sie die Parameterwerte genau in der Reihenfolge angeben, die in SQL aufgeführt ist. Ihr Code mit den anderen empfohlenen Korrekturen wäre so etwas wie:

string sql = @"UPDATE MyTable SET [email protected] WHERE Md = @MD AND [email protected]"; 

using (OleDbConnection dbcon = new OleDbConnection(AceConnStr)) 
{ 
    // other code 
    using (OleDbCommand cmd = new OleDbCommand(sql, dbcon)) 
    { 
     // add in the same order as in SQL 
     // I have no idea that these are 
     cmd.Parameters.Add("@HS", OleDbType.VarChar).Value = Hs; 
     cmd.Parameters.Add("@MD", OleDbType.Date).Value = Md; 
     cmd.Parameters.Add("@HT", OleDbType.Integer).Value = Ht; 
     int rows = cmd.ExecuteNonQuery(); 

    } // closes and disposes of connection and command objects 
} 

Die Ergebnisse der nicht von Dingen Entsorgung der in this question gesehen werden soll, wo der Benutzer der Ressourcen lief versuchen, in einer Schleife manuell einzufügen.

Sie müssen auch keine DataAdapter (oder DataSet) erstellen, nur um eine Tabelle zu füllen "Sie können eine DataReader verwenden, um das Gleiche zu tun.

myDT.Load(cmd.ExecuteReader());