【问题标题】:Oracle Invalid NumberOracle 无效号码
【发布时间】:2018-08-13 05:39:54
【问题描述】:

我正在尝试在日期之间搜索并进行分页。但我收到错误“ORA-01722:无效号码” 我该如何解决这个谢谢。

 public IEnumerable<LaboratuvarTest> ListePagingTariheGore(int SAYFA, DateTime tarihbaslangic, DateTime tarihbitis)
    {
        string tarihbas = tarihbaslangic.ToString("dd-MM-yyyy");
        string tarihbit = tarihbitis.ToString("dd-MM-yyyy");
        DateTime b = tarihbaslangic.ToLocalTime();
        DateTime d = tarihbitis.Date;
        if (!connection.Baglan()) return null;
        OracleCommand cmd = new OracleCommand();
        cmd.CommandText = "SELECT * FROM(SELECT a.*, rownum r__ FROM(SELECT ID,BARKOD,RUTUBET,COPSAP,OKSIDEEDILMEMISPARCA,VOLUM,DUYUSALANALIZ,DUSUNCELER,TADIM,AMBALAJKONTROL,KASAYADOKULENCAY,SELULOZ,EKSTRAT,DURUM FROM HAR_TBLLABORATUVARTEST WHERE DURUM = 1 AND TESTTARIHI BETWEEN TO_CHAR(:p2, 'dd/mm/yyyy') AND TO_CHAR(:p3, 'dd/mm/yyyy') ORDER BY TESTTARIHI DESC )a WHERE rownum < ((:p1 * 5) + 1) ) WHERE r__ >= (((:p1 - 1) * 5) + 1)";
        cmd.Parameters.Add("p1", SAYFA);
        cmd.Parameters.Add("p2", tarihbas);
        cmd.Parameters.Add("p3", tarihbit);
        cmd.Connection = connection.con;

        OracleDataReader reader = cmd.ExecuteReader();
        List<LaboratuvarTest> list = new List<LaboratuvarTest>().FromDataReader(reader).ToList();
        connection.BaglantiKapat();
        return list; ;
    }

'ORA-01722: 无效号码'

ID  NUMBER(5,0)
BARKOD  VARCHAR2(50 BYTE)
RUTUBET NUMBER(8,0)
COPSAP  NUMBER(8,0)
OKSIDEEDILMEMISPARCA    NUMBER(8,0)
VOLUM   NUMBER(8,0)
DUYUSALANALIZ   NUMBER(8,0)
DUSUNCELER  VARCHAR2(500 BYTE)
TADIM   VARCHAR2(500 BYTE)
AMBALAJKONTROL  VARCHAR2(500 BYTE)
KASAYADOKULENCAY    NUMBER(3,0)
SELULOZ VARCHAR2(50 BYTE)
EKSTRAT VARCHAR2(50 BYTE)
TESTTARIHI  DATE
KULLANICIREF    NUMBER(5,0)
DURUM   NUMBER(1,0)

这张桌子

{01.08.2018 00:00:00} {14.08.2018 00:00:00} 这些日期即将生效。

当我在里面运行第一个选择查询时我可以选择,但是这 3 个不能一起运行,idk 为什么

【问题讨论】:

  • 您需要为查询中使用的所有字段提供列类型。 Invalid number 错误消息可能出于多种不同原因弹出。
  • 帮助我们帮助您 - 请分享表格的定义

标签: oracle datetime model-view-controller


【解决方案1】:

您绑定到查询的tarihbastarihbit 参数已经是字符串,您不应在它们上调用to_char。事实上,你根本不应该在那里使用字符串——你应该直接使用日期:

TESTTARIHI BETWEEN :p2 AND p3

并将tarihbaslangictarihbitis分别绑定为p2p3

【讨论】:

  • ORA-00932: 不一致的数据类型:预期 DATE 得到 NUMBER' 这个错误马上就会出现
【解决方案2】:

您正在使用的 oracle 查询需要更正。 确保 :p2 和 :p2 绑定变量是格式为 'dd/mm/yyyy' 的字符串;

SELECT * FROM(SELECT a.*, rownum r__ FROM(SELECT ID,BARKOD,RUTUBET,COPSAP,OKSIDEEDILMEMISPARCA,VOLUM,DUYUSALANALIZ,DUSUNCELER,TADIM,AMBALAJKONTROL,KASAYADOKULENCAY,SELULOZ,EKSTRAT,DURUM FROM HAR_TBLLABORATUVARTEST WHERE DURUM = 1 AND TESTTARIHI BETWEEN TO_DATE(:p2, 'dd/mm/yyyy') AND TO_DATE(:p3, 'dd/mm/yyyy') ORDER BY TESTTARIHI DESC )a WHERE rownum < ((:p1 * 5) + 1) ) WHERE r__ >= (((:p1 - 1) * 5) + 1)

【讨论】:

    【解决方案3】:

    您已将参数定义为字符串,并像这样填充它们:

    tarihbas = tarihbaslangic.ToString("dd-MM-yyyy")
    

    但是,当您在查询中使用它们时,您会尝试再次将它们转换为字符串:

    TESTTARIHI BETWEEN TO_CHAR(:p2, 'dd/mm/yyyy') and TO_CHAR(:p3, 'dd/mm/yyyy') 
    

    由于它们已经是字符串并且 TESTTARIHI 是日期,因此将它们转换为日期会更有意义:

    TESTTARIHI BETWEEN TO_date(:p2, 'dd-mm/yyyy') and TO_date(:p3, 'dd-mm-yyyy')
    

    最好将参数作为 DATE 传递并完全避免数据类型转换的需要。

    【讨论】:

      【解决方案4】:

      你可以像这样改变数据解析

      DateTime.Parse(dr["TARIH"].ToString()).ToString("dd-MM-yy");

      【讨论】:

        【解决方案5】:

        我解决了这个问题。这是因为参数的顺序。 cmd.Parameters.Add("p1", tarihbas); cmd.Parameters.Add("p2", tarihbit); cmd.Parameters.Add("p3", SAYFA); 在这种风格下它会起作用。好烦人的错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-03
          • 2019-08-09
          • 2014-08-09
          • 1970-01-01
          • 2023-03-15
          • 2020-05-09
          相关资源
          最近更新 更多