Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не получается через OracleDataProvider получить рекордсет. / 2 сообщений из 2, страница 1 из 1
02.06.2011, 09:15
    #37290542
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается через OracleDataProvider получить рекордсет.
т.к. Микрософт сама порекомендовала использовать ODP заместо своего OracleClient, решил новую мелкую задачку сделать на ODP.
Есть оракловая функция. Возвращает данные через Output RefCursor.
Делаю все как обычно

Код: plaintext
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.
56.
 OracleConnection oraConnect = new OracleConnection(connectionString);

            if (oraConnect.State != ConnectionState.Open)
            {
                try
                {
                    oraConnect.Open();
                }
                catch (OracleException ex)
                {
                    throw new Exception("Ошибка подключения к БД\n" + ex.Message);
                }
            }


            DataSet dataSet = new DataSet();
            OracleParameter param;
            OracleCommand sqlCommand = oraConnect.CreateCommand();
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.CommandText = sSPName;            

            sqlCommand.Parameters.Clear();          

            param = new OracleParameter("p_xttk_id", OracleDbType.Int32);
            param.Direction = ParameterDirection.Input;
            param.Value = 4;
            sqlCommand.Parameters.Add(param);

            param = new OracleParameter("p_recordset", OracleDbType.RefCursor);
            param.Direction = ParameterDirection.Output;
            sqlCommand.Parameters.Add(param);

            param = new OracleParameter("v_retcode", OracleDbType.Int32);
            param.Direction = ParameterDirection.ReturnValue;
            sqlCommand.Parameters.Add(param);

            sqlCommand.Prepare();

            OracleDataAdapter sqlAdapter = new OracleDataAdapter(sqlCommand);
            
            //дергаем
            try
            {
                sqlAdapter.Fill(dataSet);
            }
            catch (OracleException Ex)
            {
                throw new Exception(Ex.Message);
            }
            finally
            {
                oraConnect.Close();
            }

            oraConnect.Dispose();
            return dataSet;

получаю DataSet c одной таблицей, в которой Rows.Count = 0. т.е. курсор возвратил пустой рекордсет.

Попробовал по старинке сделать так же, но через System.Data.OracleClient - получаю рекордсет с набором строк, так как и должно было быть.


Вопрос: что еще надо (или как правильно надо) работать через ODP - чтобы функция возвратила набор данных?
...
Рейтинг: 0 / 0
02.06.2011, 10:17
    #37290681
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается через OracleDataProvider получить рекордсет.
1. В SP'шке p_recordset первый параметр? (Хоть это и для хибера, но... Мало ли...)
2. М.б. дело в очередности добавления параметров:
hstas
Код: plaintext
1.
2.
3.
param = new OracleParameter("p_xttk_id", OracleDbType.Int32);
param = new OracleParameter("p_recordset", OracleDbType.RefCursor);
param = new OracleParameter("v_retcode", OracleDbType.Int32);

?
Попробуйте так (заодно посмотрите, в каком порядке будут расположены параметры в sqlCommand.Parameters):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DataSet dataSet = new DataSet();
OracleCommand sqlCommand = oraConnect.CreateCommand();
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = sSPName;            
OracleCommandBuilder.DeriveParameters(sqlCommand);
sqlCommand.Parameters["p_xttk_id"].Value =  4 ;
OracleDataAdapter sqlAdapter = new OracleDataAdapter(sqlCommand);
sqlAdapter.Fill(dataSet);
У меня выше приведенная конструкция все возвращает без проблем ( ODAC 11.2 Release 3 (11.2.0.2.1) + SP'шка с первым параметром cur out sys_refcursor ). Проводить исследования на предмет зависимости от расположения параметров в SP'шке/очередности добавления в xCommand.Parameters - недосуг.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не получается через OracleDataProvider получить рекордсет. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]