Oracle.DataAccess使用问题汇总
2024-09-08 18:35:59
1、使用参数化传参
先看一段sql
select TABLE_COLUMN_NAME
from CSV_PARA_MAPPING
where TABLE_NAME = ':v_tabName'
and CSV_PARA_NAME = ':v_date'
union
select TABLE_COLUMN_NAME
from CSV_PARA_MAPPING
where TABLE_NAME = ':v_tabName'
and CSV_PARA_NAME = ':v_time'
这个写法是错误的,不应该使用单引号。字段TABLE_NAME、CSV_PARA_NAME均是VARCHAR2类型的,但是不要使用单引号。我的理解是传入的参数本身就是带有类型的,没有必要加上单引号以表明这是一个字符串。也就是传入参数的方式不是简单的字符串拼接,而是带有数据类型的。所以正确的写法如下
select TABLE_COLUMN_NAME
from CSV_PARA_MAPPING
where TABLE_NAME = :v_tabName
and CSV_PARA_NAME = :v_date
union
select TABLE_COLUMN_NAME
from CSV_PARA_MAPPING
where TABLE_NAME = :v_tabName
and CSV_PARA_NAME = :v_time
再看一下代码
cmd.Parameters.Add(new OracleParameter("v_tabName", tableName));
cmd.Parameters.Add(new OracleParameter("v_date", dateParaName));
cmd.Parameters.Add(new OracleParameter("v_time", timeParaName));
报错:ORA-01008: not all variables bound,看起来像是没有给参数赋足够的值。有4个参数,但是有2个是重复使用的参数,所以实际上只有3个参数。这里有一个很坑的地方就是,并不会去辨析参数的名字,也就是说2个:v_tabName被认为是不同的参数,给参数赋值时是按照这样的规则,第n个赋的值给第n个参数,根本不看参数的名字。所以当然会报错了。如果想按照参数的名字来赋值的话,需要加上以下语句
cmd.BindByName = true;
最新文章
- my SQL下载安装,环境配置,以及密码忘记的解决,以及navicat for mysql下载,安装,测试连接
- [转]Java连接各种数据库的方法
- [Android Pro] 临时关闭selinux模式 setenforce 0
- 使用soureTree删除分支
- SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程
- Dan计划:重新定义人生的10000个小时
- OpenJudge/Poj 2027 No Brainer
- MySQL注入与防御(排版清晰内容有条理)
- Linux查找和筛选工具
- bzoj 4918: 回文数对
- QT中的相对位置,绝对位置之间的转换(maptoglobal,mapfromglobal)
- vue动态绑定background:url绑不上的问题
- Windows 命令行
- SQLSERVER sa 用户密码修改的方法
- laravel框架基础(2)---laravel项目加载机制
- mysql行转列(多行转一列)
- 关于新加坡IT薪酬和找工作网站
- word 2013 自动保存太慢,下面读条起码3分钟
- layui——上传图片,并实现放大预览
- MDN搜索结果自动跳转中文地址
热门文章
- 在stm32中使用printf
- sqlserver 通过.mdf 和.ldf 恢复数据库
- Software_programming_EnterpriseArch_ServiceWithSingleTonFactory
- nginx转发tomcat之https不生效
- 【Java】BigDecimal
- springboot ElasticsearchRepository date_histogram 聚合查询
- zzul1073_Java
- SQL server自动创建日历表。
- 一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(中)
- vue路由中 Navigating to current location (";/xxx";) is not allowed