解决SQL Server的TEXT、IMAGE类型字段的长度限制

来源:互联网 发布:摩托分期付款怎么算法 编辑:程序博客网 时间:2024/06/08 13:22
http://dev.firnow.com/course/7_databases/sql/sqlServer/2008126/97658.html

 

SQL Server缺省安装时,TEXT、NTEXT、 IMAGE类型字段是有长度限制,如果写入的数据超过限制就会抛出异常,缺省的长度限制是65536,需要修改数据库的全局配置参数: 

exec sp_configure 'max text repl size (B)', '655360' --调整长度限制为655360,增加了10倍
reconfigure --使配置生效

string objData;
.......(略去objData数据的准备工作)

// 构建安全数组
const long lWeiShu = 1;// 安全数组维数
BYTE *pByte;
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[lWeiShu];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = objData.length();

psa = SafeArrayCreate(VT_UI1, lWeiShu, rgsabound);
if(SafeArrayAccessData(psa,(void **)&pByte) == NOERROR)
{
// 将对象数据拷贝进安全数组
memcpy(pByte,&objData[0],objData.length());
}
SafeArrayUnaccessData(psa);

VARIANT varArray;
varArray.vt = VT_ARRAY | VT_UI1;
varArray.parray = psa;

// 将数据更新到数据库中.
FieldPtr fiePtr = objRCRecordset->Fields->GetItem(_variant_t("fieldname"));
fiePtr->AppendChunk(varArray);
VariantClear(&varArray);
///////////////////////////////////////////////////////////////
以上是在addnew情况下可以使用.
如果是存储过程的参数中有text, image等情况. 则上面的代码后面部分要改为
storeprocparamobj->Value = varArray;
/////////////////////////////////////////////////////////////
此外
可以用_variant_t对象代替直接使用 VARIANT结构, 前者可以自动在析构时释放数据.后者需要
自己调用 VariantClear清理.



以上代码适用于TEXT, IMAGE字段类型, 且经过实验.(ado, vc6, win2000, sqlserver2000)

0 0