"ORA-01460: 转换请求无法实现或不合理"及C#操作Blob总结
class BlobDemo
{
private static readonly string ConnectionString =
"Data Source=Tcco;User ID=scott;Password=tiger;";
public void AddWithProcedure(string file)
{
if (File.Exists(file) == false)
{
return;
}
string strSql = "AddPhoto";
using (OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
OracleCommand cmd = new OracleCommand(strSql, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("vPhoto", OracleType.Blob));
cmd.Parameters[].Value = File.ReadAllBytes(file);//A
cmd.ExecuteNonQuery();
}
}
//方法1
public void AddWithSqlText(string file)
{
if (File.Exists(file) == false)
{
return;
}
//string strSql = "begin insert into blobdemo(Photo) values(:Photo);end;";//B
string strSql = "insert into blobdemo(Pno,Photo) values(pno.nextval,:Photo)"; using (OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
OracleCommand cmd = new OracleCommand(strSql, conn);
cmd.Parameters.Add(new OracleParameter(":Photo", OracleType.Blob));
cmd.Parameters[].Value = File.ReadAllBytes(file);
cmd.ExecuteNonQuery();
}
}
//方法2
public void AddWithProcedure2(string file)
{
if (File.Exists(file) == false)
{
return;
}
string strSql = "AddPhoto";
using (OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
OracleCommand cmd = new OracleCommand(strSql, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("vPhoto", OracleType.Blob)); byte[] arr = null;
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
{
arr = new byte[fs.Length];
fs.Read(arr, , arr.Length);
}
//生成OracleLob类型
OracleCommand cmd2 = conn.CreateCommand(); OracleTransaction tx;
tx = conn.BeginTransaction(); cmd2.Transaction = tx;
cmd2.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
cmd2.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob));
cmd2.Parameters["tempblob"].Direction = ParameterDirection.Output; cmd2.ExecuteNonQuery(); OracleLob tempLob; tempLob = (OracleLob)cmd2.Parameters["tempblob"].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(arr, , arr.Length);
tempLob.EndBatch();
//tx.Commit(); cmd.Parameters[].Value = tempLob;
cmd.Transaction = tx; cmd.ExecuteNonQuery();
}
}
}
在调用存储过程(脚本如下)时出现上述错误AddPhoto,原因:
A处语句将byte[]数组赋给参数,在存储过程执行时,应该有一个转换(猜测):暂且称为byte[]到blob的转换,
而这个转换应该是plsql完成的,如果数组长度大于32767(外来,未证实)的话,就会报上述错误。
那么怎样避免这个错误呢?
方法1:不用存储过程,用sql语句
注:但不能有多个语句,如B处,否则还是报上述错误。
方法2:还是用存储过程,但在赋值前将byte[]转换成OracleLob类型
--创建表
create table BLOBDEMO
(
PHOTO BLOB,
PNO NUMBER()
)
--创建序列
create sequence PNO
minvalue
maxvalue
start with
increment by
nocache;
--创建存储过程
create or replace procedure AddPhoto
(vPhoto in blob)
is
l_pno number();
begin
select pno.nextval into l_pno from dual;
insert into BlobDemo(pno,Photo) values(l_pno,vPhoto);
end;
"ORA-01460: 转换请求无法实现或不合理"及C#操作Blob总结的更多相关文章
- fixed Oracle SQL报错 #ORA-01460: 转换请求无法实施或不合理
最近遇到一个oracle错误,之前并没有遇到过,并不是select in超过1000个导致的,通过网上资料说是oracle版本导致,也有的说是oracle SQL过长导致. 然后通过自己实践应该说是o ...
- AngularJS转换请求内容
在"AngularJS中转换响应内容"中,体验了如何转换响应内容.本篇来体验如何转换请求内容. 主页面通过onSend方法把request对象转递出去. <form name ...
- Logstash:Data转换,分析,提取,丰富及核心操作
Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...
- angular学习笔记(二十五)-$http(3)-转换请求和响应格式
本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transfo ...
- vue实践---根据不同环境,自动转换请求的url地址
一般的项目环境分为:本地环境,测试环境,预发环境,正式环境. 这些环境的域名一般是一样的, 前端请求接口的url也会随着这些环境的变化而改变,手动修改有点麻烦,所以想个办法,让请求的地址根据域名改变而 ...
- C# 提交网页请求时出现如下错误: System.Net.WebException: 操作超时
原因一: 连接超时时间 Timeout 以及写入Post数据超时时间 ReadWriteTimeout 设置得太短,一般要设置大于6000ms. 原因二: Expect100Continue 属性的值 ...
- Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)
前言: 上一章详细阐述了dojo的事件绑定操作,本章将讲解dojo的请求操作 注:dojo的请求操作与js和jquery完全不同! 1.dojo的请求 dojo通过request.get()/.put ...
- springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志
1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...
- 利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
随机推荐
- SQL Server数据库备份方法
数据库备份,是在数据丢失的情况下,能及时恢复重要数据,防止数据丢失的一种重要手段.一个合理的数据库备份方案,应该能够在数据丢失时,有效地恢复重要数据,同时需要考虑技术实现难度和有效地利用资源. 数据库 ...
- VMVare 桥接上网
桥接模式设置小解: 第1步 虚拟机下fedora安装好后,打开VM虚拟机的菜单栏,单击编辑------虚拟网络编辑器,选择“主机虚拟网络 映射”标签,然后把VMnet0 手动选择为你本地的物理网卡(要 ...
- 用JAVASCRIPT获得当前页的来路地址URL的五种方法
var rUrl;rUrl = document.referrer; //获得当前页的来路地址URL rUrl = window.parent.location; //获得父窗口的地址URL rUrl ...
- 关于Inflater
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- 转化成maven dependencis
右键工程--->configure--->convert to maven project
- OpenCV点滴2
明天回家了-- 昨天去见了老师,去之前告诉自己不要紧张,去了后还是紧张了,语无伦次,很没礼貌--(不敢看老师的眼睛) 刚才妈打电话说让我早点回去,不知道为什么,在空荡荡的宿舍里听到妈的声音,眼泪会夺眶 ...
- python with用法
python中with可以明显改进代码友好度,比如: with open('a.txt') as f: print f.readlines() 为了我们自己的类也可以使用with, 只要给这个类增加两 ...
- javac不是内部或外部命令
1.描述 在命令行输入javac,提示“不是内部或外部命令”. 2.解决过程 2.1.解决方案一 2.1.1.检查并添加环境变量 通常就是这个原因导致. 2.1.2.过程一 确实还是环境变量没有写对. ...
- YII 1.0 小功能总结
1.操作成功提示 只能使用一次,getFlash()取值以后,值就删除了 控制器中: Yii::app()->user->setFlash('success','修改成功'); 视图中: ...
- Java线程:条件变量、原子量、线程池等
一.条件变量 条件变量实现了java.util.concurrent.locks.Condition接口,条件变量的实例化就是通过一个Lock对象上调用newCondition()方法获得的,这样条件 ...