【发布时间】:2016-06-07 13:21:02
【问题描述】:
当我在我的 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)
它们都不能为空。
【问题讨论】:
-
暗中尝试,但尝试使用
OracleDbType.Varchar2而不是OracleDbType.NVarchar2,这对于您的数据库列类型更正确。并且,确认一下,您使用的是 ODP.NET 吗? -
您可能还想说明您的确切 Oracle 数据库服务器版本号(全部 5 个数字)。
-
感谢@sstan 的建议,将 OracleDbType 更改为 Varchar2 时,上述两个示例都会触发错误。我正在使用 Oracle.ManagedDataAccess v12.1。在 Oracle 数据库 10g 企业版 10.2.0.4.0 版上运行
-
我一直在使用另一个站点上建议的输入参数。将它们从字符串更改为字符数组,但保持相同的错误,问题示例中的第一组参数运行没有问题,第二组参数触发 ORA-01460。我会继续挖掘 ;)