Руководство по работе с БД Firebird с использованием библиотеки ADO .Net 2.0

Вызов хранимых процедур


Существуют два способа обработки результатов хранимых процедур:

  • хранимая процедура возвращает результирующее множество
  • результат выполнения хранимой процедуры помещается в OUT параметры команды
  • Для первого способа используется обычная SQL-инструкция:

    select * from stored_procedure_name(…)

    Результат её выполнения обрабатывается при помощи объекта OleDbDataReader:

    public void StoredProcedureResultSetTest() { OleDbConnection con = ConnectionProvider.CreateConnection(); con.Open(); OleDbTransaction trans = con.BeginTransaction();

    //select stored procedure in params OleDbCommand cmd_in_params = new OleDbCommand("select cust_no from CUSTOMER", con, trans);

    //select mail label through the stored procedure

    OleDbCommand cmd_stored_proc = new OleDbCommand("select * from mail_label(:cust_no)", con, trans);

    //add one IN parameter cmd_stored_proc.Parameters.Add("cust_no", OleDbType.Integer);

    //execure reader

    using (OleDbDataReader rdr = cmd_in_params.ExecuteReader(CommandBehavior.CloseConnection)) { //for each customer No while (rdr.Read()) { cmd_stored_proc.Parameters["cust_no"].Value = rdr["cust_no"]; using (OleDbDataReader rdr_out = cmd_stored_proc.ExecuteReader()) { Console.WriteLine("Customer №" + rdr["cust_no"]); while (rdr_out.Read()) for (int i = 0; i < rdr_out.FieldCount; i++) Console.WriteLine(rdr_out.GetName(i) + "=" + rdr_out[i]);

    Console.WriteLine(); }



    }

    } }

    Второй способ – вызов хранимой процедуры через инструкцию:

    execute procedure stored_procedure_name

    Результат выполнения помещается в OUT параметры команды, которые предварительно необходимо создать:

    public void StoredProcedureOUTParamsTest() { OleDbConnection con = ConnectionProvider.CreateConnection(); con.Open(); OleDbTransaction trans = con.BeginTransaction();

    //select in params OleDbCommand cmd_in_params = new OleDbCommand("select cust_no from CUSTOMER", con, trans);

    //STORED PROCEDURE

    OleDbCommand cmd_stored_proc = new OleDbCommand("execute procedure mail_label(:cust_no)", con, trans);


    //IN parameter

    cmd_stored_proc.Parameters.Add("cust_no", OleDbType.BSTR); //OUT parameters

    cmd_stored_proc.Parameters.Add("line1", OleDbType.BSTR) .Direction = ParameterDirection.Output; cmd_stored_proc.Parameters.Add("line2", OleDbType.BSTR) .Direction = ParameterDirection.Output; cmd_stored_proc.Parameters.Add("line3", OleDbType.BSTR) .Direction = ParameterDirection.Output; cmd_stored_proc.Parameters.Add("line4", OleDbType.BSTR) .Direction = ParameterDirection.Output; cmd_stored_proc.Parameters.Add("line5", OleDbType.BSTR) .Direction = ParameterDirection.Output; cmd_stored_proc.Parameters.Add("line6", OleDbType.BSTR) .Direction = ParameterDirection.Output;

    //execure reader

    using (OleDbDataReader rdr = cmd_in_params.ExecuteReader()) { // for each customer No while (rdr.Read()) { cmd_stored_proc.Parameters["cust_no"].Value = rdr["cust_no"]; cmd_stored_proc.ExecuteNonQuery();

    Console.WriteLine("Customer №" + rdr["cust_no"]); Console.WriteLine(cmd_stored_proc.Parameters["line1"].Value); Console.WriteLine(cmd_stored_proc.Parameters["line2"].Value); Console.WriteLine(cmd_stored_proc.Parameters["line3"].Value); Console.WriteLine(cmd_stored_proc.Parameters["line4"].Value); Console.WriteLine(cmd_stored_proc.Parameters["line5"].Value); Console.WriteLine(cmd_stored_proc.Parameters["line6"].Value); Console.WriteLine(""); } }

    trans.Commit(); con.Close(); }


    Содержание раздела