none
以下插入数据库的代码在sql下能正常运行,到了oracle却报“无效操作。连接被关闭。”的错误。 RRS feed

  • 问题

  •                 using (OracleConnection conn = new OracleConnection(strConn))
                    {
                        if (conn.State.Equals(ConnectionState.Closed)) { conn.Open(); }
                        using (OracleCommand cmd = new OracleCommand("update t_yh set dlmm=:dlmm where id=:id"))
                        {
                            cmd.Parameters.AddWithValue(":dlmm", txt_Xmm.Text.ToString());
                            cmd.Parameters.AddWithValue(":id", int.Parse(Request.QueryString[0]));
                            if (cmd.ExecuteNonQuery() > 0)
                            {
                                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('密码更新成功!')", true);
                            }
                            else
                            {
                                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('更新失败,请联系管理员!')", true);
                            }
                        }
                    }
    如果不用using块,用以下方法写的话,就不报错。我用的是oracle9i,oracle这个东西是不是很烂很麻烦呢?我们领导非要改成oracle数据库,很郁闷呀。
       string a = txt_Xmm.Text.ToString(); int b = int.Parse(Request.QueryString[0]);
                    OracleConnection conn = new OracleConnection(strConn);
                    if (conn.State == System.Data.ConnectionState.Closed) { conn.Open(); }
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "update t_yh set dlmm='" + a + "' where id=" + b;
                    if (cmd.ExecuteNonQuery() > 0) { ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('密码更新成功!')", true); }
                    conn.Close();
    2009年5月28日 4:39

答案

  •  // Command 也需要指定 Connection         
       using (OracleConnection conn = new OracleConnection(strConn))
                {
                    if (conn.State.Equals(ConnectionState.Closed)) { conn.Open(); }
                    using (OracleCommand cmd = new OracleCommand("update t_yh set dlmm=:dlmm where id=:id"))
                    {
        cmd.Connection = conn; // Command 也需要指定 Connection
                        cmd.Parameters.AddWithValue(":dlmm", txt_Xmm.Text.ToString());
                        cmd.Parameters.AddWithValue(":id", int.Parse(Request.QueryString[0]));
        
                        if (cmd.ExecuteNonQuery() > 0)
                        {
                            ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('密码更新成功!')", true);
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('更新失败,请联系管理员!')", true);
                        }
                    }
                }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 杜宏宇 2009年5月28日 5:03
    2009年5月28日 4:56
    版主
  • 在.NET中,只要提供了Oracle的Provider的话,操作方法是一样的,就是语句有点不同,不过大部分应该差不多。

    另外来说,如果用using的话,在这段代码后面就隐式的关闭了连接,这个你要自己检查一下了。
    低调,低调
    哈哈,书出了,可以点这里购买哦。。
    • 已标记为答案 杜宏宇 2009年5月28日 5:03
    2009年5月28日 4:59
    版主

全部回复

  •  // Command 也需要指定 Connection         
       using (OracleConnection conn = new OracleConnection(strConn))
                {
                    if (conn.State.Equals(ConnectionState.Closed)) { conn.Open(); }
                    using (OracleCommand cmd = new OracleCommand("update t_yh set dlmm=:dlmm where id=:id"))
                    {
        cmd.Connection = conn; // Command 也需要指定 Connection
                        cmd.Parameters.AddWithValue(":dlmm", txt_Xmm.Text.ToString());
                        cmd.Parameters.AddWithValue(":id", int.Parse(Request.QueryString[0]));
        
                        if (cmd.ExecuteNonQuery() > 0)
                        {
                            ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('密码更新成功!')", true);
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this.Page, typeof(Page), "", "alert('更新失败,请联系管理员!')", true);
                        }
                    }
                }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 杜宏宇 2009年5月28日 5:03
    2009年5月28日 4:56
    版主
  • 在.NET中,只要提供了Oracle的Provider的话,操作方法是一样的,就是语句有点不同,不过大部分应该差不多。

    另外来说,如果用using的话,在这段代码后面就隐式的关闭了连接,这个你要自己检查一下了。
    低调,低调
    哈哈,书出了,可以点这里购买哦。。
    • 已标记为答案 杜宏宇 2009年5月28日 5:03
    2009年5月28日 4:59
    版主
  • 谢谢,原来是没有指定command对应的connection
    哎,看来不是oracle的问题,是我的问题。水平不行啊。
    2009年5月28日 5:05
  • 人忙了有时是这样的,正常正常~~
    知识改变命运,奋斗成就人生!
    2009年5月28日 5:05
    版主