powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Ошибка [HY105] при втором вызове процедуры из dot.net
19 сообщений из 19, страница 1 из 1
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35569133
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые информиксоводы!

Возникли трудности, буду признателен за подсказку - в каком направлении копать.

Проблема следующая:
1. IDS 11.10.TC1DE.win2003 (Developer edition);
2. простая тестовая процедурка с одним in и одним out параметрами;
3. вызывающий процедуру код в dot.net приложении, использующий родной драйвер IBM.Data.Informix;
4. При первом вызове процедура отрабатывает корректно, возвращая правильное значение, любой последующий запуск процедуры (с предварительной инициализацией in параметра новым значением) стабильно вызывает ошибку HY105 (Invalid parameter type.).


PS: Сильно не пинайте, в факе и поиском ничего похожего не нашел.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35569146
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE "informix".test( code int )
returns nvarchar( 64 );
  DEFINE toRet nvarchar( 64 );
  DEFINE somevar int;
  LET somevar = code;
  LET toRet = CAST(somevar AS nvarchar( 64 ));
  RETURN toRet;
END PROCEDURE;

Вызывающий из .NET:
Код: 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.
private IfxCommand lCommand;
		private void CreateCommand( )
		{
			// command init
			IfxConnection lConnection = new IfxConnection( "Client Locale=ru_ru.1251;Connection Timeout=30;Database=zak_3;Database Locale=ru_ru.1251;Host=ois3;Persist Security Info=True;Protocol=olsoctcp;Password=111;Server=ol_svr_custom;Service=9088;User ID=informix" );
			this.lCommand = new IfxCommand( "test", lConnection );
			this.lCommand.CommandType = CommandType.StoredProcedure;
			this.lCommand.Parameters.Add( new IfxParameter( "RETURN_VALUE", IfxType.Integer,  4 , System.Data.ParameterDirection.ReturnValue, false, ( (System.Byte)(  0  ) ), ( (System.Byte)(  0  ) ), null, System.Data.DataRowVersion.Current, null ) );
			this.lCommand.Parameters.Add( new IfxParameter( "code", IfxType.Integer,  4 , System.Data.ParameterDirection.Input, false, ( (System.Byte)(  0  ) ), ( (System.Byte)(  0  ) ), null, System.Data.DataRowVersion.Current, null ) );
		}
		private void btnCallProc_Click( object sender, EventArgs e )
		{
			if( this.lCommand == null )
				// bdc: create command if not exists
				this.CreateCommand( );

			// set parameter value:
			lCommand.Parameters["code"].Value =  111 ;

			try
			{
				lCommand.Connection.Open( );
				lCommand.ExecuteNonQuery( );
				MessageBox.Show( "Success call: " + lCommand.Parameters["RETURN_VALUE"].Value.ToString( ) );
			}
			catch( Exception ex )
			{
				MessageBox.Show( ex.Message );
			}
			finally
			{
				lCommand.Connection.Close( );
			}
		}
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35578878
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да... советов море, даже не знаю который выбрать :)
Тогда такой вопрос: а вообще кто нибудь пишет в связке Informix + dot.net + native dot.net provider?

По сабжу: удалось найти решение: после каждого вызова команды осуществляется удаление всех параметров, их повторное создание и инициализация... в этом случае вроде бы работает...
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35578933
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я никогда не пользовался CommandType.StoredProcedure и ParameterDirection.ReturnValue-параметрами, возможно дело в этом.


я делал так, правда это через odbc мост
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
		public int NewDoc(DateTime DateOut, string NumOut, DateTime DateIn, string NumIn)
		{
			int NewDocId= - 1 ;

			OdbcCommand Cmd = new OdbcCommand("", odbcConn);
			Cmd.CommandText = "execute procedure reg_document_new(?, ?, ?, ?)";
			Cmd.Parameters.Add("DateOut", DateOut);
			Cmd.Parameters.Add("NumOut", NumOut);
			Cmd.Parameters.Add("DateIn", DateIn);
			Cmd.Parameters.Add("NumIn", NumIn);

			OdbcDataReader rdm = Cmd.ExecuteReader();
			while(rdm.Read())
			{
				NewDocId = rdm.GetInt32( 0 );
			}
			rdm.Close();

			return(NewDocId);
		}
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35580697
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис... я делал так, правда это через odbc мост...
Спасибо, перейти на ODBC тоже вариант, согласен...
Но как-то странно использовать ODBC, если существует родной провайдер для dot.net.
Для себя решил - еще один подобный момент со стороны провайдера dot.net и буду пробовать перевести все на ODBC...
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35580782
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimmON33 Журавлев Денис... я делал так, правда это через odbc мост...
Спасибо, перейти на ODBC тоже вариант, согласен...
Но как-то странно использовать ODBC, если существует родной провайдер для dot.net.
Для себя решил - еще один подобный момент со стороны провайдера dot.net и буду пробовать перевести все на ODBC...нет, я не предлагал переходить на odbc. Я в 2004 году написал код, его кусочек я показал выше, некоторое время назад в той организации перешли на родной dot.net провайдер, и мой код переписан на ifx* компоненты, у них все успешно работает. Я показал пример как я бы обращался к процедурам, т.е. как к обычному запросу через execute procedure.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35581131
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис, я попробовал переработать тестовый код под работу с другим типом команды по Вашему совету:
Код: 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.
		private IfxCommand lCommand;
		private void CreateCommand( )
		{
			// command init
			IfxConnection lConnection = new IfxConnection( "Client Locale=ru_ru.1251;Connection Timeout=30;Database=sysmaster;Database Locale=ru_ru.1251;Host=ois3;Persist Security Info=True;Protocol=olsoctcp;Password=111;Server=ol_svr_custom;Service=9088;User ID=informix" );
			this.lCommand = new IfxCommand( "select * from logmessage where message_num = ?", lConnection );
			this.lCommand.CommandType = CommandType.Text;
			this.lCommand.Parameters.Add( new IfxParameter( "message_num", IfxType.Integer,  4 , System.Data.ParameterDirection.Input, false, ( (System.Byte)(  0  ) ), ( (System.Byte)(  0  ) ), null, System.Data.DataRowVersion.Current, null ) );
		}
		private void btnCallProc_Click( object sender, EventArgs e )
		{
			if( this.lCommand == null )
				// bdc: create command if not exists
				this.CreateCommand( );

			// set parameter value:
			lCommand.Parameters["message_num"].Value =  111 ;

			try
			{
				lCommand.Connection.Open( );
				lCommand.ExecuteNonQuery( );
				MessageBox.Show( "Success call");
			}
			catch( Exception ex )
			{
				MessageBox.Show( ex.Message );
			}
			finally
			{
				lCommand.Connection.Close( );
			}
		}

в результате - при повторном вызове по прежнему сервер выдает ошибку, правда уже другую: [07001] Wrong number of parameters
Для интереса - поставил еще один сервер на другую машину - результат тот же!
:) может быть, это ограничение Developer Edition версии сервера? Вроде: вызов команды работает только один раз...
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35582064
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую IBM.Data.Informix.
Написала вот такое, работает без ошибок, возвращает 22.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        public int test() 
        {
            IfxCommand Cmd = new IfxCommand("", IfxConn);
            Cmd.CommandText = "execute function urc_check_auth(?, ?)";
            Cmd.Parameters.Add("user", IfxType.Integer);
            Cmd.Parameters.Add("BFunc", "");

            int UserType = - 1 ;
            Cmd.Parameters["user"].Value =  1 ;
            IfxDataReader rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  11 ;
            rdm.Close();

            Cmd.Parameters["user"].Value =  2 ;
            rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  22 ;
            rdm.Close();

            return (UserType);
        }
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35584879
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТанЯ использую IBM.Data.Informix.
Написала вот такое, работает без ошибок, возвращает 22.


Так и у меня работает. Проблема начинается, если между вызовами команды закрывать соединение. Попробуйте запустить вот так:

Код: 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.
public int test() 
        {
            IfxCommand Cmd = new IfxCommand("", IfxConn);
            Cmd.CommandText = "execute function urc_check_auth(?, ?)";
            Cmd.Parameters.Add("user", IfxType.Integer);
            Cmd.Parameters.Add("BFunc", "");

            // IfxConn.Open( );   // это видимо уже сделано где то ранее
            int UserType = - 1 ;
            Cmd.Parameters["user"].Value =  1 ;
            IfxDataReader rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  11 ;
            rdm.Close();
            IfxConn.Close( );

            IfxConn.Open( );
            Cmd.Parameters["user"].Value =  2 ;
            rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  22 ;
            rdm.Close();
            IfxConn.Close( );

            return (UserType);
        }
У меня вдает ошибку [07001] Wrong number of parameters.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585001
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimmON33 ТанЯ использую IBM.Data.Informix.
Написала вот такое, работает без ошибок, возвращает 22.


Так и у меня работает. Проблема начинается, если между вызовами команды закрывать соединение. Попробуйте запустить вот так:

Код: 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.
public int test() 
        {
            IfxCommand Cmd = new IfxCommand("", IfxConn);
            Cmd.CommandText = "execute function urc_check_auth(?, ?)";
            Cmd.Parameters.Add("user", IfxType.Integer);
            Cmd.Parameters.Add("BFunc", "");

            // IfxConn.Open( );   // это видимо уже сделано где то ранее
            int UserType = - 1 ;
            Cmd.Parameters["user"].Value =  1 ;
            IfxDataReader rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  11 ;
            rdm.Close();
            IfxConn.Close( );

            IfxConn.Open( );
            Cmd.Parameters["user"].Value =  2 ;
            rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  22 ;
            rdm.Close();
            IfxConn.Close( );

            return (UserType);
        }
У меня вдает ошибку [07001] Wrong number of parameters.

Так у меня тоже ошибка.
А вот так нету
Код: 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.
        
public int test() 
        {
            IfxCommand Cmd = new IfxCommand("", IfxConn);
            Cmd.CommandText = "execute function urc_check_auth(?, ?)";
            Cmd.Parameters.Add("user", IfxType.Integer);
            Cmd.Parameters.Add("BFunc", "");

            int UserType = - 1 ;
            Cmd.Parameters["user"].Value =  1 ;
            IfxDataReader rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  11 ;
            rdm.Close();
            IfxConn.Close();
            IfxConn.Open();
            Cmd.Prepare();
            Cmd.Parameters["user"].Value =  2 ;
            rdm = Cmd.ExecuteReader();
            if (rdm.Read()) UserType =  22 ;
            rdm.Close();

            return (UserType);
        }

...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585063
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Тан: большое спасибо!
Вызов Cmd.Prepare(); действительно решает описанные проблемы.
Осталось только понять причины происходящего:
1. вызов Cmd.Prepare(); обязателен при выполнении любой команды в Informix?
2. это баг провайдера/сервера, который обходят таким вот хитрым образом?
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585083
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimmON33To Тан: большое спасибо!
Вызов Cmd.Prepare(); действительно решает описанные проблемы.
Осталось только понять причины происходящего:
1. вызов Cmd.Prepare(); обязателен при выполнении любой команды в Informix?
2. это баг провайдера/сервера, который обходят таким вот хитрым образом?у вас аналогичный код на других провайдерах как работает? например mssql, или odbc? Если иначе то надо писать баг репорт в ibm.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585095
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, происходит вот что:

Вы открываете соединение.
Создаете на сервере объект (курсор), через который выбираете данные.
Закрываете соединение (объект на сервере удаляется).
Открываете другое соединение.
Пытаетесь выбрать данные через объект, которого нет.

Чтобы работало, надо объект этот заново на сервере создать.
Prepare создает.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585103
DimmON33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Другие провайдеры я не пробовал использовать. Надо будет попробовать возможно это действительно баг native провайдера.
Это для меня первая работа под informix, родной сервер - MS SQL, там таких проблем никогда не возникало.
Еще раз спасибо...
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585148
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тан
Prepare создает.

ну а при первом вызове кто describe делает? Cmd.CommandText = ?
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585179
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Тан
Prepare создает.
ну а при первом вызове кто describe делает? Cmd.CommandText = ?
при первом вызове Cmd.ExecuteReader() делает.
после этого Cmd становится Prepared и при следующем вызове Prepare не делается.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585652
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тан Журавлев Денис Тан
Prepare создает.
ну а при первом вызове кто describe делает? Cmd.CommandText = ?
при первом вызове Cmd.ExecuteReader() делает.
после этого Cmd становится Prepared и при следующем вызове Prepare не делается.
rdm.Close(); и тем боллее IfxConn.Close(); должны вызывать unPrepare
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585950
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Тан Журавлев Денис Тан
Prepare создает.
ну а при первом вызове кто describe делает? Cmd.CommandText = ?
при первом вызове Cmd.ExecuteReader() делает.
после этого Cmd становится Prepared и при следующем вызове Prepare не делается.
rdm.Close(); и тем боллее IfxConn.Close(); должны вызывать unPrepare
думаю, rdm.Close() никак не должен вызывать unPrepare, иначе от Prepare никакой выгоды не будет.
...
Рейтинг: 0 / 0
Ошибка [HY105] при втором вызове процедуры из dot.net
    #35585987
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тан
думаю, rdm.Close() никак не должен вызывать unPrepare, иначе от Prepare никакой выгоды не будет.да, логично
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Ошибка [HY105] при втором вызове процедуры из dot.net
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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