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
随机推荐
- docker-compose批量管理docker容器
# docker-compose编排工具 #批量管理(构建.启动容器) #centos7环境准备#安装docker-ce #安装docker-compose v1. sudo curl -o /usr ...
- TOMCAT开启APR模式
Tomcat支持三种接收请求的处理方式:BIO.NIO.ARP. BIO模式:阻塞式I/O操作,表示Tomcat使用传统Java I/O操作.默认情况下,Tomcat7以下版本使用BIO模式运行,由于 ...
- 程序猿的日常——Java基础之equals与hashCode
equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...
- Linux命令学习与使用2
1.Ctrl+a:跳到命令行首 Ctrl+E: 跳到命令行尾 Ctrl+L:清屏2.切换用户 su - 用户名3.更换yum镜像源 1.进入/etc/yum.repos.d 备份CentOS-Base ...
- Android studio 安装的安装若干问题
1.在国内如何更新android sdk? 由于众所周知的某些原因,我们无法直接连接android sdk的更新服务更新sdk,所以可以通过国内的ftp站点把常用的sdk组件如android plat ...
- iOS(Swift)-Runtime之关于页面跳转的捷径【Runtime获取当前ViewController,很常用】
写在前面 在我们操作页面跳转时,如果当前的类不是UIViewcontroller(下面用VC表示),你会不会写一个代理,或者block给VC传递信息,然后在VC里面进行 ///假如targetVc是将 ...
- 【PaddlePaddle系列】手写数字识别
最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...
- 使用TopShelf做windows服务
class Program { static void Main(string[] args) { HostFactory.Run(x => { x.RunAsLocalSystem(); x. ...
- databinding在android studio2.3版本后不再默认支持使用
databinding在android studio2.3版本后不再默认支持使用,需要在项目的app-build-gradle的 dependencies 里面添加 apt 'com.android. ...
- 数据库 -- Oracle常用命令
1.查询账号状态 SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS; 解锁账号 ALTER USER scott ACCOUNT UNLOCK 2.创建表空 ...