powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE OLEDB ODBC stored procedure decimal
11 сообщений из 11, страница 1 из 1
ASE OLEDB ODBC stored procedure decimal
    #34772614
Solg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

БД: Sybase ASE 15.02 developer, обновлений нет.
Windows: WinXP SP2

Пытаюсь записать decimal значения в таблицу, используя ХП через OleDB и ODBC.

Хранимая процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
create procedure dbo.UpdateCurrency
(@rate decimal( 18 , 4 ))
as
begin
update Currency set Rate = @rate
end

Метод С#
Код: 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.
	OleDbConnection conn = null;
	OleDbCommand cmd = null;

	string connectionString = @"Provider=ASEOLEDB;Initial Catalog=MyTempDB;Password=password;User ID=meLogin;Server=EPRUSAMW0106;Port=5000";

	conn = new OleDbConnection(connectionString);
	conn.Open();

	try
	{
		cmd = new OleDbCommand("{ call dbo.UpdateCurrency(?)}", conn);
		cmd.CommandType = CommandType.Text;
		decimal rate =  2 ;
		OleDbParameter p2 = new OleDbParameter("@rate", OleDbType.Decimal);
		p2.Value = rate;
		cmd.Parameters.Add(p2);
		int res = cmd.ExecuteNonQuery(); //*** падаем
	}
	finally
	{
		if (conn != null)
			conn.Close();
	}
Console.Read();

Сообщение об ошибке ODBC:
ERROR [42000] [Sybase][ODBC Driver][Adaptive Server Enterprise]Implicit conversion from datatype 'VARCHAR' to 'DECIMAL' is not allowed. Use the CONVERT function to run this query.

Сообщение об ошибке OLEDB:
Domain error during implicit conversion of NUMERIC value '' to a DECIMAL field.

Причем если указать p2.Value = 2, то все ок!
ХП править нельзя, она вообще будет писаться не мной. Подскажите, что можно сделать?
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34772640
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solg пишет:

> ERROR [42000] [Sybase][ODBC Driver][Adaptive Server Enterprise]Implicit
> conversion from datatype 'VARCHAR' to 'DECIMAL' is not allowed. Use the
> CONVERT function to run this query.
>
> Сообщение об ошибке OLEDB:
> Domain error during implicit conversion of NUMERIC value '' to a DECIMAL
> field.

Ты уж разберись, оно у тебя from NUMERIC или from VARCHAR сначала.
На первый взгляд все нормально у тебя там.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34772771
Solg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
Ты уж разберись, оно у тебя from NUMERIC или from VARCHAR сначала.


Как? эти два сообщения приходят при абсолютно идентичных метаданных, единственное, что меняю это типы команд, соединений, параметров. На стороне сервера естественно все одинаково, поле Rate в таблице типа decimal. Мне кажеться странной фраза <NUMERIC value ''>, как будто вместо значения параметра на сервер приходит пустая строка, но в случае OLEDB он по крайней мере знает, что это число. С ODBC вообще непонятно откуда взялся VARCHAR.
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34774773
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что говорит OleDbCommandBuilder.DeriveParameters ? Помниццо когда-то тоже мучилсо

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34778619
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все дело в провайдере+SP

Тока шо руки дошли - на характер проверил Ваш код. Тупо скопировал 1:1-му.
select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003

Посредством sydaase.dll (ASE OLE DB Provider ver. 2.70.0.23) - все сухо.
Посредством sybdrvoledb.dll (Sybase OLEDB Provider for ASE ver. 15.0.0.162)
OleDbException
ErrorCode=-2147467259
Message: Domain error during implicit conversion of NUMERIC value '' to a DECIMAL field. Source: ASEOLEDB


/me думает: Криворукая субася... Ну зачем она от DataDirect'а отказалась?..

P.S. 2moris
А что там по нашему CR#396617
Или, как всегда, отнеслись положительно (производная от слова "положить")

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34778788
moris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Ex_Soft
CR#396617 будет исправлен когда до него дойдет очередь, так он не критичный и есть несколько workaround-ов

А что там, собственно исправлять? Вы можете сами просто перезалить SP sp_sproc_columns c 12.5 или же в 15 версии подредактировать код SP, чтобы не вызывалась sp_autoformat. (которая и служит только для красивости отображения результатов)

2Solg Я воспроизведу ваш код на днях на последнем OLEDB драйвере. Если на последнем повториться, то что вы описываете, то это баг, и тогда откроем кейз к разработчикам.
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34778933
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moris
на последнем OLEDB драйвере

а ето какой (ver.
, EBF#
)

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34779042
Solg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!

Пока выкрутился так
Код: plaintext
exec dbo.UpdateCurrency { 0 }
2moris: ок, интересно чем дело закончится
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34779186
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прокатывает так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
decimal
  rate= 2 ;

cmd=conn.CreateCommand();
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="UpdateCurrency";
OleDbCommandBuilder.DeriveParameters(cmd);
cmd.Parameters["rate"].Value=rate; // "@" - не нужен!!!

int
  res=cmd.ExecuteNonQuery();
...
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34780898
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Шо характерно: с Sybase.Data.AseClient.dll (ver. 1.15.162.0) - прокатывают оба варианта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
decimal
	rate= 2 ;

#if USING_CALL_SYNTAX											
	cmd=new AseCommand("{call UpdateCurrency(?)}",conn);
	cmd.CommandType=CommandType.Text;
	cmd.NamedParameters=false;

	AseParameter
		p2=new AseParameter("@rate",AseDbType.Decimal);
							
	p2.Value=rate;
	cmd.Parameters.Add(p2);
#else						
	cmd=conn.CreateCommand();
	cmd.CommandType=CommandType.StoredProcedure;
	cmd.CommandText="UpdateCurrency";
	AseCommandBuilder.DeriveParameters(cmd);
	cmd.Parameters["@rate"].Value=rate;
#endif

int
	res=cmd.ExecuteNonQuery();
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
ASE OLEDB ODBC stored procedure decimal
    #34815381
moris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solg
2moris: ок, интересно чем дело закончится


Наконец-то у меня руки дошли и проверил ваш код на OLEDB версии 15,0,0,186
Да, подтверждается, то что работало на DataDirect OLEDB сбоит на Sybase OLEDB.

Уже переправил этот код разработчикам.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE OLEDB ODBC stored procedure decimal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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