在 ASP.net 应用程序的 Informix 查询中使用命名参数
Posted
技术标签:
【中文标题】在 ASP.net 应用程序的 Informix 查询中使用命名参数【英文标题】:Using named parameters in Informix queries in an ASP.net application 【发布时间】:2013-03-08 21:25:09 【问题描述】:我正在尝试将我的查询转换为参数化,但在弄清楚语法时遇到了问题。根据 VS2012,这是没有错误的,但在运行时我得到一个错误,因为参数的值没有被替换到查询中。
示例代码如下:
IfxCommand query = new IfxCommand("SELECT slm_slmno FROM slmmas WHERE
slm_logon = @Logon");
query.Parameters.Add("@Logon", logon);
这是查询在运行时返回的错误:
Error Message = ERROR [42000] [Informix .NET provider][Informix]A syntax
error has occurred.
Sql Query = SELECT slm_slmno FROM slmmas WHERE slm_logon = @Logon
从错误中可以清楚地看出,logon 的值没有被替换到命令中。我正在使用 Informix 10.0。我查看了文档(位于 http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.net_cc.doc/dqx1db2commandclass.htm ),但没有明确的示例显示我试图实现的简单用法。关于我需要如何更好地解决这个问题的任何建议?
【问题讨论】:
【参考方案1】:根据http://publib.boulder.ibm.com/infocenter/idshelp/v117/index.jsp?topic=%2Fcom.ibm.netpr.doc%2Fids_net_115.htm 给出的示例,您可以如下重写您的查询:
IfxCommand query = new IfxCommand("SELECT slm_slmno FROM slmmas WHERE
slm_logon = ?");
IfxParameter ifxp1 = new IfxParameter("Logon",DbType.String);
query.Parameters.Add(ifxp1);
ifxp1.Value = "your value";
【讨论】:
这确实有效,因此我将其标记为有帮助,但我能够编写一个更短的方法,我已将其作为附加答案发布。我会将我的答案标记为问题的答案,以便更好地向其他用户突出显示它,但感谢您采用这种方法,因为它确实为我提供了一个可以试验的工作模型,并且是导致我发布的版本的原因。 【参考方案2】:虽然 Vijay 的解决方案有效,但在处理多个参数时,这种方法会变得相当冗长。我能够像这样修改方法,这种方法更简单,并且更容易添加多个参数:
IfxCommand query = new IfxCommand("SELECT slm_slmno FROM slmmas WHERE
slm_logon = ?");
query.Parameters.Add(new IfxParameter("Logon", logon));
希望其他人会发现这很有用。
【讨论】:
【参考方案3】:如果您正在触发 SQL 查询,另一种方法是在 C# 字符串本身中完成参数替换,并将最终的 SQL 传递给您的命令。
一个例子是 -
var sql = string.Format("SELECT slm_slmno FROM slmmas WHERE slm_logon = 0", logon);
IfxCommand query = new IfxCommand(sql);
存储过程是另一种情况,您需要查看 informix 适配器文档。
【讨论】:
使用String.Format
提供参数肯定会导致sql注入攻击。
@Vijay - 是的,没想到。
String.Format 是现在代码的编写方式,而注入攻击(和转义)是我重写它的原因。 :)以上是关于在 ASP.net 应用程序的 Informix 查询中使用命名参数的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 脚本连接到 Informix 数据库?
在不使用 LINQ 和 EF 的情况下从 ASP.NET 切换到 ASP MVC