vc++ 写入数据库

just51living 2008-11-18 12:11:52
我用VC++ OLEDB方式写入数据库 不知道为什么每次写入的时候都只能写入一行 写第二行就插入失败了,数据时从LISTCTRL控件中读取的,数据正常,可每次只能莫名的写入一行数据,请教大家下到底是什么地方出错了 不胜感激 主要代码如入
for(int iRow= 0;iRow != iCount;iRow++){

DWORD dwInfoSize;
CString lpwszInfo;

memset(pData, 0, dwOffset);

for (dwCol = 0; dwCol < dwBindingSize; ++dwCol){

if(dwCol == 0)
lpwszInfo = strOrderID;

else if(dwCol == 1)
lpwszInfo = m_TableNo;

else if(dwCol == 2)
lpwszInfo = m_ListCtrl.GetItemText(iRow,0);

else if(dwCol == 3)
lpwszInfo = m_ListCtrl.GetItemText(iRow,3);

switch(prgBinding[dwCol].wType){

case DBTYPE_WSTR://字符串
dwInfoSize = prgBinding[dwCol].cbMaxLen/sizeof(WCHAR) - 1;
wcscpy((WCHAR*)(pData+prgBinding[dwCol].obValue), lpwszInfo);

*(ULONG*)(pData+prgBinding[dwCol].obLength)= wcslen((WCHAR*) (pData+prgBinding[dwCol].obValue))*sizeof(WCHAR);

*(DBSTATUS*)(pData+prgBinding[dwCol].obStatus = DBSTATUS_S_OK
break

default:
break;
}
}

hr = IRowsetChange>InsertRowDB_NULL_HCHAPTER,hAccessor,pData, prghRows);

if (FAILED(hr)){
AfxMessageBox(_T("InsertRow Fail!"));
goto Abort;
}

// Get the row data
hr = pIRowset->GetData(rghRows[0], hAccessor, pData);
if(FAILED(hr)){
AfxMessageBox(_T("GetData Fail!"));
goto Abort;
}

// Release the rowset
hr = pIRowset->ReleaseRows(1, prghRows, NULL, NULL, NULL);
if(FAILED(hr)){
goto Abort;
}

prghRows[0] = DB_NULL_HROW;
}

// Commit the transaction
if (pITxnLocal){
pITxnLocal->Commit(FALSE, XACTTC_SYNC, 0);
}
...全文
281 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhyinty 2008-11-21
  • 打赏
  • 举报
回复
前些时间才写了一个数据库相关的系统,项目要交,没办法,写了之后再也不想搞数据库了
就呆在云上 2008-11-21
  • 打赏
  • 举报
回复
这问题到mfc板块应该可以很快的被解决的
要不你换一个数据库的操作接口?
或者是用ado.net试试
wryse 2008-11-21
  • 打赏
  • 举报
回复
我以前用C++写过一个操作数据库的东西,遇到过类似LZ所说的问题。当时我的情况是写入一条记录后再写第二条时程序报错退出。调试的时候发现在写完一条记录后有个用于执行操作的对象(好像是个句柄?隔的时间长了记不清了)在做完操作后莫名其妙变成了null……当时因为完全不知道怎么回事,就在做操作前把那个对象复制了一份,每做完一次操作就重新赋一次,虽然很恶心但最后也算是解决问题了……LZ的代码我估计是没时间看了,所以也只能这么说说,你可以调试一下看看是不是类似的问题……
xianyuxiaoqiang 2008-11-21
  • 打赏
  • 举报
回复
呵呵。帮顶。
CA_HA_M 2008-11-20
  • 打赏
  • 举报
回复
OLEDB方式是最难的方式,现在用ADO方式居多,其实也是用OLEDB封装好的,效率并不比OLEDB方式差多少。不过也挺佩服lz的,现在许多程序员都懒了,有简单的就不想用复杂,不过用复杂也能学到更多的东西。 只能帮你顶了。
星羽 2008-11-19
  • 打赏
  • 举报
回复
up :)
bbb332 2008-11-19
  • 打赏
  • 举报
回复
我也很想知道呀!!
just51living 2008-11-19
  • 打赏
  • 举报
回复
没有人解答啊
太乙 2008-11-18
  • 打赏
  • 举报
回复
upup~~~~
hai040 2008-11-18
  • 打赏
  • 举报
回复
数据库返回什么错
Longinc 2008-11-18
  • 打赏
  • 举报
回复
帮顶
yangkunjie 2008-11-18
  • 打赏
  • 举报
回复
真的不想up
just51living 2008-11-18
  • 打赏
  • 举报
回复
在插入第二行执行hr = IRowsetChange>InsertRow(DB_NULL_HCHAPTER,hAccessor,pData,prghRows)后判断下FAILED(hr)的值 就退出了 第一次写入完全正常
just51living 2008-11-18
  • 打赏
  • 举报
回复
在插入第二行执行hr = IRowsetChange>InsertRowDB_NULL_HCHAPTER,hAccessor,pData,prghRows)后判断下FAILED(hr)的值 就退出了

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧