Вызов хранимых процедур
Существуют два способа обработки результатов хранимых процедур:
- хранимая процедура возвращает результирующее множество
- результат выполнения хранимой процедуры помещается в 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(); }