【问题标题】:ORA-01460 triggers inconsistent on select statementORA-01460 在 select 语句上触发不一致
【发布时间】: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。我会继续挖掘 ;)

标签: c# asp.net oracle


【解决方案1】:

在数据库上的 ship_id 中添加一个额外的字符点并进行测试。

【讨论】:

  • 然后尝试添加更多具有 3 个字符容器 ID 的案例,我认为 4 个字节不足以容纳 4 个字符代码。 Oracle 就是这么快。
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 2016-02-25
  • 1970-01-01
  • 2017-07-20
  • 2011-02-16
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多