我想,可能是在用where语句时,系统建立了什么临时对象,
再关闭时,没有删除!

解决方案 »

  1.   

    死的时候到call stack中去看看,能找到具体的语句
    就知道什么原因了,赶快给分吧
      

  2.   

    下面的就是出错的代码!UpdateData();
    if (m_bh == "")
      m_name = "";
    else
    {
      strCmd.Format (_T("SELECT * FROM ygzl WHERE bh = '%s'"), m_bh);
      //strCmd.Format (_T("SELECT * FROM ygzl"));
      m_gz_ygzl.Open (m_app->m_session , strCmd);
      if (m_gz_ygzl.MoveFirst () != S_OK)
      {
        AfxMessageBox ("不存在该编号员工!");
        m_name = "";
      }
      else
      {
        m_name = m_gz_ygzl.m_name ;
      }
      m_gz_ygzl.Close ();
    }
    UpdateData (FALSE);如果把sql语句换成,注释掉的那行,关闭应用程序得时候就不会出错!
    问题是这段代码在执行得时候,是没有一点问题得!运行很正常!我现在正在卸载系统,重新安装vc,看看,是否系统出了故障!
      

  3.   

    你把 % 去掉,换成"SELECT * FROM ygzl WHERE bh = 's'"
    试试
      

  4.   

    我知道,你这里是 % 是模糊匹配的,问题是,在 c 里 % 需要用 %% 来代替。
    直接用 % 是不对的,所以我让你把 % 去掉就看出问题在哪了,解决的办法在前
    一个帖子里。
    你可以把下面两段程序分别运行一下

        char * aaa="test set text %%s";
        printf(aaa);
    2
        char * aaa="test set text %s";
        printf(aaa); 你看看是什么结果?本事不大脾气不小!
      

  5.   

    pitchstar(一站), 说你连%起什么作用都不知道,正是一点都不错。看看CString 的用法吧
      

  6.   

    呵呵~~别打架。
    你试试这样行不行:
    strCmd.Format (_T("SELECT * FROM ygzl WHERE bh = "+m_bh+");
      
      

  7.   

    关键现在在 where bh = '%s'上, 有无高手来给出一个合理的说法啊??
      

  8.   

    如果你用的是PB,我想你肯定要给我100分了,这个问题在PB中太简单了
      

  9.   

    数据集成功打开了吗?
    我想应该在Open处加个判断,是不是有利于代码保护呢???
    if( m_gz_ygzl.Open (m_app->m_session , strCmd) ){
       //代开后的操作代码。。
       m_gz_ygzl.Close();
    }
    一点拙见,见笑
    ^_^
      

  10.   

    strCmd.Format (_T("SELECT * FROM ygzl WHERE bh = '%s'"), m_bh);
      (br='%s')改为'br=='%s'
      

  11.   

    你干脆把那一行替换为wsprintf算了,看看还有没有问题。
      

  12.   

    其实大家还没有明白程序错误的关键之处,就单单上面一段代码,是根本没有错的,因为相同的代码以及近似的代码,我已经用过无数次了,是不会出现问题的!!我已经详细检查过代码,估计错误出现在ATL的引入oleDB的初始代码上,不知道为什么,在我的机器上如果建立的工程是SDI方式,ATL引入oleDB初始代码的时候老是报错,但是,之后,我还是能用oleDB来操作和访问数据库,一切都正常,包括上面的代码,在执行的过程中是一点问题都没有的,只是在关闭应用程序的时候,才出现这个错误。如果我用对话框模式来建程序,引入oleDB代码是没有问题得,而且在执行上面的代码后,程序关闭也不会出现错误。所以问题的关键是,在SDI方式,ATL 引入oleDB的初始代码的时候自动加了什么在我的程序中,当它报错的时候,到底是什么东西错误,有那些代码没有建立好,从而导致在关闭程序的时候,引起某些代码错误,导致出现非法错误。我把这个程序oleDB自动加入的代码和我以前正确程序的代码已经作过详细比较,但是没有发现什么不同之处。大家都知道,VC自动加入的代码总是那么高深莫测,也许我还漏检查了某些东西。所以,真正能解决这个问题的当然是一个ATL 及oleDB的 超级高手,翘首期盼这个高手得出现!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  13.   

    我也曾经出过类似这样的问题,试了很多解决方法,最后这样搞定的:
    重新设计对话框和各种控件的映射strCmd.Format (_T("SELECT * FROM ygzl WHERE bh = '%s'"), m_bh);
    是正确的
    一定有问题的话,是不是看看m_bh的值
      

  14.   

    我用得系统是window2000+vc6+sp5m_bh值其实很简单,它的定义是CString m_bh ,而且也就几个字节长!在程序里我根本没有做动态内存申请,一切都是按最简单的方式定义和运行。而且,我返回得数据量很小,表中还只有几条数据,还不是正式使用。我估计还是自动添加的ATL oleDB代码中发生了错误。我另有一个SDI方式的程序,正在编得,在这个里面怎么做对数据库的查询操作,都不会有问题。还是用同一个VC编译执行,什么事都没有。但是现在,我只要用SDI方式建立工程,就出现上面的问题,如果用对话框方式建立,就不存在这个问题?!
    真的不知道系统里面出了什么毛病,难道是bug!
      

  15.   

    那你试一下不用变量呢?
    strCmd.Format (_T("SELECT * FROM ygzl WHERE bh = '这里写常量'"));
    会不会出错?出错就没办法了。
      

  16.   

    如果直接写常量也是一样的!
    反正不管访问哪个表,只要加上where就一定错!
      

  17.   

    sorry!
    借宝地问一下,帮帮忙啊!用户急着要呢!:(
    http://www.csdn.net/expert/topic/354/354313.shtm
      

  18.   

    我也遇见过内存not read 的问题,登时是加一个变量就出错,去掉变量就正确,等使我用的是中文版,该用英文版就过去了,你也试试。
      

  19.   

    if m_bh=="'xxxx" 
    then query="select * from ygzl where bh=''xxxx'"
    else 
    check database state code == 0200(success!!!)
      

  20.   

    现在讨论的焦点应该不是代码本身的问题,要注明一点,上面的代码绝对是正确的,
    在其它程序中不会产生任何错误表现。
    而且该段代码在错误程序的执行过程中也完全全正确,只要程序没有关闭。哪怕是这个对话框关闭又再打开使用都没有问题。但只要该段代码执行过一次,而且是带where的那种,就一定会在整个程序关闭的时候报错,如果没有where语句,什么事也不会发生!
      

  21.   

    "我把这个程序oleDB自动加入的代码和我以前正确程序的代码已经作过详细比较,但是没有发现什么不同之处。"--which parts of the codes have you checked?