C# 在ASP.net应用程序的Informix查询中使用命名参数

C# 在ASP.net应用程序的Informix查询中使用命名参数,c#,asp.net,informix,C#,Asp.net,Informix,我试图将我的查询转换为参数化,但在理解语法方面遇到了问题。根据VS2012,这是无错误的,但是在运行时,我得到一个错误,因为参数的值没有被替换到查询中 下面是示例代码: IfxCommand query = new IfxCommand("SELECT slm_slmno FROM slmmas WHERE slm_logon = @Logon"); query.Parameters.Add("@Logon", logon); 以下是运行查询时返回的错误: Error Message

我试图将我的查询转换为参数化,但在理解语法方面遇到了问题。根据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。我已经看过了文档(位于),但是没有清晰的示例显示我试图实现的简单用法。关于如何更好地实现这一点,有什么建议吗?

如果您正在启动SQL查询,另一种方法是在C#string本身中完成参数替换,并将最终的SQL传递给您的命令

例如:

var sql = string.Format("SELECT slm_slmno FROM slmmas WHERE slm_logon = {0}", logon);
IfxCommand query = new IfxCommand(sql);

存储过程是另一种情况,您需要查看informix适配器文档。

根据上给出的示例,您可以按如下方式重写查询:

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";

虽然Vijay的解决方案有效,但在处理多个参数时,这种方法会变得相当冗长。我能够像这样修改方法,这种方法更简单,更容易添加多个参数:

IfxCommand query = new IfxCommand("SELECT slm_slmno FROM slmmas WHERE 
    slm_logon = ?");
query.Parameters.Add(new IfxParameter("Logon", logon));

希望其他人会发现这一点很有用。

使用
String.Format
提供参数肯定会导致sql注入攻击。@Vijay-true,没有想到.String.Format是现在编写代码的方式,注入攻击(和转义)是我重写代码的原因。:)这确实有效,所以我将其标记为有用,但我能够编写一个更短的方法,我将其作为附加答案发布。我将我的答案标记为这个问题的答案,以便更好地向其他用户强调它,但感谢您的这种方法,因为它确实给了我一个可供实验的工作模型,这也是我发布的版本的原因。