powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
6 сообщений из 6, страница 1 из 1
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36805200
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Поимел проблему (см. тему).
Экскурс в историю.
Создаю приложение - вэб-надстройку над существующей автоматизированной системой. Та работает, как часы, несмотря на некоторые странности в серверной логике, созданной еще при Ленине.
Я вынужден был использовать в проекте доступ к БД через одни и те же ХП, что и другие ее клиенты.
Первая неприятность - неумение NHibernate работать с ораклом (в полной мере).
Поэтому для некоторых хранимых функций приходилось получать ADO.NET-соединение из NHibernate-сессии и далее работать с ним. При этом, чтобы не изобретать велик, код методов доступа к ХФ тупо копировался из десктопной версии в вэбовскую. Без малейших изменений!
Но в десктопной версии этот код отрабатывает безошибочно, а в вэбовской выдает упомянутую ошибку, напр., если функция возвращает строку. Подозрение только на NHibernate...
Ниже привожу ХФ и метод доступа к ней.
Код: 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.
FUNCTION CheckPassword (
        Login_        IN EMPLOYEES.Login%TYPE,
        Password_     IN Varchar2,
        ID_Employee_  OUT EMPLOYEES.ID_Employee%TYPE
        ) RETURN VARCHAR2 AS
	HashPwd Employees.HashPassword%Type;
	rec Employees%ROWTYPE;
Begin
    if Password_ Is NULL OR  Password_='' then
      return ' Пароль не задан ' ;
	end if;
HashPwd := utl_raw.cast_to_raw(main.get_hash_value (Password_));
     begin
     select * into rec from Employees where Login = Login_ And HashPassword = HashPwd;
	 EXCEPTION WHEN NO_DATA_FOUND THEN
	 return ' Ошибка в имени или пароле ' ;
	 end;
ID_Employee_  := rec.ID_Employee;
if (rec.Date_work_start IS NOT NULL AND trunc(rec.Date_work_start) > trunc(SYSDATE)) OR
   (rec.Date_work_end IS NOT NULL AND  trunc(rec.Date_work_end) < trunc(SYSDATE)) then
   return 'Пользователь не работает в компании';
end if;

return '';
end CheckPassword;
Далее все прерывается на _cmd.ExecuteNonQuery(), если вышеприведенная ХФ возвращает непустую строку
Код: 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.
        public bool CheckPermissions(string userName, string userPassword)
        {
            OracleConnection oracleConnection = (OracleConnection)_session.Connection;

            const string cSQL = "XYZ.MAIN.CHECKPASSWORD";

            try
            {
                OracleCommand _cmd = oracleConnection.CreateCommand();
                _cmd.CommandText = cSQL;
                _cmd.CommandType = CommandType.StoredProcedure;

                OracleParameter _RetVal = new OracleParameter("RetVal", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
                _cmd.Parameters.Add(_RetVal);
                _cmd.Parameters.Add("LOGIN_", OracleDbType.Varchar2, userName, ParameterDirection.Input);
                _cmd.Parameters.Add("PASSWORD_", OracleDbType.Varchar2, userPassword, ParameterDirection.Input);
                OracleParameter _IdEmplloyee = new OracleParameter("ID_EMPLOYEE_", OracleDbType.Int32, ParameterDirection.Output);
                _cmd.Parameters.Add(_IdEmplloyee);

                _cmd.ExecuteNonQuery();

                if (_IdEmplloyee.Value == DBNull.Value)
                    throw new Exception(_RetVal.Value.ToString());

                int userID = Convert.ToInt32(_IdEmplloyee.Value);

                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

...
Рейтинг: 0 / 0
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36806197
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой тип EMPLOYEES.ID_Employee%TYPE ?
...
Рейтинг: 0 / 0
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36806258
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationкакой тип EMPLOYEES.ID_Employee%TYPE ?

NUMBER(8)
...
Рейтинг: 0 / 0
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36812297
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, попробовать у параметров свойство Size явно задать?
Типа такого:
Код: plaintext
1.
2.
3.
OracleParameter oOutParam= new OracleParameter(":bAllTestCleared", OracleDbType.Varchar2);
oOutParam.Direction = ParameterDirection.Output;
oOutParam.Size = 50;
oCmd.Parameters.Add(oOutParam);

Nhibernate здесь по-идее совсем не причем, только функции библиотеки ODP.NET используются...
Странно почему это в старом коде работало, может конфигурация проекта другая?

Кстати да, насчет вызова хранимок из Nhibernate... Там их можно вызывать, но только в частном случае (параметры хранимки должны идти в определенном порядке), а так - да, любую из старых хранимок не выполнишь без спуска на уровень ниже... И видимо это тоже связано с реализацией ODP.NET - вот цитата с forums.oracle.com:
автор Just fyi, here's the reason the returnvalue needs to be first. ODP constructs an anonymous
block to execute the stored procedure, along the lines of the following:
begin :retval := myproc(:paramval);end;
and the default for ODP is to bind by position, rather than by name.
So the fist parameter added needs to be the return value.
...
Рейтинг: 0 / 0
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36812351
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barser
oOutParam.Size = 50;


Спасибо, коллега! А ведь помогло!
Я так упыхался в попытках запустить эту процедуру на NHibernate, что ручонки опустились исправлять ошибку уже для ADO.NET.

А работают они по-разному, возможно, т.к. используют разные провайдеры:
OracleClient
Oracle.DataAccess
...
Рейтинг: 0 / 0
NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
    #36812412
barser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдль,

рад что помогло :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate. ORA-06502: PL/SQL: : буфер символьных строк слишком маленький...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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