c#程序中调用Oracle存储过程上传二进制文件
2006-09-14 12:49
651 查看
最新做一个新的项目,用到了微软的Enterprise Library库,该库支持SQL和Oracle的统一访问,因此不能用SqlConnectionClient或OracleConnectionClient中自定义的数据类型,只能使用通用的DbType,但是其中的二进制内容只能容纳8K,这对于上传文件或者图片来说,肯定是不够用的,通过仔细研究Oracle的存储过程,自己写了一个无限上传二进制内容的存储过程:
create or replace procedure P_UpdatePhoto( v_img in blob, v_eraseFlag in varchar2, v_employee_id in varchar2 ) is
v_locator_var blob;
v_amount integer := 0;
begin
select PHOTO into v_locator_var from employees where employee_id = v_employee_id FOR UPDATE;
IF( v_locator_var IS NULL ) THEN
UPDATE EMPLOYEES SET PHOTO = EMPTY_BLOB() WHERE EMPLOYEE_ID = v_employee_id;
select PHOTO into v_locator_var from employees where employee_id = v_employee_id FOR UPDATE;
END IF;
if( v_locator_var is not null and v_eraseFlag = '1' ) then
v_amount := DBMS_LOB.getlength( v_locator_var );
IF( v_amount != 0 ) THEN
DBMS_LOB.erase( v_locator_var,v_amount,1);
DBMS_LOB.trim( v_locator_var, 0 );
END IF;
end if;
DBMS_LOB.append( v_locator_var, v_img );
commit;
end P_UpdatePhoto;
然后在程序中调用就简单了,封装一个函数
注:数据访问接口需要Enterprise Library的支持
/**//// <summary>
/// 上传二进制文件
/// </summary>
/// <param name="empId">员工工号</param>
/// <param name="fullName">二进制文件的本地全路径</param>
public void UploadPhoto( string empId , string fullName )
...{
if( empId.Trim().Length == 0 || !File.Exists( fullName ) )
throw new ArgumentException( "员工工号为空或者指定的图片文件不存在" );
const int IMG_SIZE = 7900;
try
...{
System.Collections.ArrayList arrParameters = new System.Collections.ArrayList();
FileStream F_Stream = new FileStream( fullName,FileMode.Open,FileAccess.Read );
Byte[] ImageData = new byte[ F_Stream.Length ];
F_Stream.Read( ImageData , 0 , ( int )F_Stream.Length );
F_Stream.Position = 0;
int size = ImageData.Length % IMG_SIZE == 0 ? ImageData.Length / IMG_SIZE : ImageData.Length / IMG_SIZE + 1 ;
CCBPServices.Parameter prm_eraseFlag = null ,prm_employee_id = null,prm_photo = null;
string strErr = string.Empty;
try
...{
for( int i=0; i< size ; i++ )
...{
arrParameters.Clear();
prm_eraseFlag = new CCBPServices.Parameter( true ,"v_eraseFlag", System.Data.DbType.String , 1 );
prm_employee_id = new CCBPServices.Parameter( true , "v_employee_id" , System.Data.DbType.String ,10 );
prm_employee_id.realValue = empId;
if( i == 0 )
prm_eraseFlag.realValue = "1";
else
prm_eraseFlag.realValue = "0";
Byte[] b = null;
if( i == size - 1 )
b = new Byte[ImageData.Length - i * IMG_SIZE];
else
b = new Byte[IMG_SIZE];
F_Stream.Read( b , 0 ,b.Length );
prm_photo = new CCBPServices.Parameter( true , "v_img",System.Data.DbType.Binary ,b.Length );
prm_photo.realValue = b;
//prm_photo.realValue = b;
arrParameters.Add( prm_photo );
arrParameters.Add( prm_eraseFlag );
arrParameters.Add( prm_employee_id );
Query query = new Query( CommandType.StoredProcedure , "P_UpdatePhoto" , arrParameters , string.Empty );
ExcecuteStoredProc( ref query , ref strErr );
}
}
catch
...{}
F_Stream.Close();
}
catch( Exception ex )
...{
throw ex;
}
}
create or replace procedure P_UpdatePhoto( v_img in blob, v_eraseFlag in varchar2, v_employee_id in varchar2 ) is
v_locator_var blob;
v_amount integer := 0;
begin
select PHOTO into v_locator_var from employees where employee_id = v_employee_id FOR UPDATE;
IF( v_locator_var IS NULL ) THEN
UPDATE EMPLOYEES SET PHOTO = EMPTY_BLOB() WHERE EMPLOYEE_ID = v_employee_id;
select PHOTO into v_locator_var from employees where employee_id = v_employee_id FOR UPDATE;
END IF;
if( v_locator_var is not null and v_eraseFlag = '1' ) then
v_amount := DBMS_LOB.getlength( v_locator_var );
IF( v_amount != 0 ) THEN
DBMS_LOB.erase( v_locator_var,v_amount,1);
DBMS_LOB.trim( v_locator_var, 0 );
END IF;
end if;
DBMS_LOB.append( v_locator_var, v_img );
commit;
end P_UpdatePhoto;
然后在程序中调用就简单了,封装一个函数
注:数据访问接口需要Enterprise Library的支持
/**//// <summary>
/// 上传二进制文件
/// </summary>
/// <param name="empId">员工工号</param>
/// <param name="fullName">二进制文件的本地全路径</param>
public void UploadPhoto( string empId , string fullName )
...{
if( empId.Trim().Length == 0 || !File.Exists( fullName ) )
throw new ArgumentException( "员工工号为空或者指定的图片文件不存在" );
const int IMG_SIZE = 7900;
try
...{
System.Collections.ArrayList arrParameters = new System.Collections.ArrayList();
FileStream F_Stream = new FileStream( fullName,FileMode.Open,FileAccess.Read );
Byte[] ImageData = new byte[ F_Stream.Length ];
F_Stream.Read( ImageData , 0 , ( int )F_Stream.Length );
F_Stream.Position = 0;
int size = ImageData.Length % IMG_SIZE == 0 ? ImageData.Length / IMG_SIZE : ImageData.Length / IMG_SIZE + 1 ;
CCBPServices.Parameter prm_eraseFlag = null ,prm_employee_id = null,prm_photo = null;
string strErr = string.Empty;
try
...{
for( int i=0; i< size ; i++ )
...{
arrParameters.Clear();
prm_eraseFlag = new CCBPServices.Parameter( true ,"v_eraseFlag", System.Data.DbType.String , 1 );
prm_employee_id = new CCBPServices.Parameter( true , "v_employee_id" , System.Data.DbType.String ,10 );
prm_employee_id.realValue = empId;
if( i == 0 )
prm_eraseFlag.realValue = "1";
else
prm_eraseFlag.realValue = "0";
Byte[] b = null;
if( i == size - 1 )
b = new Byte[ImageData.Length - i * IMG_SIZE];
else
b = new Byte[IMG_SIZE];
F_Stream.Read( b , 0 ,b.Length );
prm_photo = new CCBPServices.Parameter( true , "v_img",System.Data.DbType.Binary ,b.Length );
prm_photo.realValue = b;
//prm_photo.realValue = b;
arrParameters.Add( prm_photo );
arrParameters.Add( prm_eraseFlag );
arrParameters.Add( prm_employee_id );
Query query = new Query( CommandType.StoredProcedure , "P_UpdatePhoto" , arrParameters , string.Empty );
ExcecuteStoredProc( ref query , ref strErr );
}
}
catch
...{}
F_Stream.Close();
}
catch( Exception ex )
...{
throw ex;
}
}
相关文章推荐
- c#中使用call调用oracle存储过程并获取out参数值
- Oracle 程序包里 直接调用 存储过程
- 存储过程调用C#编写的DLL文件
- Oracle学习 第30天 C#调用存储过程和语句
- C#调用Oracle的存储过程,其参数为数组类型”中的­Package
- C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try
- oracle 存储过程定义及调试,并最终被C# 调用 代码
- 如何通过java程序调用oracle中的存储过程
- c# .net 调用oracle存储过程学习例子
- c# 调用带有参数的存储过程方法--oracle【转载】
- Oracle中存储过程中赋值和传参及程序调用返回DS
- 求C#上传图片到oracle数据库的存储过程和程序代码。
- C#调用Oracle存储过程并返回结果集
- C#调用Oracle的存储过程,其参数为数组类型
- Oracle存储过程及其java程序调用
- C#调用Oracle的存储过程,其参数为数组类型
- C#程序调用Delphi可执行EXE文件过程
- C#处理MySQL数据库和SQL Server数据库的区别(存储过程的编写与调用、中文乱码、二进制图片存储与调用)
- C#调用Oracle带有out游标参数存储过程的问题
- Oracle分页存储过程以及C#调用