2016-04-04 61 views
0

次のコードは機能しますが、データベースの変更をコミットしません。C#SQLコマンドが正しく終了していません

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(); 

は、私は以下のスニペットにコードを変更し、エラー

追加情報を取得:ORA-00933:正常に終了していないSQLコマンドを

コード:

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(); 

私は最後の ";"を忘れてしまったと思ったがmsでも。誰も私がなぜコミットコマンドを受け入れるコードを取得できないのか理解できますか?

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

[OleDbTransaction](https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbtransaction(v = vs.110).aspx)を直接使用するのではなく、テキストとして「コミット」?また、これがoracleの場合は、問題を引き起こしている可能性のあるOleDbオブジェクトの代わりに、Oracle固有のADO.NET dbオブジェクトを使用する方が良いかもしれません。 – Igor

+0

私は[Oracle Data Provider for .NET](http://www.oracle.com/technetwork/topics/dotnet/index-085163.html)のようなOracle固有のado.netライブラリを使用します.NuGet install = 'Install- Oracle.ManagedDataAccess'をパッケージ化します。これはおそらく、コマンドをOleよりも適切なOracleプラットフォーム構文に変換する方が良いでしょう。 – Igor

+1

私はOleDbが名前付きパラメータを使用していないと考えました。つまり、パラメータはインデックス順でなければなりません。 2つのパラメータ行を切り替えてみてください。 – LarsTech

答えて

1

これは、OracleではBEGIN ENDを指定する必要があるためです。ステートメントを表すブロック。

あなたはあなたのようなコマンドでトランザクションを使用する必要があります。この場合

:以下:(var2,1)ライン問題は全くコミットしていなかった

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

トランザクションをコミットする前に接続を本当に終了しますか? – Namrehs

+0

私はCommit()ステートメントをcnn.Close()の上に移動しなければなりませんでした。 @Henriqueが休憩を取らないと述べたので、変更はコミットされなかった。私は一歩近づいて、私は探し続け、他に何があるかを見ていきます。私は完全な答えを受け入れるまでポーズをとっておきましょう。 – Darw1n34

+1

申し訳ありませんが、接続を閉じる前にコミットする必要があります。 – Henrique

0

、それは使用していました:

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

私はそれを削除し、変数をハードコードフラグ '1'に置き換えて、チャームのように機能しました!

今後の参考として、以下のコードをそのまま使用できます。

   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(); 

ありがとうございます@正しい方向に私を押してくれてありがとうございます。

関連する問題