惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
V
Visual Studio Blog
P
Privacy International News Feed
月光博客
月光博客
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
T
Threatpost
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
小众软件
小众软件
L
LINUX DO - 最新话题
C
Cisco Blogs
T
Troy Hunt's Blog
Schneier on Security
Schneier on Security
酷 壳 – CoolShell
酷 壳 – CoolShell
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
博客园 - 叶小钗
罗磊的独立博客
V
V2EX
博客园 - Franky
P
Proofpoint News Feed
SecWiki News
SecWiki News
腾讯CDC
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
PCI Perspectives
PCI Perspectives
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
aimingoo的专栏
aimingoo的专栏
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题

博客园 - noahsky

Connection to https://dl-ssl.google.com refused 由于线程停在某个无法进行垃圾回收的点(可能是因为已对代码进行了优化),因此无法计算表达式的值的解决 3.1,ASP.NET MVC控制器概述(C#) [翻译]ASP.NET MVC 指南 你被移动增值了吗? sql2005数据库,在新增或更新数据时出现超时现象 关于c#的连接池(以OracleConneciton为例) 使用Access时,碰到的没有解决的问题 System.IO.DirectoryNotFoundException: 未能找到路径“....”的一部分 少一个逗号出的错误 Web上传文件的原理及实现[转] (翻译)从底层了解ASP.NET体系结构 [转] HTTP请求过程简介[转] Http 请求处理流程[转] sql2000安装在win2003后只有在本机才能访问,局域网内其他机器不能访问 sql2000数据库在企业管理器中显示置疑(suspect),在查询分析器不显示。在企业管理器中附加:提示错误823 .net 必知 面向对象 C# 比较牛的代码
"ORA-01460: 转换请求无法实现或不合理"及C#操作Blob总结 - noahsky - 博客园
noahsky · 2010-01-28 · via 博客园 - noahsky

代码

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[
0].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[
0].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, 
0, 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, 
0, arr.Length);
                tempLob.EndBatch();
                
//tx.Commit();

                cmd.Parameters[
0].Value = tempLob;
                cmd.Transaction 
= tx;

                cmd.ExecuteNonQuery();
            }
        }
}

在调用存储过程(脚本如下)时出现上述错误AddPhoto,原因:
A处语句将byte[]数组赋给参数,在存储过程执行时,应该有一个转换(猜测):暂且称为byte[]到blob的转换,
而这个转换应该是plsql完成的,如果数组长度大于32767(外来,未证实)的话,就会报上述错误。
那么怎样避免这个错误呢?

方法1:不用存储过程,用sql语句
 
注:但不能有多个语句,如B处,否则还是报上述错误。
方法2:还是用存储过程,但在赋值前将byte[]转换成OracleLob类型

附sql语句:

代码

--创建表
create table BLOBDEMO
(
  PHOTO BLOB,
  PNO   
NUMBER(18)
)
--创建序列
create sequence PNO
minvalue 
1
maxvalue 
9999999999999999999999999
start 
with 27
increment 
by 1
nocache;
--创建存储过程
create or replace procedure AddPhoto
(vPhoto 
in blob)
is
l_pno 
number(18);
begin
select pno.nextval into l_pno from dual;
insert into BlobDemo(pno,Photo) values(l_pno,vPhoto);
end;