2016-06-07 46 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