2016-06-07 48 views
2

我試圖讓我的頭在我的asp.net MVC項目中執行下面的select語句時發生了什麼問題。ORA-01460觸發器在選擇語句上不一致

public static Vessel GetVesselDetails(string vesselId, string outbound, string callnumber) 
    { 
     var vessel = new Vessel {Id = vesselId}; 

     using (var connection = new OracleConnection(_connectionString)) 
     { 
      const string query = @"SELECT * FROM OPS_REPORT.SHIP_VOYAGE WHERE SHIP_ID= :1 AND SHIP_VOYAGE.OUT_VOY_NBR= :2 AND SHIP_VOYAGE.OUT_CALL_NBR = :3"; 
      var command = new OracleCommand(query) { Connection = connection }; 

      command.Parameters.Add("1", OracleDbType.NVarchar2, 5).Value = vesselId; 
      command.Parameters.Add("2", OracleDbType.NVarchar2, 5).Value = outbound; 
      command.Parameters.Add("3", OracleDbType.NVarchar2, 5).Value = callnumber; 

      try 
      { 
       connection.Open(); 
       OracleDataReader dr = command.ExecuteReader(); 
       while (dr.Read()) 
       { 
        vessel.Name = dr["NAME"].ToString(); 
        vessel.LineOperator = dr["LINE_ID"].ToString(); 
        vessel.Service = dr["SERVICE_ID"].ToString(); 
       } 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      { 
       if (connection.State != ConnectionState.Closed) 
       { 
        connection.Close(); 
       } 
      } 
     } 
     return vessel; 
    } 

參數傳遞觸發下面的錯誤,但他們這樣做並不一致。

「ORA-01460:未使用或不合理轉換」

例如,當我運行上述使用以下參數,它運行沒有任何問題。

string vesselId = "DES"; 
string outbound = "16C1"; 
string callnumber = "1"; 

但是參數更改爲以下,則返回ORA-01460異常...

string vesselId = "CGVG"; 
string outbound = "078E"; 
string callnumber = "1"; 

兩個選擇語句很好地工作,當我直接通過蟾蜍與上述值執行它們到數據庫視圖。這讓我更加困惑。

我確定我忽略了簡單的事情,或者以不推薦的方式處理參數聲明。任何指向正確的方式非常讚賞。

我試過在瀏覽一些關於ORA-01460錯誤信息的信息後,改變了設置參數的方式。

command.Parameters.Add(new OracleParameter("1", vesselId)); 
command.Parameters.Add(new OracleParameter("2", outbound)); 
command.Parameters.Add(new OracleParameter("3", callnumber)); 

不是會發生什麼情況是,我在這兩套我的問題總結上述參數發送時收到錯誤消息。

我檢查表上的數據類型爲好,它們是:

SHIP_ID -> VARCHAR2 (4 Byte) 
OUT_VOY_NBR -> VARCHAR2 (5 Byte) 
OUT_CALL_NBR -> VARCHAR2 (1 Byte) 

所有這些都不能爲空。

+0

在黑暗中刺中,但嘗試使用'OracleDbType.Varchar2'而不是'OracleDbType.NVarchar2',這對您的db列類型更爲正確。並且,爲了確認,您是否使用ODP.NET? – sstan

+0

您可能還想聲明您的確切Oracle數據庫服務器版本號(全部5個數字)。 – sstan

+0

感謝您的建議@sstan,當將OracleDbType更改爲Varchar2時,上面的兩個示例都會觸發錯誤。我正在使用Oracle.ManagedDataAccess v12.1。在Oracle數據庫10g企業版版本10.2.0.4.0上運行 – Zephire

回答

0

爲數據庫中的ship_id添加一個額外的字符點並對其進行測試。

+0

感謝@ Arcan3的建議,在數據庫級別,我只能訪問這種情況下的視圖。我無法更改ship_id。 – Zephire

+0

然後嘗試添加3個字符的容器ID的更多案例,我認爲4個字節不足以容納4個字符代碼。 Oracle很快就是這樣。 – Arcan3