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

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

Проблема следующая:
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
01.10.2008, 11:16
    #35569146
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
Код процедуры:
Код: 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
06.10.2008, 18:10
    #35578878
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
да... советов море, даже не знаю который выбрать :)
Тогда такой вопрос: а вообще кто нибудь пишет в связке Informix + dot.net + native dot.net provider?

По сабжу: удалось найти решение: после каждого вызова команды осуществляется удаление всех параметров, их повторное создание и инициализация... в этом случае вроде бы работает...
...
Рейтинг: 0 / 0
06.10.2008, 18:29
    #35578933
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
я никогда не пользовался 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
07.10.2008, 15:27
    #35580697
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
Журавлев Денис... я делал так, правда это через odbc мост...
Спасибо, перейти на ODBC тоже вариант, согласен...
Но как-то странно использовать ODBC, если существует родной провайдер для dot.net.
Для себя решил - еще один подобный момент со стороны провайдера dot.net и буду пробовать перевести все на ODBC...
...
Рейтинг: 0 / 0
07.10.2008, 15:47
    #35580782
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
DimmON33 Журавлев Денис... я делал так, правда это через odbc мост...
Спасибо, перейти на ODBC тоже вариант, согласен...
Но как-то странно использовать ODBC, если существует родной провайдер для dot.net.
Для себя решил - еще один подобный момент со стороны провайдера dot.net и буду пробовать перевести все на ODBC...нет, я не предлагал переходить на odbc. Я в 2004 году написал код, его кусочек я показал выше, некоторое время назад в той организации перешли на родной dot.net провайдер, и мой код переписан на ifx* компоненты, у них все успешно работает. Я показал пример как я бы обращался к процедурам, т.е. как к обычному запросу через execute procedure.
...
Рейтинг: 0 / 0
07.10.2008, 17:04
    #35581131
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.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.
		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
08.10.2008, 09:12
    #35582064
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
Я использую 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
09.10.2008, 10:39
    #35584879
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
ТанЯ использую 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
09.10.2008, 11:20
    #35585001
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
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
09.10.2008, 11:38
    #35585063
DimmON33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
To Тан: большое спасибо!
Вызов Cmd.Prepare(); действительно решает описанные проблемы.
Осталось только понять причины происходящего:
1. вызов Cmd.Prepare(); обязателен при выполнении любой команды в Informix?
2. это баг провайдера/сервера, который обходят таким вот хитрым образом?
...
Рейтинг: 0 / 0
09.10.2008, 11:44
    #35585083
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
DimmON33To Тан: большое спасибо!
Вызов Cmd.Prepare(); действительно решает описанные проблемы.
Осталось только понять причины происходящего:
1. вызов Cmd.Prepare(); обязателен при выполнении любой команды в Informix?
2. это баг провайдера/сервера, который обходят таким вот хитрым образом?у вас аналогичный код на других провайдерах как работает? например mssql, или odbc? Если иначе то надо писать баг репорт в ibm.
...
Рейтинг: 0 / 0
09.10.2008, 11:48
    #35585095
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка [HY105] при втором вызове процедуры из dot.net
Я думаю, происходит вот что:

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

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

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


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