none
同样的语句从using语句块中能执行,从transaction中就不能执行。 RRS feed

  • 问题

  •    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("失败");
                        }
                    }
                }
            }
    2010年1月21日 12:17

答案

  • 出现这种错误应该是你传进去的参数有问题 请检查下 :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
    2010年1月22日 2:04
    版主

全部回复

  • 从网上找到原因了,说是在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更好些呢?各位谁碰到过这种问题请指导一下小弟。

    2010年1月21日 12:37
  • 出现这种错误应该是你传进去的参数有问题 请检查下 :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
    2010年1月22日 2:04
    版主