积极答复者
同样的语句从using语句块中能执行,从transaction中就不能执行。

问题
-
protected void Button1_Click(object sender, EventArgs e)
{
OracleConnection conn = new OracleConnection(str_Conn);
OracleCommand cmd = conn.CreateCommand();
conn.Open();
OracleTransaction ora_Tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = ora_Tran;
try
{
cmd.CommandText = "delete from bumen where id=:id";
cmd.Parameters.AddWithValue(":id", 主键的值);
cmd.ExecuteNonQuery();
ora_Tran.Commit();
}
catch (Exception ex)
{
ora_Tran.Rollback();
throw new ApplicationException(ex.Message);
}
finally {
conn.Close();
}
}
报错:ORA-01036: 非法的变量名/编号
行 103: {
行 104: ora_Tran.Rollback();
行 105: throw new ApplicationException(ex.Message);
行 106: }
行 107: finally {
但是用以下方法就行,不知为什么
protected void Button1_Click(object sender, EventArgs e)
{
using (OracleConnection conn = new OracleConnection(str_Conn))
{
conn.Open();
using(OracleCommand cmd=new OracleCommand("delete from bumen where id=:id",conn))
{
cmd.Parameters.AddWithValue(":id", 主键的值);
if (cmd.ExecuteNonQuery() > 0)
{
Response.Write("成功");
}
else {
Response.Write("失败");
}
}
}
}- 已移动 Sheng Jiang 蒋晟Moderator 2010年1月23日 16:33 System.Data (发件人:ASP.NET 与 AJAX)
答案
-
出现这种错误应该是你传进去的参数有问题 请检查下 :id这个参数是否有可能为null 如果为null 那么参数是传不过去的
你需要在null的情况下
cmd.Parameters.AddWithValue("id", DbNull.Value);//当然这是无意义的 对于主键 但是你还是应该核实下
如果不为null
cmd.Parameters.AddWithValue("id", 主键的值);
Memory all alone in the moonlight~My Blog in .NET~~~- 已标记为答案 杜宏宇 2010年1月22日 5:46
全部回复
-
从网上找到原因了,说是在cmd.parameters.addwithvalue()之前加一句cmd.parameters.clear()就行了,可是请大家看下面的代码:
for (int i = paixu; i < tn_Parent.Count; i++)
{
cmd.CommandText = "update bumen set paixu=:paixu where id=:id";
cmd.Parameters.AddWithValue(":paixu", i);
cmd.Parameters.AddWithValue(":id", tn_Parent[i].Value.Substring(0, 32));
cmd.ExecuteNonQuery();
}
cmd.CommandText = "delete from bumen where id=:id";
cmd.Parameters.Clear();//网上说加上这句就不报错了
cmd.Parameters.AddWithValue(":id", id);
cmd.ExecuteNonQuery();
ora_Tran.Commit();
我在循环中都没加,也能过去,唯独在循环外加了一个delete的command就不行了。不知道为什么。
是不是在循环体中也加上cmd.parameters.addwithvalue更好些呢?各位谁碰到过这种问题请指导一下小弟。 -
出现这种错误应该是你传进去的参数有问题 请检查下 :id这个参数是否有可能为null 如果为null 那么参数是传不过去的
你需要在null的情况下
cmd.Parameters.AddWithValue("id", DbNull.Value);//当然这是无意义的 对于主键 但是你还是应该核实下
如果不为null
cmd.Parameters.AddWithValue("id", 主键的值);
Memory all alone in the moonlight~My Blog in .NET~~~- 已标记为答案 杜宏宇 2010年1月22日 5:46