使用输出参数从C#调用外部AS400存储过程

时间:2016-11-09 07:20:36

标签: c# sql .net stored-procedures ibm-midrange

我的存储过程有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无效。

输出参数的正确语法是什么?

5 个答案:

答案 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)

以下是两种可能的选择:

  1. 我们需要删除引号,即使参数是字符串:

    cm.CommandText =" CALL RET_IMPL_STS(?,?,?,?)";

    然后我们需要指定每个4个参数

  2. 以下语法也可以正常工作:

    cm.CommandText = string.Format(" CALL RET_IMPL_STS(' {0}',' {1}',' {2}& #39;,?)",STIDAD,ITNOAD,ITRVAD);

    在这种情况下,我们只需要指定输出参数。请注意,在这种格式中,字符串参数需要引号。

答案 2 :(得分:0)

阅读@Andrei的链接我发现了这一段:

  

当存储过程返回结果集时,输出参数   在结果集出现之前,返回值不可用   访问和关闭。例如,如果我们省略了行" dr.Close()"   在上面的第二个示例中,我们将无法检索值   输出参数和返回值。

答案 3 :(得分:0)

您应该使用dll ibm数据提供程序,例如here

.net

但您可以尝试修改代码

git clone --shallow-since=<date>

答案 4 :(得分:-1)

在第一个视图中,您似乎缺少一些花括号。尝试使用以下命令创建新的OdbcCommand对象

OdbcCommand cm = new OdbcCommand("{CALL RET_IMPL_STS('?','?','?','?')}", cn);

请参阅:https://support.microsoft.com/en-us/kb/310130

了解详情