您的位置:首页 > 数据库 > Oracle

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;


}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: