2014-10-10 95 views
0

我嘗試了一切可以在互聯網上找到的工作。我使用VS2013,C#,Oracle.ManagedDataAccess v4(試用oracle.dataaccess.client v14),oracle 11g。ODP.NET參數化查詢不起作用

我明白下面的代碼應該工作(我知道的連接處理,usings等丟失,但我剛剛剝回)

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

} 

如果我硬編碼的值來替換參數,它的作品!

由於查詢沒有返回任何行,因此對「關閉對象的無效操作」失敗。

有人可以幫忙嗎?

感謝您的閱讀。

+0

你有沒有檢查過這個http://stackoverflow.com/questions/17062954/error-with-oracledatareader-error-invalid-operation-the-connection-is-closed? – 2014-10-10 16:05:07

+0

@SergeyMalyutin - 是的,在引入參數之前,數據庫連接沒有問題。我想知道是否有適合11gR2的正確版本的ODAC。 – radiator 2014-10-10 16:31:10

回答

2

你去過這裏下載正確版本的ODP.NET嗎? ODP.NET Home Page

我已經使用了12版本,它適用於11gr2。

轉至下載並單擊此處以下載適用於Visual Studio的Oracle開發工具的ODAC。

幾件事情,以確保你有正確的。 Oracle客戶端和ODP.NET版本必須是32位或64位。不能通過64位ODP跨越32位客戶端,反之亦然。

如果以上是正確的,那麼你確定。我懷疑你是因爲查詢工作硬編碼。

難道是這個嗎? http://www.codeproject.com/Articles/208176/Gotcha-sharp-Using-Named-Parameters-with-Oracl

+0

感謝您的回覆。我現在使用ODP管理的驅動程序而沒有成功。同樣,它適用於所有不含參數的查詢!我嘗試了所有可以在互聯網上找到的內容,包括設置命名參數標誌。任何其他幫助非常感謝 - 再次感謝。 – radiator 2014-10-13 15:15:29

+1

謝謝你。與codeproject的鏈接提供了答案。實質上「在OracleCommand對象上有一個附加屬性BindByName,爲了按名稱綁定參數,必須將其設置爲true」。啊! – glaucon 2015-12-18 20:38:15