c#程序中调用Oracle存储过程上传二进制文件

来源:互联网 发布:l800清零软件中文版 编辑:程序博客网 时间:2024/05/22 14:04

最新做一个新的项目,用到了微软的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
                
{
                    
forint 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;
            }

        }
原创粉丝点击