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
随机推荐
- 741. Cherry Pickup
In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...
- iterm2 恢复默认设置
如果你设置了Iterm2的默认字体,然后感觉不好看又忘记默认字体是什么的时候 执行如下命令,重新启动iTerm2即可: defaults delete com.googlecode.iterm2
- C++中将二维数组(静态的和动态的)作为函数的参数传递
在C++编程中,我们经常将数组作为参数传递到另一个函数,数组的维数不同,传递方式也不同,此处将作一个总结,包括一维静态.动态数组,二维静态.动态数组. 一,一维数组(静态.动态一维数组) 1, 一维数 ...
- protobuffer php使用
protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点 protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序 alle ...
- 用AR.js实现webAR(新手入门)
开发需要准备的东西: ** 域名 命名 这里是测试
- 用asp.net core 2.0 + EFCore.Sqlite做个小网站
许久没用C#写程序.听说进来发生大事,.NetCore2.0发布了,于是便学习了下,本站也应运而生. 大多数的地方按照官方的文档起步走就可以了,这里谈谈遇到的几个坑. 首先,本站是基于ASP.NetC ...
- 【数组】Next Permutation
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- Windows里如何正确安装Redis以服务运行(博主推荐)(图文详解)
不多说,直接上干货! 注意 : Redis官方并没有提供Redis的windows安装包,但在github上, 有相关的下载地址. 一.Redis的下载地址 相关的下载地址,如下: ...
- Struts 2初体验
Struts2简介: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- 纯代码实现信号槽
失败,系统找不着槽 #include<QtGui> int main(int argc, char * argv[]) { QApplication app(argc, argv); QT ...