我的存储过程有4个参数:3个字符串作为输入,1个字符串作为输出。
using (OdbcConnection cn = ODBC.Instance.AmulibConnection)
{
cn.Open();
using (OdbcCommand cm = cn.CreateCommand())
{
cm.CommandText = "CALL RET_IMPL_STS('?','?','?','?')";
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@P1", OdbcType.Char).Value = "1";
cm.Parameters["@P1"].Size = 1;
cm.Parameters["@P1"].Direction = ParameterDirection.Input;
cm.Parameters.Add("@P2", OdbcType.Char).Value = "ABC";
cm.Parameters["@P2"].Size = 15;
cm.Parameters["@P2"].Direction = ParameterDirection.Input;
cm.Parameters.Add("@P3", OdbcType.Char).Value = "DEF";
cm.Parameters["@P3"].Size = 6;
cm.Parameters["@P3"].Direction = ParameterDirection.Input;
cm.Parameters.Add("@P4", OdbcType.Char);
cm.Parameters["@P4"].Size = 5;
cm.Parameters["@P4"].Direction = ParameterDirection.Output;
cm.Prepare();
cm.ExecuteNonQuery();
string result = cm.Parameters["@P4"].Value.ToString();
return result;
}
}
我收到以下错误:
其他信息:ERROR [HY000] [IBM] [System i Access ODBC驱动程序] [DB2 for i5 / OS] SQL0469 - IN,OUT或INOUT对* N中的过程RET_IMPL_STS中的参数4无效。
输出参数的正确语法是什么?
答案 0 :(得分:2)
我建议您使用IBM cwbx库。这是为lib和IBM AS400之间的互操作编程而创建的IBM库。
请看这里:Parameters for the sqlnet.ora File 这告诉您如何使用位于IBM AS400上的参数调用过程并返回一些值。相信我,我已经完成了这项任务而且工作正常。
整个过程就是包含cwbx.dll文件,创建一个机器和程序对象的实例,用using System;
using System.Collections.Generic;
using System.Text;
using cwbx;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string result = string.Empty;
StringConverter stringConverter = new StringConverterClass();
// Define an AS400 system and connect to it
AS400System system = new AS400System();
system.Define("AS400");
system.UserID = "USERNAME";
system.Password = "PASSWORD";
system.IPAddress = "127.0.0.1";
system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);
// Check the connection
if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
{
// Create a program object and link to a system
cwbx.Program program = new cwbx.Program();
program.LibraryName = "LIBRARY";
program.ProgramName = "RPGPROG";
program.system = system;
// Sample parameter data
char chrValue = '1';
string strValue1 = "ABC";
string strValue2 = "DEF";
string outp = "";
// Create a collection of parameters associated with the program
ProgramParameters parameters = new ProgramParameters();
parameters.Append("P1", cwbrcParameterTypeEnum.cwbrcInput, 1);
parameters["P1"].Value = chrValue;
parameters.Append("P2"), cwbrcParameterTypeEnum.cwbrcInput, 3);
parameters["P2"].Value = strValue1;
parameters.Append("P3"), cwbrcParameterTypeEnum.cwbrcInput, 3);
parameters["P3"].Value = strValue1;
parameters.Append("P4", cwbrcParameterTypeEnum.cwbrcOutput, 3);
outp = stringConverter.FromBytes(parameters["P4"].Value);
}
system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
(定义输入,输出和输入参数)填充它们并调用它。
awk
这几乎可以工作,你必须要小心,因为接口dll对参数的假长度很敏感。因此,如果要传输“TEXT”并提供3的文本长度,则只传输“TEX”。
答案 1 :(得分:1)
以下是两种可能的选择:
我们需要删除引号,即使参数是字符串:
cm.CommandText =" CALL RET_IMPL_STS(?,?,?,?)";
然后我们需要指定每个4个参数
以下语法也可以正常工作:
cm.CommandText = string.Format(" CALL RET_IMPL_STS(' {0}',' {1}',' {2}& #39;,?)",STIDAD,ITNOAD,ITRVAD);
在这种情况下,我们只需要指定输出参数。请注意,在这种格式中,字符串参数需要引号。
答案 2 :(得分:0)
阅读@Andrei的链接我发现了这一段:
当存储过程返回结果集时,输出参数 在结果集出现之前,返回值不可用 访问和关闭。例如,如果我们省略了行" dr.Close()" 在上面的第二个示例中,我们将无法检索值 输出参数和返回值。
答案 3 :(得分:0)
答案 4 :(得分:-1)
在第一个视图中,您似乎缺少一些花括号。尝试使用以下命令创建新的OdbcCommand对象
OdbcCommand cm = new OdbcCommand("{CALL RET_IMPL_STS('?','?','?','?')}", cn);
了解详情