运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
来源:互联网 发布:中国 汽车旅馆 知乎 编辑:程序博客网 时间:2024/06/05 17:13
前段时间尝试用了ODBC和ADO连接并上传图片都没能超过32K限制,最近用了OO4O终于解决了这个问题。方法及代码如下:
1 下载客户端
ORACLE官方下载链接:http://download.oracle.com/otn/other/ole-oo4o/ODAC101040.exe
2 安装并配置:
解压后,双击/disk/setup.exe,一路下一步,直到出现如下界面,并按图的顺序一路配置:
图1 直接点下一步
图2 点下一步
图3 在文本内输入服务名
........................
实在贴不动了,依照顺序输入:协议,远程数据库IP,端口,用户名,口令然后点确定,完成 本地NET服务名配置(也可以直接跳过此配置,在以后通过开始->程序->Oracle - OraClient10g_home1->Configuration and Migration Tools->Net Configuration Assistant 工具配置)。
3. 代码:(该代码调试通过)
#include "stdafx.h"
#include <stdlib.h>
#include <oracl.h>
#include <iostream.h>
#include <fstream.h>
// Example for OParameter, OParamArray Raw example
int main()
{
//Initialize oo4o, connect, execute sql
OStartup();
ODatabase odb("NLV", "NLV_GUEST", "GUEST");
if (!odb.IsOpen())
{
cout <<"Connect Error: "<<odb.GetErrorText()<<endl;
return 1;
}
else cout << "Connect DataBase OK!" << endl;
//Init Parameters
OParameterCollection params = odb.GetParameters();
OParameter hpzl = params.Add("hpzl", "5", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter hphm = params.Add("hphm", "粤C00009", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter wfsj = params.Add("wfsj", "2008-08-19 09:04:45", OPARAMETER_INVAR, OTYPE_DATE);
OParameter wfxw = params.Add("wfxw", "16037", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter wfdd = params.Add("wfdd", "60108", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter wfdz = params.Add("wfdz", "新增路口", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter cjjg = params.Add("cjjg", "3707860100", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter sjly = params.Add("sjly", "2", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter zplx = params.Add("zplx", "1", 1, OPARAMETER_INVAR, OTYPE_CHAR);
OParameter sbbh = params.Add("sbbh", "37078610045", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter cdbh = params.Add("cdbh", "", OPARAMETER_INVAR, OTYPE_VARCHAR2);
OParameter clsd = params.Add("clsd", 55, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter dcxs = params.Add("dcxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter kcxs = params.Add("kcxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter xcxs = params.Add("xcxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter dczfxs = params.Add("dczfxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter kczfxs = params.Add("kczfxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter xczfxs = params.Add("xczfxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
OParameter zdxs = params.Add("zdxs", 1, OPARAMETER_INVAR, OTYPE_NUMBER);
// write data to BLOB
fstream fs;
fs.open("c://more_than_32k.jpg", ios::in);
fs.setmode(filebuf::binary);
fs.seekg(0, ios::end);
unsigned long filesize = fs.tellg();
fs.seekg(0, ios::beg);
cout <<"filesize: "<<filesize<<endl;
OBlob b_lob(odb);
unsigned long optchunk = b_lob.GetOptimumChunkSize();
unsigned int bufsize = ((int)(32768/optchunk)) *optchunk;
unsigned char * buffer;
buffer = (unsigned char *)malloc(bufsize);
unsigned long totalwritten = 0;
unsigned long amtread = 0;
int piecetype = OLOB_FIRST_PIECE;
if (filesize <= bufsize)
piecetype = OLOB_ONE_PIECE;
else
b_lob.EnableStreaming(filesize);
while(totalwritten != filesize)
{
fs.read(buffer, bufsize);
amtread = fs.gcount();
b_lob.Write(buffer, amtread, piecetype);
totalwritten = totalwritten + amtread;
if ((filesize - totalwritten)<=bufsize)
piecetype = OLOB_LAST_PIECE;
else
piecetype = OLOB_NEXT_PIECE;
}
b_lob.DisableStreaming();
fs.close();
OParameter zjwj1 = params.Add("zjwj1", b_lob, OPARAMETER_INVAR, OTYPE_BLOB);
OParameter zjwj2 = params.Add("zjwj2", b_lob, OPARAMETER_INVAR, OTYPE_BLOB);
OParameter zjwj3 = params.Add("zjwj3", b_lob, OPARAMETER_INVAR, OTYPE_BLOB);
OParameter zxjg = params.Add("zxjg", 19, OPARAMETER_INOUTVAR, OTYPE_UINT);
OValue oval;
oval.Clear();
zjwj2.SetValue(oval);
zjwj3.SetValue(oval);
unsigned long size = b_lob.GetSize();
printf("blob size = %d/n", size);
oresult r = odb.ExecuteSQL("BEGIN nlv_cache.nlv_package.pro_tgs(:hpzl, :hphm, :wfsj, :wfxw, :wfdd, :wfdz, :cjjg, :sjly, :zplx, :sbbh, :cdbh, :clsd, :dcxs, :kcxs, :xcxs, :dczfxs, :kczfxs, :xczfxs, :zdxs, :zjwj1, :zjwj2, :zjwj3, :zxjg);END;");
if (r == OFAILURE)
{
cout <<"Execute Error: "<<odb.GetErrorText()<<endl;
return 1;
}
int ret;
zxjg.GetValue(&ret);
printf("ZXJG = %d/n", ret);
odb.Close();
return 0;
}
4. 完成
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- ORACLE 本地数据库存储过程 调用远程数据库存储过程
- java调用Oracle数据库的存储过程
- dede中上传图片文件失败的解决过程
- ORACLE存储过程调用存储过程时commit的问题
- 解决在Windows 2003中无法上传超过200K文件以及无法下载超过4M的文件问题
- SQL server触发器、存储过程操作远程数据库插入数据,解决服务器已存在的问题
- 解决Ruby的Oracle接口读写超过4K字符串的问题
- sql server 2008 安装中遇到的问题之Sql Server服务远程过程调用失败解决
- oracle 父存储过程调用子过程的事务问题
- oracle 父存储过程调用子过程的事务问题
- 在Oracle的存储过程中使用dblink调用远程存储过程备忘
- Oracle存储过程的调用
- Oracle存储过程的调用
- Oracle存储过程的调用
- Oracle存储过程的调用
- 数据库存储过程的调用
- 作业真的成功了吗?_链接服务器远程存储过程调用失败
- qq2440上移植u-boot(部分),解决蜂鸣器长鸣
- NetBeans 时事通讯(刊号 # 24 - Sep 02, 2008 )
- C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 您应该知道的十种 XML 模式
- 打开模式对话框
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- PKU3067 Japan - 树状数组
- 如何快速切换网络设置 zz
- 大家好-技术文章不断曾新中
- 军训第二天
- Asp.net中防止用户多次登录的方法
- PHP 编程标准
- 近两日,ET消息解读!
- 网络给我带来了什么 我对他有爱有恨