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

问题描述 投票:0回答:1

我已经尝试了我可以在互联网上找到的所有东西,让它工作。

我正在使用VS2013,C#,Oracle.ManagedDataAccess v4(试过oracle.dataaccess.client v14),oracle 11g。

我理解以下代码应该可以工作(我知道连接处理,使用等等都丢失了,但我刚刚将其剥离)

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")),
            };

}

如果我用硬编码的值替换参数,它的工作原理!

它失败并显示“对关闭对象的无效操作”,因为查询未返回任何行。

有人可以帮忙吗?

谢谢阅读。

c# oracle odp.net
1个回答
2
投票

你有没有去过这里下载正确版本的ODP.NET?ODP.NET Home Page

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

转到下载并单击此处使用适用于Visual Studio的Oracle Developer Tools下载ODAC。

确保你有正确的几件事。 oracle客户端和ODP.NET版本必须是32位或64位相同的位。您不能使用64位ODP跨越32位客户端,反之亦然。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.