大家都没用oracle存取过图片吗?是不是只存图片的路径呀?哪oracle设置的BLOB格式的数据类型干什么用呀?

解决方案 »

  1.   

    可以将图片存到数据库中,也可以只把目录存到数据库中.
    存图片可以通过建pl/sql存储过程实现.
    取图片我没有做过.
      

  2.   

    可以存取图片等任意文件,可通过pro*c来实现。定义三个结构,分别为blob,table,table_ind(存在null值时候使用)。然后通过c的fopen以b方式打开,,fread写入定义好的结构变量中,再用insert语句插入到db中即可。
    读取时,反之。具体主要代码如下:
    typedef struct {
        long    len;
        char    dat[4096000];
    }   archive_t;
    typedef struct {
        long        seq;                                 /* seq NUMBER(6) */
        char        file_name[33];                      /* file_name VARCHAR2(32) */
        ORA_DATE    time_stamp;                          /* time_stamp DATE() */
        long        file_size;                           /* file_size   NUMBER (8) */
        archive_t   archive;                             /* archive LONG RAW() */
    } bs_install_files_t;typedef struct {
        short    seq_Ind;                             /* seq */
        short    file_name_Ind;                       /* file_name */
        short    time_stamp_Ind;                      /* time_stamp */
        short    file_size_Ind;                       /* file_size */
        short    archive_Ind;                         /* archive */
    } bs_install_files_Ind_t;
    bs_install_files_t bs_install_files;
    bs_install_files_Ind_t bs_install_filesInd;EXEC SQL VAR bs_install_files.file_name IS VARCHAR2(32);        
    EXEC SQL VAR bs_install_files.archive   IS LONG VARRAW(4096000);
     
        if( (fp = fopen( FileName, "rb" )) == NULL ) {
            fprintf( stderr, "%s:OPEN ERROR,\n", FileName );
            return -1;
        }
    numread = fread( bs_install_files.archive.dat, sizeof( char ), bs_install_files.archive.len, fp );    EXEC SQL WHENEVER SQLERROR GOTO sql_error;
        EXEC SQL
                insert
                    into    bs_install_files
                    values  (:bs_install_files:bs_install_filesInd)
        ;
        sql_error:
        EXEC SQL WHENEVER SQLERROR CONTINUE;
        printf("%s\n",sqlca.sqlerrm.sqlerrmc);
      

  3.   

    顺便把从数据库写到本地硬盘也加上:定义的结构都一样,主要如下:    memset( &bs_install_files, 0x00, sizeof(bs_install_files) );
        memset( &bs_install_filesInd, 0xff, sizeof(bs_install_filesInd) );
        EXEC SQL
            declare c_bs_install_files cursor for
                select * from
                    bs_install_files;
        EXEC SQL open c_bs_install_files ;
        EXEC SQL
            fetch c_bs_install_files
                into
                    :bs_install_files:bs_install_filesInd;if( (fp = fopen( FileName, "wb" )) == NULL ) {
            fprintf( stderr, "%s:OPEN ERROR,\n", FileName );
            return -1;
        }numwritten = fwrite( bs_install_files.archive.dat, sizeof( char ), bs_install_files.archive.len, fp );
      

  4.   

    有没有诸如INSERT 之类的简单的语句就可以解决的?
      

  5.   

    好像可以以二进制流的形式存储在Blob字段中吧,学习中...