1

我正在寻找一种在 C# 中传递 Informix 列表参数的方法。

我问了一个如何将多值参数传递给 Informix 的先前问题,但现在我需要从 C# 执行它。

相关问题在这里

在简历中,我有一个这样的程序。

CREATE PROCEDURE test_3(c LIST(CHAR(10) NOT NULL))
    RETURNING CHAR(10) AS r;
    DEFINE r CHAR(10);
    FOREACH SELECT * INTO r FROM TABLE(c)
        RETURN r WITH RESUME;
    END FOREACH;
END PROCEDURE;

像这样在 Aqua Data Studio.8.0.22 中执行它可以正常工作

 EXECUTE PROCEDURE test_3('LIST{''stspols'',''stsrepo''}');

所以我做了一个简单的例子来说明如何在 c# 中执行它。

首先像一个CommandType.Text

string strParameters = "LIST{''stspols'',''stsrepo''}";
using (OdbcConnection oConnection = new OdbcConnection("DSN=MYDSN;UID=MYUID;PWD=MYPWD;"))
      {
           oConnection.Open();
           using (OdbcDataAdapter oCommand = new OdbcDataAdapter(string.Format("EXECUTE PROCEDURE test_3('{0}')", strParameters), oConnection))
           {                   
                using (DataTable dt = new DataTable())
                {
                            oCommand.Fill(dt);
                }

            }
      }

这个工作正常。

所以我很好奇并试图执行它,但作为CommandType.StoredProcedure

string strParameters = "LIST{''stspols'',''stsrepo''}";
            using (OdbcConnection oConnection = new OdbcConnection("DSN=MYDSN;UID=MYUID;PWD=MYPWD;"))
            {
                oConnection.Open();
                using (OdbcCommand oCommand = new OdbcCommand("{CALL test_3(?)}", oConnection))
                {
                    oCommand.CommandType = CommandType.StoredProcedure;
                    OdbcParameter oParameter = new OdbcParameter("c", OdbcType.Char, 4000);
                    oParameter.Value = strParameters;
                    oCommand.Parameters.Add(oParameter);

                    using (OdbcDataAdapter oDataAdapter = new OdbcDataAdapter(oCommand))
                    {
                        using (DataTable dt = new DataTable())
                        {
                            oDataAdapter.Fill(dt);
                        }

                    }
                }

            }

但现在我明白了ERROR [HY000] [Informix][Informix ODBC Driver][Informix]Invalid collection literal value.

所以在这一切之后,我的最后一个问题是

我如何从 C# 执行这种 Informix 过程,将集合参数类型(LIST、SET、MULTISET)作为存储过程。

显然我做错了什么。

提前感谢您的宝贵帮助。

4

1 回答 1

1

双引号在原始 SQL 中是必需的,但在参数化查询中不应该是必需的。您应该能够替换:

string strParameters = "LIST{''stspols'',''stsrepo''}";

和:

string strParameters = "LIST{'stspols','stsrepo'}";

了解何时需要将引号加倍以及何时不需要加倍是很棘手的,但“不在占位符值中”是准确的。

于 2012-06-15T16:48:44.623 回答