当我在我的asp.net MVC项目中执行以下select语句时,我试图了解出了什么问题。
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";
当我将上述值直接通过Toad执行到数据库视图上时,两个select语句都能正常工作。所以这让我更加困惑。
我确定我忽略了一些简单的事情,或者以不推荐的方式处理参数声明。任何指向正确方向的人都非常感激。
在浏览了有关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)
所有这些都不是Nullable。
答案 0 :(得分:0)
在DB上的ship_id中添加一个额外的字符点并测试它。