如何将ole对象(包含jpg、excel、pdf文件)保存到powerbuilder中的文件中



我在oracle中使用powerbuilder ole控件以blob格式保存了数据。

现在我们要将这些blob转换为文件,文件有不同的格式(PDF、JPG、EXCEL、TEXT、DOC)

有超过100万个文件,因此使用olecontrol手动打开和保存并不容易。

我们可以通过脚本自动将blob保存到powerbuilder 中的文件中吗

是的,有可能:

  1. 在PowerBuilder嵌入式SQL中编写一个游标,为blob表中的每条记录获取键和文件扩展名(如果有)。这种东西的语法看起来是这样的:

    Long ll_Key
    String ls_Ext
        DECLARE GetBlobCursor CURSOR FOR  
        SELECT blob_key,   
               blob_extension  
          FROM blob_table  ;
    /* need to loop here while SQLCA.SQLCode is good */
         FETCH GetBlobCursor   
          INTO :ll_Key,   
               :ls_Ext  ;
    
  2. 使用SELECTBLOB嵌入式SQL语句将blob数据获取到PowerBuilder blob变量中:

        Blob lblob_File
    SELECTBLOB fileblob 
      INTO :lblob_File 
      FROM blobtable 
     WHERE blob_key = :ll_Key ;
    
  3. 使用FileOpen和FileWrite写入具有有效文件名和扩展名的blob:

    Long ll_Loops, ll_Step
    Int li_File
    String ls_Path
    ls_Path = "<where do you want me?>." + String(ll_Key) + "." + ls_Ext
    li_File = FileOpen(ls_Path, StreamMode!, Write!, LockWrite!, Append!)
    If li_File > 0 Then
        // Determine how many times to call FileWrite
        ll_FileLen = Len(lblob_File)
        If ll_FileLen > 32765 Then
            If Mod(ll_FileLen, 32765) = 0 Then
                ll_Loops = ll_FileLen/32765
            Else
                ll_Loops = (ll_FileLen/32765) + 1
            End If
        Else
            ll_Loops = 1
        End If
        For ll_Step = 1 To ll_Loops
            FileWrite(li_File,BlobMid(lblob_File,((ll_Step - 1)*32765) + 1, 32765))
        Next
    Else
        //log the error, or handle
    End If
    FileClose(li_File)
    

希望这能让你开始。

最新更新