我在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
并且它可以正常工作。我错过了什么?
答案 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));