未找到来自C#:例程的ODBC和DB2存储过程

未找到来自C#:例程的ODBC和DB2存储过程,c#,odbc,db2,C#,Odbc,Db2,在运行存储过程时,我似乎遇到了ODBC和DB2的缺点。似乎不可能从存储过程返回数据,我需要使用一个预先存在的查询。有人回避了这个问题吗 提前谢谢 更新 string BaseSQL = "{ CALL B6009822.O#04666803.PUT(?,?,?,?,?,?,?,?,?) }"; OdbcCommand command = myConnection.CreateCommand(); command.CommandText = BaseSQL; //OdbcCommand com

在运行存储过程时,我似乎遇到了ODBC和DB2的缺点。似乎不可能从存储过程返回数据,我需要使用一个预先存在的查询。有人回避了这个问题吗

提前谢谢

更新

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();
我调用的代码如下(假设连接已打开):

我得到以下错误

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();

你试过呼叫语法了吗

编辑:以防万一我上面的评论是正确的:

由此,您是否尝试过:

string BaseSQL = "CALL B6009822.O#04666803.PUT (?)";
重要提示:与ODBC不同,DB2ODBC 不支持将文字作为过程 论据。必须使用参数 用于指定过程的标记 参数


首先,我必须使库(或任何适当的术语)在“SystemiNavigator”中可见。似乎返回结果的存储过程存在问题,所以我不得不将其称为SELECT,如下所示

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

不确定这是否有助于我以外的其他人

对于任何像我这样的DB2 N00B,点击本页搜索“在[*N | LIBRARY]中未找到具有指定参数的SQL0440-Routine[YourRoutine]的答案”

对我来说,我的问题是在哪里为存储过程名称定义了常量,如下所示:

    // 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)";
…包括参数

我花了很长时间研究实体框架,几乎忘记了c#中的直接数据库连接基础知识


希望这能节省一些时间。

我添加了一个示例,以澄清我的问题。我认为这更接近于工作,但我需要了解I系列上发生了什么。看起来现在可以使用文本作为过程参数调用它,所以我将自己回答这个问题。有趣的是——我以前没有在Db2中引用过那么多级别的对象。。。我认为这样做是不够的:O#04666803.PUT?哦-没关系-看起来你必须加上“CALL B6009822.O#04666803.PUT@Owner”?好吧,这至少会更进一步(或者是一个不同的错误)。。错误[42000][IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104-令牌@EARNER无效。有效令牌::。您是否尝试过:“调用B6009822.O#04666803.PUT(?)”错误[HY000][IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0440-在O#04666803中的例程PUT找不到指定参数。但这是否适用于“第二次更新-真实示例”中描述的命令参数?看起来您只是在使用string.Format来编写sql语句。