如何通过ODBC连接通过在C#中的Informix的收集参数(LIST,SET,MULTISET)(

2019-10-16 20:56发布

我正在寻找一种方式来传递一个Informix表参数在C#。

我问如何通过多值参数到Informix一个previus的问题,但现在我需要从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);
                }

            }
      }

这一个工作正常。

所以我就courious并试图执行它但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的程序,用一个Collection参数类型(LIST,SET,MULTISET)作为存储过程。

显然,我做错了什么。

在此先感谢您的宝贵帮助。

Answer 1:

该翻了一番,达到单引号是在原始SQL必要的,但不应该在参数化查询需要。 你应该能够取代:

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

有:

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

了解行情时需要加倍当他们这样做不是很棘手,但“不是占位符值”是准确的。



文章来源: How to pass an Informix Collection Parameter (LIST, SET, MULTISET) in c# through an ODBC Connection