OLEDB技术是微软提供的一套非常强悍的面向不同数据源的数据库接口,而我所接触的开发人员中使用的人并不多,大部分使用基于OLEDB的ADO方式进行数据库操作。使用OLEDB操作普通字段的资料在网上很常见,而关于BLOB,CLOB大字段的操作却比较少。现在我们就来聊聊使用C++对OLEDB的大字段操作的一些总结和心得。
一,大字段绑定
使用OLEDB操作数据之前要进行列绑定,实际准备一块内存结构,与数据库相对,将我们要获取的数据直接放到准备好的内存结构中。普通字段的绑定比较简单,大致过 程如下
DBBINDING * rgBindings = new DBBINGING(cColumns * sizeof(DBBINDING));
//根据列信息 填充绑定结构信息数组
for( iCol = 0; iCol < cColumns; iCol++ )
{
<span style="white-space:pre"> </span>rgBindings[iCol].iOrdinal = rgColumnInfo[iCol].iOrdinal;
<span style="white-space:pre"> </span>rgBindings[iCol].dwPart = DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS;
<span style="white-space:pre"> </span>rgBindings[iCol].obStatus = dwOffset;
<span style="white-space:pre"> </span>rgBindings[iCol].obLength = dwOffset + sizeof(DBSTATUS);
<span style="white-space:pre"> </span>rgBindings[iCol].obValue = dwOffset+sizeof(DBSTATUS)+sizeof(ULONG);
<span style="white-space:pre"> </span>rgBindings[iCol].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
<span style="white-space:pre"> </span>rgBindings[iCol].eParamIO = DBPARAMIO_NOTPARAM;
<span style="white-space:pre"> </span>rgBindings[iCol].bPrecision = rgColumnInfo[iCol].bPrecision;
<span style="white-space:pre"> </span>rgBindings[iCol].bScale = rgColumnInfo[iCol].bScale;
<span style="white-space:pre"> </span>rgBindings[iCol].wType = DBTYPE_WSTR;//rgColumnInfo[iCol].wType;<span style="white-space:pre"> </span>//强制转为WSTR
<span style="white-space:pre"> </span>rgBindings[iCol].cbMaxLen = rgColumnInfo[iCol].ulColumnSize * sizeof(WCHAR);
<span style="white-space:pre"> </span>dwOffset = rgBindings[iCol].cbMaxLen + rgBindings[iCol].obValue;
<span style="white-space:pre"> </span>// 可以对dwOffset设定字节对齐
}
// 完成绑