并非所有变量都已绑定

假如一个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. sublime 把 tab 转成 4 个空格

    Preferences -> Settings-User {    "tab_size":4,    "translate_tabs_to_spaces" ...

  2. Storm-kafka源码分析之Config相关类

    要创建一个KafkaSpout对象,必须要传入一个SpoutConfig对象,KafkaSpout的构造函数定义如下: public KafkaSpout(SpoutConfig spoutConf) ...

  3. nginx并发连接控制模块ngx_http_limit_conn_module

    模块: ngx_http_limit_conn_module 作用: 根据定义的key限制并发连接数 配置示例: http { limit_conn_zone $binary_remote_addr ...

  4. android平台一些常用代码

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. SpringMVC整合kaptcha(验证码功能)

    一.依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha& ...

  6. 解决ORA-21561: OID generation failed

    解决ORA-21561 在linux上使用sqlplus连接oracle数据库 [root@china ~]# sqlplus test/test@ORCL SQL Production :: Cop ...

  7. Linux下面安装swoole

    需要安装php7 新建一个文件夹,作为存储swoole的文件夹 然后执行下面相对应的命令,这里是我执行的命令 新建文件夹 mkdir swoole 切入到文件夹中,进行下载安装包 wget http: ...

  8. 剑指offer六十之按之把二叉树打印成多行

    一.题目 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.二.思路 队列LinkedList完成层序遍历,用end记录每层结点数目 三.代码 import java.util.Arra ...

  9. Netty核心概念(5)之Channel

    1.前言 上一节讲了Netty的第一个关键启动类,启动类所做的一些操作,和服务端的channel固定的handler执行过程,谈到了不管是connect还是bind方法最终都是调用了channel的相 ...

  10. python独立环境——virtualenv

    安装: pip3 intall virtualenv   创建独立运行环境: 1. 进入项目文件夹根目录 2. 创建环境 Mac:myproject michael$ virtualenv --no- ...