Здравствуйте.
Для отладки понадобилось посмотреть параметры, передаваемые в хранимую процедуру на Oracle 10g.
Делаю это следующим образом. Код работает:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
readonly string connectionString = @"Data Source=ELLDEV;User ID=smeta;Password=smeta";
private void MainForm_Load(object sender, EventArgs e)
{
using (OracleConnection con = new OracleConnection(connectionString))
using (OracleCommand cmd = new OracleCommand("", con)) {
cmd.CommandText = "dbms_output.put_line('Проверка связи'); dbms_output.put_line('Проверка связи 2')";
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
EnableDBMSOutput(con);
cmd.ExecuteNonQuery();
dbmsTextBox.Text = ReadDBMSOutput(con);
}
}
void EnableDBMSOutput(OracleConnection c)
{
using (OracleCommand cmd = new OracleCommand("dbms_output.enable", c)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
}
string ReadDBMSOutput(OracleConnection c)
{
using (OracleCommand cmd = new OracleCommand("dbms_output.get_line", c)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("line", OracleType.VarChar, 255 ).Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add("status", OracleType.Int16).Direction = System.Data.ParameterDirection.Output;
StringBuilder r = new StringBuilder();
int status = 0 ;
while (true) {
cmd.Parameters["line"].Value = null;
cmd.Parameters["status"].Value = null;
cmd.ExecuteNonQuery();
status = int.Parse(cmd.Parameters["status"].Value.ToString());
if (status != 0 )
break;
if(r.ToString().Length > 0 )
r.Append(Environment.NewLine);
r.Append(cmd.Parameters["line"].Value.ToString());
}
return r.ToString();
}
}
А вот когда заменяю
1.
2.
3.
using (OracleCommand cmd = new OracleCommand("", con)) {
cmd.CommandText = "dbms_output.put_line('Проверка связи'); dbms_output.put_line('Проверка связи 2')";
cmd.CommandType = CommandType.StoredProcedure;
На нужный мне вызов:
1.
2.
3.
4.
5.
6.
7.
8.
using (OracleCommand cmd = new OracleCommand("PRODUCTIONSTATISTICS.psEquipmentSam", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("districtCode", OracleType.Char, 4 )).Value = "332";
cmd.Parameters.Add(new OracleParameter("startDate", OracleType.Char, 8 )).Value = "20060801";
cmd.Parameters.Add(new OracleParameter("endDate", OracleType.Char, 8 )).Value = "20060831";
cmd.Parameters.Add(new OracleParameter("equipmentModel", OracleType.VarChar, 3 )).Value = "ОКТ САМ";
cmd.Parameters.Add(new OracleParameter("rc", OracleType.Cursor)).Direction = ParameterDirection.Output;
То ReadDBMSOutput ничего не возвращает.
При этом в моей хранимой процедуре PRODUCTIONSTATISTICS.psEquipmentSam точно делается вывод в dbms_output и он работает - проверено вызовом из pl/sql.
В чём у меня ошибка? Как сделать правильно?