0

戻りパラメータを 2 番目のドロップダウン リストに渡す際に問題が発生しました。2 番目のリストは、最初のリストからの選択に完全に依存しています。SPは大丈夫だと思います。繰り返しますが、私の問題は値を渡すことです。

ストアド プロシージャ

  PROCEDURE ev_dropdown(
      cur_out    IN OUT   eqpack.t_cur_out,
      p_result   OUT      VARCHAR2,
      p_reference_id  IN NUMBER
   )

   IS
   BEGIN
      OPEN cur_out FOR

         SELECT ev_id, ev


           FROM event WHERE a_ref = p_reference_id;



   EXCEPTION
      WHEN OTHERS
      THEN
         p_result :=
                   'An error occurred in get_events_dropdown - ' || SQLERRM;

   END ev_dropdown;

.cs

 public void populateSpecificEv(int p)
        {

            DataTable dtRef = CreateReferenceDT();
            string conn = GetConnectString();
            using (OracleConnection connection = new OracleConnection(conn))
            using (OracleCommand command = connection.CreateCommand())
            {
                command.CommandText = "eqpackage.get_events_dropdown";
                command.CommandType = CommandType.StoredProcedure;

                command.Parameters["p_reference_id"].Value = p;

                OracleDataReader reader;
                reader = command.ExecuteReader();

                dtRef.Rows.Add("0", "-select-");


                while (reader.Read())
                {

                    dtRef.Rows.Add(reader[0], reader[1]);

                }

                connection.Open();
                command.ExecuteNonQuery();

                command.Connection.Close();
                command.Connection.Dispose();
                return dtRef; //Error -returns void, a return keyword must not be followed by an object expression  


            }
          }

        DataTable CreateReferenceDT()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("name", typeof(string));

            return dt;

        }

aspx.cs

protected void ddlSys_SelectedIndexChanged1(object sender, EventArgs e)
{

    int p = int.Parse(ddlSystems.SelectedItem.Value);
    dbase.populateSpecificEvent(p);

    DataTable dt1 = dbase.PopulateEvDropDown();
    ddlEv.DataSource = dt1;
    ddlEv.DataTextField = "name";
    ddlEv.DataValueField = "id";
    ddlEv.DataBind();

}
4

1 に答える 1

0

ストアド プロシージャを更新して、独自のカーソルを明示的に作成せずに実際に SELECT ステートメントを実行する必要があると思います。次に、 command.ExecuteQuery()を呼び出します(これを行っていることがわかります)。これは、基本的に前方専用で読み取り専用のカーソルであるIDataReaderを返します。

次の余分な行を削除します。

connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();
command.Connection.Dispose(); 

ストアド プロシージャを実際に select ステートメントに変更する場合は、while(reader.Read())ループを使用して行を 1 つずつ読み込み、に挿入するDataTableか、単にDataTable.Load(IDataReader)を呼び出すことができます。

于 2012-06-22T20:25:26.353 に答える