我正在寻找一种在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
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
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.
ERROR [HY000] [Informix][Informix ODBC Driver][Informix]Invalid collection literal value.
所以所有这些之后,我的最后一个问题是
我如何从C#中使用Collection参数类型(LIST,SET,MULTISET)作为存储过程来执行这种Informix过程。
显然我做错了。
在此先感谢您的宝贵帮助。
在原始SQL中,加倍的单引号是必需的,但在参数化查询中则不需要。您应该能够替换:
string strParameters = "LIST{''stspols'',''stsrepo''}";
和:
string strParameters = "LIST{'stspols','stsrepo'}";
了解何时需要将引号加倍,何时不应该加倍,但“不在占位符值中”是准确的。