我的更新语句如下:wsprintf(sqlstr, L"Update cs set cs.id=?,cs.customer=?,cs.title=?,cs.logo=?,cs.address=?,cs.website=?, \
cs.contact1_last_name=?,cs.contact1_first_name=?,cs.contact1_mobile=?,cs.contact1_fax=?,cs.contact1_email=?, \
cs.contact2_last_name=?,cs.contact2_first_name=?,cs.contact2_mobile=?,cs.contact2_fax=? where cs.id=%d", m_id);
sqlret = SQLExecDirect(h_sqlSTMT, sqlstr, SQL_NTS);
前面以对要更新进去的字段进行绑定,并赋值。当我去掉最后的cs.contact2_fax=? 时就不会出现下面的异常,加上去就有了。它的值有没有什么问题
sqlret = SQLBindParameter(h_sqlSTMT, 15, SQL_PARAM_INPUT, SQL_UNICODE_CHAR, SQL_WCHAR, 15, 0, &CS_fax2, 0, &cb_char);
请问是不是字段太多引起的,因为这个表有22个字段,处理起来很麻烦。LEX_Manager.exe 中的 0x783252f8 (mfc80ud.dll) 处未处理的异常: 0xC0000005: 写入位置 0x00370031 时发生访问冲突
中断的位置是:if( _AtlInterlockedDecrement( &nRefs ) <= 0 )虽然发生了中断,但很奇怪值却照样更新到数据库里面了。请高手帮忙看一下。

解决方案 »

  1.   

    你一共有 16 ? ,即需要BIND 16个参数!
    但你的语句中只提供了 15 个参数。
      

  2.   

    一共15个?吧 绑定的参数个数也对,一共22个字段,绑定了22个变量。
    where cs.id=%d 这个也要绑定参数吗?写到sqlstr中后就变成了where cs.id=11111,所以应该不用绑定一个参数吧。错误就是
    LEX_Manager.exe 中的 0x783252f8 (mfc80ud.dll) 处未处理的异常: 0xC0000005: 写入位置 0x00370031 时发生访问冲突 
    但数据已经写进数据库。谢谢!
      

  3.   

    变量类型与字段类型是否一致?将sqlstr中的内容显示出来看看
      

  4.   

    的确是 15 个 ?, 早上数错了。
    debug 中检查一下  &CS_fax2 的内容是什么。会不会是字符串超长了。
      

  5.   

    的确是 15 个 ?, 早上数错了。
    debug 中检查一下  &CS_fax2 的内容是什么。会不会是字符串超长了。
      

  6.   

    CS_fax2 长度不会有问题,单步的时候看过值了。
    类型也配置,同一组变量,用它们去添加一条记录没有问题。还想确定一下,在网上看了一下,有些地方说,更新的时候要SQLSetPos到要更新的那条记录的位置。
    如果不做这步的话有影响吗?where cs.id=%d时,出来的只会有一条记录。
      

  7.   

    搞定了,谢谢ACMAIN_CHM提醒,是保存查询字符串的变量溢出了。