2016-09-27 5 views
1

Ich versuche, eine Access-Datenbank aus einer XML-Datei mit VB.NET und OleDB zu aktualisieren. Ich verwende den folgenden Code, kann das Update jedoch nicht ausführen. Ich bekomme keine Fehler, aber es findet keine Aktualisierung statt - es scheint, CRSID als String trotz .DbType.Int32 zu behandeln. Die Debug-Ausgabe zeigt alle korrekten Werte und eine ähnliche Methode für eine Insert-SQL funktioniert einwandfrei. Wenn ich einen Wert in CRSID fest codiere, wird die Datenbank aktualisiert, aber die Daten befinden sich in den falschen Spalten. LastName enthält CRSID und FirstName enthält LastName. Hoffe jemand kann helfen.SQL-Aktualisierung in VB.NET mit OLEDB

For Each drCurrent In dt.Rows 
      Using cmd As New OleDb.OleDbCommand With 
       { 
        .Connection = cn, 
        .CommandText = 
        <SQL> 
         Update NewPMS SET LastName = @LastName, FirstName = @Firstname WHERE CRSID = @CRSID 
        </SQL>.Value 
       } 
       cmd.Parameters.AddRange(New OleDb.OleDbParameter() _ 
        { 
         New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32}, 
         New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String}, 
         New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String} 
        } 
       ) 
       cmd.Parameters(0).Value = drCurrent("CRSID") 
       cmd.Parameters(1).Value = drCurrent("LastName") 
       cmd.Parameters(2).Value = drCurrent("FirstName") 
       cn.Open() 
       cmd.ExecuteNonQuery() 
       cn.Close() 
       cmd.Parameters.Clear() 
      End Using 
     Next  

Antwort

2

In OleDb Parameter sind positional. Sie sind nicht an ihrem Namen erkennbar. (Siehe Remarks section auf OleDbCommand.Parameters collection)

Der Parameter Platzhalter für @CRSID erscheint als die letzten in der Abfrage, aber der erste OleDbCommand.Parameter ist, benannt nach, und mit dem Wert für @CRSID gefüllt.

Dies bedeutet, dass alle Ihre Parameter für die falschen Felder oder Bedingung verwendet werden und Sie mit einer Where-Klausel völlig falsch enden. Der Befehl durchsucht das CRSID-Feld mit dem Wert von FirstName (und, ziemlich sicher, es kann keine Übereinstimmung finden).

Der richtige Code für die SQL ist

Update NewPMS SET 
    LastName = @LastName, 
    FirstName = @Firstname 
WHERE CRSID = @CRSID 

.... 

cmd.Parameters.AddRange(New OleDb.OleDbParameter() _ 
    { 
     New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String}, 
     New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String} 
     New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32}, 
    } 
) 
cmd.Parameters(0).Value = drCurrent("LastName") 
cmd.Parameters(1).Value = drCurrent("FirstName") 
cmd.Parameters(2).Value = drCurrent("CRSID") 

Als Randbemerkung, sollten Sie die Initialisierung des OleDbCommand außerhalb der Schleife bewegen, die leeren Parameter erstellen und die Verbindung öffnen. Setzen Sie innerhalb der Schleife einfach die Werte für die Parameter aus der aktuellen Zeile und führen Sie den Befehl aus. (Schließen Sie die Verbindung natürlich nicht bis zum Ende der Schleife). Diese Logik ist besser und ohne Nebenwirkungen, aber es könnte eine leicht bessere Leistung geben, wenn Sie viele Zeilen haben.

+0

Dies funktionierte perfekt. Du verdienst einen goldenen Stern! – RGold

+0

Ich bin froh, Ihnen helfen zu können. Als neuer Benutzer der Website empfehle ich zu lesen, wie funktioniert die Annahme einer Antwort (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Steve