1

リーダーを割り当てようとすると、C# で例外がスローされます。

Invalid operation. The connection is closed

内部に平均値を持つ単一のセルを返すクエリから結果を取得しようとしています。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);
            }
4

2 に答える 2

3

接続を開く必要があり、sql-parameters も使用する必要があります。テストできないため、これが正しいオラクル構文であることを願っています。

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 (var cm = new OracleCommand("select round(avg(rating),1)As AvgRating from rates where id_rec = @id", con))
{
    cm.Parameters.AddWithValue("@id", id);
    object avgRating = cm.ExecuteScalar();
    if (!(avgRating is DBNull))
    {
        textBox5.Text = avgRating.ToString();
    }
}
于 2013-06-12T10:21:37.580 に答える
1

`OracleCommand'を使用する場合、有効なOracleConnectionオブジェクトをそれに関連付ける必要があります。

  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);
                    }
   }

この助けを願っています。

ありがとう。

于 2013-06-12T10:24:37.663 に答える