zoukankan      html  css  js  c++  java
  • ef oracle参数化问题

    并非所有变量都已绑定

    假如一个sql是这样的

     string sql =@" select id  from a where date between :StartDate and :EndDate
     union all 
     select  id  from b where date between :StartDate and :EndDate
    "

    这个时候创建 DbParameter 列表时如果只有两个参数,程序就会报”并非所有变量都已绑定“的错误

               List<DbParameter> dbPara = new List<DbParameter>
                {
               DbAccess.CreateParameter(":StartDate", DbType.DateTime,DateTime.Parse(dt.AddDays(1 - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
                    DbAccess.CreateParameter(":EndDate", DbType.DateTime, dt)
    
                };

    虽然sql中两个变量值一样,但是 defaultDB.Database.SqlQuery<T>(dynamicSql, parameters)执行的时候,应该会重新定义4个不同的变量,所以会报错!

    解决办法很简单,参数列表定义成四个就行了

         List<DbParameter> dbPara = new List<DbParameter>
                {
               DbAccess.CreateParameter(":StartDate", DbType.DateTime,DateTime.Parse(dt.AddDays(1 - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
                    DbAccess.CreateParameter(":EndDate", DbType.DateTime, dt),
          DbAccess.CreateParameter(":StartDate", DbType.DateTime,DateTime.Parse(dt.AddDays(1 - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
                    DbAccess.CreateParameter(":EndDate", DbType.DateTime, dt)
    
                };

    ora-01847:月份中日的值必须介于 1 和当月最后一日之间

    我们都知道,如果sql中参数日期不合法,会报这个错误,但是我程序中,日期都是datetime类型,不存在这种情况,找了好久终于知道什么原因了。

    先看出现错误时的sql和参数列表定义

               List<DbParameter> dbParaBYRY = new List<DbParameter>
                {
                    DbAccess.CreateParameter(":PARM_DANGQIANKS",DbType.AnsiString, YongHuxx.KeShiID),
    
                    DbAccess.CreateParameter(":PARM_KaiShiSJ", DbType.DateTime,DateTime.Parse(dt.AddDays(1 - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
                    DbAccess.CreateParameter(":PARM_JieShuSJ", DbType.DateTime, dt)
                };
    
               sql = @"SELECT TO_CHAR(SFXM_CODE) XiangMuID,
                       FUN_GETYLXMMC(SFXM_CODE) XiangMuMC,
                       SUM(JE) FeiYongJE
                       FROM ZY_PATIENT_INFORMATION A, ZY_TOTAL_FEE B, ZY_BILL_FEE C
                       WHERE A.PATIENT_NO = B.PATIENT_NO
                       AND B.PATIENT_NO = C.PATIENT_NO
                       AND B.JS_NO = C.JS_NO
                       AND PREOUT_DATE BETWEEN :PARM_KaiShiSJ AND :PARM_JieShuSJ
                       AND A.CURR_KS = :PARM_DANGQIANKS
                       GROUP BY SFXM_CODE, FUN_GETYLXMMC(SFXM_CODE)";

    细心的童鞋会发现,参数定义的顺序和sql中出现的顺序反了,我一开始没有意识到这里会出错,参数名字和sql中名字不是一样 吗,不应该时按名字赋值吗,不过一直报上边这个错误,最后抱着试一试的态度,把sql中条件参数顺序调整了,结果成功了!

     List<DbParameter> dbParaBYRY = new List<DbParameter>
                {
                    DbAccess.CreateParameter(":PARM_DANGQIANKS",DbType.AnsiString, YongHuxx.KeShiID),
    
                    DbAccess.CreateParameter(":PARM_KaiShiSJ", DbType.DateTime,DateTime.Parse(dt.AddDays(1 - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
                    DbAccess.CreateParameter(":PARM_JieShuSJ", DbType.DateTime, dt)
                };
    
               sql = @"SELECT TO_CHAR(SFXM_CODE) XiangMuID,
                       FUN_GETYLXMMC(SFXM_CODE) XiangMuMC,
                       SUM(JE) FeiYongJE
                       FROM ZY_PATIENT_INFORMATION A, ZY_TOTAL_FEE B, ZY_BILL_FEE C
                       WHERE A.PATIENT_NO = B.PATIENT_NO
                       AND B.PATIENT_NO = C.PATIENT_NO
                       AND B.JS_NO = C.JS_NO
                       AND A.CURR_KS = :PARM_DANGQIANKS
                       AND PREOUT_DATE BETWEEN :PARM_KaiShiSJ AND :PARM_JieShuSJ
                       GROUP BY SFXM_CODE, FUN_GETYLXMMC(SFXM_CODE)";

    所以我怀疑,这里sqlquery方法执行的时候,应该给变量重新定义临时变量了,结果sql查询按给的参数列表赋值的话,就把:PARM_DANGQIANKS 这个参数值赋值给了:PARM_KaiShiSJ,它都不是时间,所以肯定报错了。

  • 相关阅读:
    5. Fragment详解
    4. 2D绘制与控件绘制
    3、用继承和组合方式定制控件
    2、复杂布局实现
    1、android源代码下载与跟踪
    19、照相机技术
    18、GPS技术
    17、Wi-Fi Direct
    16、蓝牙技术
    15、NFC技术:使用Android Beam技术传输文件
  • 原文地址:https://www.cnblogs.com/yaphetsfang/p/9585578.html
Copyright © 2011-2022 走看看