Хранимые процедуры ODBC и DB2 из C #: подпрограмма не найдена - PullRequest
3 голосов
/ 17 февраля 2011

Кажется, я столкнулся с недостатком ODBC и DB2 при запуске хранимых процедур. Кажется, что невозможно вернуть данные из хранимой процедуры, и у меня есть предварительный запрос, который мне нужно использовать. Кто-нибудь обходил эту конкретную проблему?

Заранее спасибо

Обновление

Код, который я вызываю, выглядит следующим образом (при условии, что соединение уже открыто):

string BaseSQL = "CALL B6009822.O#04666803.PUT";

OdbcCommand command = new OdbcCommand(BaseSQL, myConnection);
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add("@Owner", OdbcType.VarChar).Value = "MH";

int rows = command.ExecuteNonQuery();

myConnection.Close();

Я получаю следующую ошибку ..

ERROR [HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0440 - Routine PUT in O#04666803 not found with specified parameters.

Кажется, что он возражает против каталога / библиотеки и имени процедуры. Любая идея о том, что мне нужно сделать, чтобы вызвать процедуру?

Второе обновление - реальный пример

string BaseSQL = "{ CALL B6009822.O#04666803.PUT(?,?,?,?,?,?,?,?,?) }";

OdbcCommand command = myConnection.CreateCommand();
command.CommandText = BaseSQL;

//OdbcCommand command = new OdbcCommand(BaseSQL, myConnection);
command.CommandType = CommandType.StoredProcedure;

/*
@Param1 VarChar(4), @Param2 dec(8,0), 
@Param3 dec(4,0), @Param4 dec(8,0),      
@Param5 VarChar(60), @Param6 dec(9,2), 
@Param7 dec(9,0), @Param8 dec(9,2), 
@Param9 VarChar(10))                
 */

command.Parameters.Add("@Param1", OdbcType.VarChar, 4).Value = "MH";
command.Parameters.Add("@Param2", OdbcType.Decimal, 8).Value = 20110217;
command.Parameters.Add("@Param3", OdbcType.Decimal, 4).Value = 1;
command.Parameters.Add("@Param4", OdbcType.Decimal, 8).Value = 178377;
command.Parameters.Add("@Param5", OdbcType.VarChar, 60).Value = "Description";
command.Parameters.Add("@Param6", OdbcType.Decimal, 9).Value = 0;
command.Parameters.Add("@Param7", OdbcType.Decimal, 9).Value = 45;
command.Parameters.Add("@Param8", OdbcType.Decimal, 9).Value = 0;
command.Parameters.Add("@Param9", OdbcType.VarChar, 10).Value = "*CREATE";

int rows = command.ExecuteNonQuery();

myConnection.Close();

Ответы [ 3 ]

2 голосов
/ 17 февраля 2011

Вы пробовали синтаксис CALL?

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.odbc/db2z_odbcspcall.htm

РЕДАКТИРОВАТЬ: На всякий случай, если мой комментарий выше верен:

Из этого ресурс , вы пробовали:

string BaseSQL = "CALL B6009822.O#04666803.PUT (?)";

Важное замечание: В отличие от ODBC, DB2 ODBC не поддерживает литералы в качестве аргументов процедуры.Для указания параметра процедуры необходимо использовать маркеры параметров.

1 голос
/ 11 октября 2016

Для любого DB2 n00bs, подобного мне, попадающего на эту страницу в поисках ответов на «SQL0440 - Подпрограмма [YourRoutine] в [* N | LIBRARY] не найдена с указанными параметрами» ...

Для меня проблема заключалась в том, что я определил константу для имени хранимой процедуры, например:

    // Database Constants
    public const string DB_PROC_GET_MYPROC = @"LIBRARY.MYPROC";

Как я должен был это заявить:

    // Database Constants
    public const string DB_PROC_GET_MYPROC = @"LIBRARY.MYPROC(@stateCode, @productCode, @tranType)";

... с включенными параметрами.

Я так долго работал с Entity Framework, что почти забыл основы прямого соединения с базой данных в c #.

Надеюсь, это сэкономит кому-то время.

1 голос
/ 08 марта 2011

Прежде всего, я должен был сделать библиотеку (или любой другой подходящий термин) видимой в «System i Navigator».Кажется, что есть проблема с хранимыми процедурами, которые возвращают результаты, поэтому мне пришлось вызвать его как SELECT, как показано ниже ...

"SELECT PUT('{4}',{1},1,{0},'{2}',0,{3},0,'{5}') as A from LIBRARY.EARNER where EAR = '{4}'"

Не уверен, что это поможет кому-то, кроме меня, хотя!

...