C# OracleDataReader出错。错误:操作无效。连接已关闭

C# OracleDataReader出错。错误:操作无效。连接已关闭,c#,winforms,oracle,C#,Winforms,Oracle,当我尝试分配读卡器时,C抛出一个异常: 无效操作。连接已关闭 我试图从一个查询中得到一个结果,该查询返回一个单元格,其中包含一个平均值。 cmd是一个oraclecomand,我用它在表中插入一行,到目前为止还不错。我在旁边看到消息框,然后出现异常 try { cmd.ExecuteNonQuery(); MessageBox.Show("Recipe Rated");

当我尝试分配读卡器时,C抛出一个异常:

无效操作。连接已关闭

我试图从一个查询中得到一个结果,该查询返回一个单元格,其中包含一个平均值。 cmd是一个oraclecomand,我用它在表中插入一行,到目前为止还不错。我在旁边看到消息框,然后出现异常

          try
            {
                cmd.ExecuteNonQuery();
                MessageBox.Show("Recipe Rated");
                OracleCommand cm = new OracleCommand("select round(avg(rating),1) from rates where id_rec = "+id);
                OracleDataReader reader = cm.ExecuteReader();
                reader.Read();
                textBox5.Text =""+reader.GetInt16(0);
            }

您应该打开连接,还应该使用sql参数。希望这是正确的oracle语法,因为我无法测试它:

using(var con = new OracleConnection("ConnectionString Here"))
using(var cmd = new OracleCommand("ADD YOUR INSERT/UPDATE/DELETE", con))
{
    con.Open();
    cmd.ExecuteNonQuery();
    using (var cm = new OracleCommand("select round(avg(rating),1)As AvgRating from rates where id_rec = @id", con))
    {
        cm.Parameters.AddWithValue("@id", id);
        using (var reader = cm.ExecuteReader())
        {
            if (reader.Read())
            {
                textBox5.Text = reader.GetInt16(0).ToString();
            }
        }
    }
}
注意,我使用了using语句来确保尽快释放所有非托管资源。即使出现错误,它也会关闭连接

编辑:由于您只选择了一个值,我建议使用ExecuteScalar:


您应该打开连接,还应该使用sql参数。希望这是正确的oracle语法,因为我无法测试它:

using(var con = new OracleConnection("ConnectionString Here"))
using(var cmd = new OracleCommand("ADD YOUR INSERT/UPDATE/DELETE", con))
{
    con.Open();
    cmd.ExecuteNonQuery();
    using (var cm = new OracleCommand("select round(avg(rating),1)As AvgRating from rates where id_rec = @id", con))
    {
        cm.Parameters.AddWithValue("@id", id);
        using (var reader = cm.ExecuteReader())
        {
            if (reader.Read())
            {
                textBox5.Text = reader.GetInt16(0).ToString();
            }
        }
    }
}
注意,我使用了using语句来确保尽快释放所有非托管资源。即使出现错误,它也会关闭连接

编辑:由于您只选择了一个值,我建议使用ExecuteScalar:

使用时,必须将有效对象与之关联

  using (OracleConnection connection = new OracleConnection(connectionString))
    {
                   MessageBox.Show("Recipe Rated");
                   OracleCommand cm = new OracleCommand("select round(avg(rating),1) from rates where id_rec = "+id);
                   try
                    {

                        cm.Connection = connection;
                        connection.Open(); //oracle connection object
                        OracleDataReader reader = cm.ExecuteReader();
                        reader.Read();
                        textBox5.Text =""+reader.GetInt16(0);
                    }
   }
希望这有帮助

谢谢。

使用时,必须将有效对象与之关联

  using (OracleConnection connection = new OracleConnection(connectionString))
    {
                   MessageBox.Show("Recipe Rated");
                   OracleCommand cm = new OracleCommand("select round(avg(rating),1) from rates where id_rec = "+id);
                   try
                    {

                        cm.Connection = connection;
                        connection.Open(); //oracle connection object
                        OracleDataReader reader = cm.ExecuteReader();
                        reader.Read();
                        textBox5.Text =""+reader.GetInt16(0);
                    }
   }
希望这有帮助


谢谢。

你说得对。我忘了在cm的构造函数中添加连接。谢谢你的快速回答,你是对的。我忘了在cm的构造函数中添加连接。谢谢你的快速回答