ODP.NET参数化查询不起作用

本文关键字:查询 不起作用 参数 NET ODP | 更新日期: 2023-09-27 18:26:17

我已经尝试了在互联网上找到的一切来实现这一点。

我使用的是VS2013、C#、Oracle.ManagedDataAccess v4(已试用Oracle.dataaccess.client v14)、Oracle11g。

我知道下面的代码应该可以工作(我知道缺少连接处理、使用等,但我刚刚把它剥离了)

public CustDetailsModel SelectCustDetails(string CustCode)
{
    string sql;
    OracleDataReader reader;
    OracleConnection OraConn = OraConnection.GetConnection;
        OraConn.Open();
        sql = "SELECT CUSTOMER, NAME, POSTCODE FROM CUSTOMER WHERE CUSTOMER = :CUSTCODE";
        OracleCommand cmd = new OracleCommand(sql, OraConn);
        OracleParameter parameter = cmd.CreateParameter();
        parameter.ParameterName = "CUSTCODE";
        parameter.OracleDbType = OracleDbType.Varchar2;
        parameter.Value = CustCode;
        cmd.Parameters.Add(parameter);
            reader = cmd.ExecuteReader();
            reader.Read();
            return new CustDetailsModel
            {
                Cust = reader.GetString(reader.GetOrdinal("CUSTOMER")),
                CustName = reader.GetString(reader.GetOrdinal("NAME")),
                CustPostCode = reader.GetString(reader.GetOrdinal("POSTCODE")),
            };
}

如果我用硬编码的值替换参数,它就可以工作了!

由于查询未返回任何行,它将失败,并显示"对已关闭对象的无效操作"。

有人能帮忙吗?

感谢阅读。

ODP.NET参数化查询不起作用

您到这里下载正确版本的ODP.NET了吗?ODP.NET主页

我使用了12版本,它适用于11gr2。

转到下载并单击此处下载ODAC和Oracle Developer Tools for Visual Studio。

有几件事要确保你是正确的。oracle客户端和ODP.NET版本必须是相同的32或64位。您不能将32位客户端与64位ODP进行交叉,反之亦然。

如果以上是正确的,那么你的OK。我怀疑你是因为查询是硬编码的。

会是这个吗?http://www.codeproject.com/Articles/208176/Gotcha-sharp-Using-Named-Parameters-with-Oracl