2016-04-04 22 views
0

Der folgende Code funktioniert, jedoch wird die Änderung in der Datenbank nicht festgeschrieben.C# SQL-Befehl nicht ordnungsgemäß beendet

cnn.Open(); 
OleDbCommand cmd = cnn.CreateCommand(); 

cmd.Parameters.Add(new OleDbParameter(":var1", ds.Tables[0].Rows[i]["USERNAME"].ToString())); 
cmd.Parameters.Add(new OleDbParameter(":var2","1")); 
cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=:var2 WHERE USERNAME=:var1"; 
cmd.ExecuteNonQuery(); 
cmd.Parameters.Clear(); 
cnn.Close(); 

änderte ich den Code an das Snippet unten und erhalten den Fehler

Zusätzliche Informationen: ORA-00933: SQL-Befehl beendet nicht richtig

Code:

cnn.Open(); 
OleDbCommand cmd = cnn.CreateCommand(); 

cmd.Parameters.Add(new OleDbParameter(":var1", ds.Tables[0].Rows[i]["USERNAME"].ToString())); 
cmd.Parameters.Add(new OleDbParameter(":var2","1")); 
cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=:var2 WHERE USERNAME=:var1; commit"; 
cmd.ExecuteNonQuery(); 
cmd.Parameters.Clear(); 
cnn.Close(); 

Also dachte ich, ich vergaß das letzte ";" (wie unten zu sehen), aber das verursacht proble ms auch. Kann mir jemand helfen herauszufinden, warum ich den Code nicht dazu bringen kann, den Commit-Befehl zu akzeptieren?

cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=:var2 WHERE USERNAME=:var1; commit;"; 
+0

Haben Sie versucht, eine [OleDbTransaction] (https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbtransaction (v = vs.110) .aspx) direkt anstelle der Anhängen der 'commit' als Text? Wenn dies Oracle ist, ist es möglicherweise besser, ein Oracle-spezifisches ADO.NET-db-Objekt anstelle des OleDb-Objekts zu verwenden, das möglicherweise das Problem verursacht. – Igor

+0

Ich würde eine Oracle-spezifische ado.net-Bibliothek wie [Oracle Data Provider für .NET] (http://www.oracle.com/technetwork/topics/dotnet/index-085163.html), NuGet install = 'Install- Paket Oracle.ManagedDataAccess'. Dies würde Ihre Befehle wahrscheinlich besser in eine geeignete Oracle-Plattformsyntax als Ole übersetzen. – Igor

+1

Ich dachte, dass OleDb benannte Parameter nicht verwendet hat, was bedeutet, dass die Parameter in der Indexreihenfolge sein müssen. Versuchen Sie, die zwei Parameterzeilen umzuschalten. – LarsTech

Antwort

1

Dies passiert, weil Sie in Oracle müssen Sie BEGIN END; Blöcke zur Darstellung einer Aussage.

In diesem Fall können Sie wie eine Transaktion in Ihrem Befehl verwenden sollen:

cnn.Open(); 
OleDbTransaction transaction = cnn.BeginTransaction(); 
OleDbCommand cmd = cnn.CreateCommand(); 
cmd.Transaction = transaction; 

cmd.Parameters.Add(new OleDbParameter(":var1", ds.Tables[0].Rows[i]["USERNAME"].ToString())); 
cmd.Parameters.Add(new OleDbParameter(":var2","1")); 
cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=:var2 WHERE USERNAME=:var1"; 
cmd.ExecuteNonQuery(); 
cmd.Parameters.Clear(); 
transaction.Commit(); 
cnn.Close(); 
+1

Schließen Sie wirklich die Verbindung, bevor Sie die Transaktion durchführen? – Namrehs

+0

Ich musste die Commit() Anweisung über die cnn.Close() verschieben; wie @Henrique erklärte, keine Pause zu haben, jedoch wurde die Änderung nicht begangen. Ich bin einen Schritt näher, ich werde weiter schauen und sehen, was es sonst noch gibt. Fühlen Sie sich frei, weiter zu posieren, bis ich eine vollständige Antwort akzeptiere. – Darw1n34

+1

Es tut mir leid, Sie müssen vor dem Schließen der Verbindung bestätigen. – Henrique

0

Das Problem war nicht mit der überhaupt begeht, ist es mit der Verwendung der war: unter (var2,1) -Leitung :

cmd.Parameters.Add(new OleDbParameter(":var2","1")); 

Ich entfernte es, ersetzte die Variable mit der fest codierten Flagge '1' und es funktionierte wie ein Charme!

Für zukünftige Referenz funktioniert der Code unten jetzt.

   cnn.Open(); 
       OleDbTransaction transaction = cnn.BeginTransaction(); 
       OleDbCommand cmd = cnn.CreateCommand(); 
       cmd.Transaction = transaction; 

       cmd.Parameters.Add(new OleDbParameter(":var1", ds.Tables[0].Rows[i]["USERNAME"].ToString())); 
       cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=1 WHERE USERNAME=:var1"; 
       cmd.ExecuteNonQuery(); 
       cmd.Parameters.Clear(); 
       transaction.Commit(); 
       cnn.Close(); 

Vielen Dank @Henrique für mich in die richtige Richtung zu drücken.