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( - 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参数化问题的更多相关文章
- Oracle参数化查询
Oracle参数化查询默认是根据顺序绑定的 select * from table where name=:p1 and (select id from table2 where name=:p1); ...
- .net core 2.2 EF oracle db first
Nuget控制台: Install-Package log4net Install-Package Newtonsoft.Json Install-Package Autofac Install-Pa ...
- 使用EF Oracle实现DevExpress绑定大数据的ServerMode模式
前提:需要引入EntityFramework组件,注意几个使用点后使用上其实比较简单. 一.引入Oracle EF支持组建 1.可手动引入附件中的DLL(需手动合并web.config配置) 2.也可 ...
- EF+Oracle
一个小项目,设计到几十张表,但都是简单的增删改查,所以呢,想偷懒用EF. 结果,在.NET4.0下,死活都不行.最后在Oracle官方找到demo,上面清清楚楚的写着必须>NET4.5. 看着E ...
- mvc+ef+oracle环境中报错:ORA-00001: 违反唯一约束条件
分析原因: 在oracle中,主健不能自动生成,不过可以通过“序列”来实现,如果是这样的话,问题很可能就出在“序列”上了: ORACLE表主键ID突然从已经存在的ID值开始自动生成,导致违反主键唯一性 ...
- Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字
报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...
- EF Oracle:错误 175
错误 1 错误 175: 具有固定名称“Oracle.DataAccess.Client”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常. 安装 ...
- EF Oracle TNS 连接
<oracle.manageddataaccess.client> <version number="*"> <settings> <se ...
- JMeter实现Oracle参数化(1)
http://www.ithao123.cn/content-10469577.html
随机推荐
- Django安装(第一个项目)
day60 从系统中选择已存在的解释器. 新建Django项目 命令行创建: django-admin startproject mysite ...
- Java直接内存与非直接内存性能测试
什么是直接内存与非直接内存 根据官方文档的描述: A byte buffer is either direct or non-direct. Given a direct byte buffer, t ...
- C#之初识单例模式
当我们使用QQ的时候就会发现,他可以启动多个QQ,但是有时候,我们不想这样做,这时候我们就需要使用到单例模式. 1.将Form2的构造函数转为私有 using System.Windows.Forms ...
- python3模块: sys
一.简介 sys模块用于提供对python解释器的相关操作. 二.常用函数 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules 返回系统导入的模块字段,key是模块 ...
- git问题--Push rejected: Push to origin/master was rejected
解决git问题 Push rejected: Push to origin/master was rejected 意思是git拒绝合并两个不相干的东西 此时你需要在打开Git Bash,然后进入相应 ...
- python 查找字符串中字母的个数
2017.6.17 更新:好像知道错在哪里了.以第一个为例,输入应该是“AHHaaBBa”,因为直接输入AHHaaBBa时,系统不知到这是一个变量还是字符串,所以必须输入的时候申明定义.既然这样的话, ...
- HTTP请求头及其作用 转
HTTP请求头Header及其作用详解 下面是访问的一个URL,http://www.hzau.edu.cn的一个header,根据实例分析各部分的功能和作用. 1.Accept,浏览器端能够处理的内 ...
- Spark安装过程
Precondition:jdk.Scala安装,/etc/profile文件部分内容如下: JAVA_HOME=/home/Spark/husor/jdk CLASSPATH=.:$JAVA_HOM ...
- (转)在 WebSphere Application Server 中修改主机名称并迁移概要文件
原文:https://www.ibm.com/developerworks/cn/websphere/techjournal/0905_webcon/0905_webcon.html 修改主机名 让我 ...
- 第7章—SpringMVC高级技术—处理multipart形式的数据
处理multipart形式的数据 MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 Multip ...