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;

AquaDataStudio.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);
                }

            }
      }

これはFINEで動作します。

だから私は好奇心をそそられてそれを実行しようとしましたが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.

だから、このすべての後、私の最後の質問は

ストアドプロシージャとしてコレクションパラメータタイプ(LIST、SET、MULTISET)を使用して、C#からこの種のInformixプロシージャを実行する方法。

どうやら私は何か間違ったことをしているようです。

貴重なご協力をよろしくお願いいたします。

4

1 に答える 1

1

二重引用符は生のSQLで必要でしたが、パラメーター化されたクエリでは必要ありません。次のものを置き換えることができるはずです。

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

と:

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

引用符を2倍にする必要がある場合とそうでない場合を理解するのは難しいですが、「プレースホルダー値にない」は正確です。

于 2012-06-15T16:48:44.623 に答える