下面的代码可以工作,但它不会在数据库中提交更改。
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();
所以我以为我忘了最后一个";"(如下所示),但这也会带来问题。有人能帮我弄清楚为什么我不能获得接受commit命令的代码吗?
cmd.CommandText = "UPDATE JCOLEMAN.IBI_TEST SET FLAG=:var2 WHERE USERNAME=:var1; commit;";
之所以会发生这种情况,是因为在Oracle中必须将BEGIN END;块来表示语句。
在这种情况下,您应该在命令中使用事务,如:
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();
问题根本不在于提交,而是使用了下面的(:var2,1)行:
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();
谢谢@Henrique把我推向了正确的方向。