参数化查询有问题

时间:2014-03-10 19:29:36

标签: c# sql db2 odbc parameterized-query

我在ODBC中使用参数化查询时遇到问题,这通常在我使用SQLClient对象时有效。

using (OdbcConnection conn = new OdbcConnection())
{
    conn.ConnectionString = myConnectionString;
    conn.Open();

    using (OdbcCommand comm = new OdbcCommand())
    {
        comm.Connection = conn;
        comm.CommandText = "SELECT MYTABLE.MYCOLUMN FROM MYSCHEMA.MYTABLE WHERE MYCOLUMN = @MYPARAM";
        comm.Parameters.Add(new OdbcParameter("@MYPARAM",myValue));

        using (OdbcDataReader reader = comm.ExecuteReader)
        {
            //do stuff
        } 
    }
}

我得到的信息是

  

ERROR [42S22] [IBM] [CLI驱动程序] [DB2 / AIX64] SQL0206N“@MYPARAM”不是   在使用它的上下文中有效。 SQLSTATE = 42703

但是,如果我正在使用SQLClient命名空间,我可以在上面的任何地方用Odbc替换Sql并且它可以正常工作。我错过了什么?

1 个答案:

答案 0 :(得分:3)

来自OdbcParameter.ParameterName Property

  

ODBC .NET提供程序使用位置而不是命名参数   在语法中用问号(?)标记的参数   命令文本。 OdbcParameterCollection和中的参数对象   存储过程接受的实际参数或   参数化的SQL语句基于对应的对应   OdbcParameter对象插入的顺序   集合而不是参数名称。

这就是为什么你应该使用你的参数;

comm.CommandText = @"SELECT MYTABLE.MYCOLUMN FROM MYSCHEMA.MYTABLE
                     WHERE MYCOLUMN = ?";
comm.Parameters.Add(new OdbcParameter("@MYPARAM",myValue));

实际上,在OdbcParameter constructor中编写参数名称并不重要,因为对于OdbcParameter参数来说,真正重要的是 order

这就是为什么两个底线都适用于您的CommandText,因为您只有一个参数:-)

comm.Parameters.Add(new OdbcParameter("user2320861",myValue));
comm.Parameters.Add(new OdbcParameter("meaningless string",myValue));