4.2 大对象的存取方法
1)利用MFC提供的CLongBinary类
    VC存取大对象数据有众多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary类可以方便地实现存取BLOB字段。使用CLongBinary类可以存取超过MAXINT数目的数据,最大为可以得到的内存容量。但数据完全保存在内存中,对超大量数据消耗太大。
2)利用ODBC的SQLGetData和SQLPutData函数
    对于不能存储在单一缓冲区中的数据,在行中的其他数据已被获取之后,可以直接用SQLGetData分批从驱动程序检索这些数据。为了从一列检索长数据,应用程序首先调用SQLFetchScroll或SQLFetch移动一行,并且调用SQLGetData获取绑定列的数据。SQLPutData允许在应用程序语句执行时,把参数或字段送到驱动程序。该函数用来把字符或二进制数值送到字符、二进制或数据源指定类型的字段。它可以传递任何类型的数据,但对字符和二进制数据可传递部分数据、绑定缓冲区并让驱动器从缓冲区中检索数据。3)使用ADO存取BLOB数据
    可以使用ADO中的AppendChunk函数来存取BLOB数据。AppendChunk包含在Field对象中,原型如下:HRESULT AppendChunk (const _variant_t & Data );从函数原型中可以看到关键的问题是需把二进制数据赋值给VARIANT类型的变量。对应于保存数据时我们所使用的AppendChunk函数,读取数据应该使用GetChunk函数,GetChunk的原型如下:_variant_t GetChunk (long Length );给出数据的长度后GetChunk将返回包含数据的VARIANT类型变量,然后我们可以利用SafeArrayAccessData函数得到VARIANT变量中指向数据的char *类型的指针,以方便处理。4.3 数据转换过程中大对象处理方法
    在数据转换中,首先取出源数据源的元数据,判断源数据源和目的数据源中是否存在字段为大对象的类型。对于源数据源中的每个大对象字段的数据,选择相应的大对象读取方法,把此大对象数据取出后保留在一个临时文件中,然后在目的数据库插入数据,遇到大对象字段时,选择相应的大对象存取方法,再从临时文件中依次读出数据插入到指定字段中。

解决方案 »

  1.   

    http://www.programsalon.com/download.asp?type_id=8到GOOGLE上搜索,很多资料
      

  2.   

    我的意思是原图存进数据库之后,读取的时候如果不想把整个图都读出来,而是指定一个范围(比如给定矩形左上角及右下角的坐标),把这个范围内的内容读出来成为一张小图,是不是可行的呢?
    ado里的getchunk()函数好像只能从开头一块一块地读,不能直接指定读中间一块吧?
    从图像中割一小块的算法如果用在blob上,割出来的还是一块图像吗?
    唉,迷惑ing...