并非所有变量都已绑定

假如一个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( - 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( - dt.Day).ToString("yyyy-MM-dd 00:00:00"))),
DbAccess.CreateParameter(":EndDate", DbType.DateTime, dt),
DbAccess.CreateParameter(":StartDate", DbType.DateTime,DateTime.Parse(dt.AddDays( - 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( - 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( - 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,它都不是时间,所以肯定报错了。

ef oracle参数化问题的更多相关文章

  1. Oracle参数化查询

    Oracle参数化查询默认是根据顺序绑定的 select * from table where name=:p1 and (select id from table2 where name=:p1); ...

  2. .net core 2.2 EF oracle db first

    Nuget控制台: Install-Package log4net Install-Package Newtonsoft.Json Install-Package Autofac Install-Pa ...

  3. 使用EF Oracle实现DevExpress绑定大数据的ServerMode模式

    前提:需要引入EntityFramework组件,注意几个使用点后使用上其实比较简单. 一.引入Oracle EF支持组建 1.可手动引入附件中的DLL(需手动合并web.config配置) 2.也可 ...

  4. EF+Oracle

    一个小项目,设计到几十张表,但都是简单的增删改查,所以呢,想偷懒用EF. 结果,在.NET4.0下,死活都不行.最后在Oracle官方找到demo,上面清清楚楚的写着必须>NET4.5. 看着E ...

  5. mvc+ef+oracle环境中报错:ORA-00001: 违反唯一约束条件

    分析原因: 在oracle中,主健不能自动生成,不过可以通过“序列”来实现,如果是这样的话,问题很可能就出在“序列”上了: ORACLE表主键ID突然从已经存在的ID值开始自动生成,导致违反主键唯一性 ...

  6. Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字

    报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...

  7. EF Oracle:错误 175

    错误 1 错误 175: 具有固定名称“Oracle.DataAccess.Client”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常. 安装 ...

  8. EF Oracle TNS 连接

    <oracle.manageddataaccess.client> <version number="*"> <settings> <se ...

  9. JMeter实现Oracle参数化(1)

    http://www.ithao123.cn/content-10469577.html

随机推荐

  1. 978. Longest Turbulent Subarray

    A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...

  2. 650. 2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...

  3. poj1125

    题目大意:哎,意思看了半天,看了别人的解释才明白,就是说从一个经纪人出发传递消息,直到所有人都收到消息 也就是说只要找到该经纪人到其它所有点的最短距离中的最大一个时间,就说明最后一个也收到消息了. 而 ...

  4. MySQL实例crash的案例分析

    [作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21 ...

  5. JAVA并发编程学习笔记------结构化并发应用程序

    1. Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程相当于消费者,如果要在程序中实现一个生产者-消费者的设计,最简单的方式通常就是使用Executor 2. Exe ...

  6. SnapKit 类图

     如图上图所示,居于中心的是ConstraintDescription,它用来生成Constraint,最后再转换成系统的NSLayoutConstraint. ConstraintDescript ...

  7. MiniUi-----Spinner 数值调节器(可以实现任意值的递增)

    Spinner 数值调节器可以实现任意值的递增,每次的递增值主要是通过increment="递增值"属性来控制的. 属性 该属性扩展自验证框(validatebox),下面是为微调 ...

  8. TestNG参数

    dependsOnMethods可以使测试用例按某个特定的顺序执行 实例: @Test(dependsOnMethods=“s”) public  void  a() System.out.print ...

  9. vim实践学习

    http://coolshell.cn/articles/5426.html http://www.lagou.com/jobs/138351.html awk:http://coolshell.cn ...

  10. 机器学习实战(一)k-近邻算法

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7593656.html 1.原理 本章介绍机器学习实战的第一个算法——k近邻算法(k Nearest Neighb ...