MFC+ODBC,我在保存数据的时候想判断输入的数据与数据库中是否有重复,用
    CString strSql1;
    strSql1.Format=(SELECT * FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);
    然后用GetRecordCount判断返回个数是否为0,若为0则保存,若不为0则弹出提示框。
    请问这种方法可行吗?编译执行都不出错,但是按下保存按钮的时候会发生内存错误。请高手们帮帮忙!

解决方案 »

  1.   

    GetRecordCount()函数只有在使用MoveNext()函数遍历数据库中的所有记录之后,才能得到正确的结果。
    用select count(*) from 。。
      

  2.   

     然后用GetRecordCount判断返回个数是否为0,若为0则保存,若不为0则弹出提示框。 
    ==用GetRecordCount来判断不行。
    strSql1.Format=(SELECT * FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2); 
    ==这是什么乱七八糟的写法,编译也过不去啊
      

  3.   

    mSqlStr.Format(_T("SELECT * FROM userwords WHERE username='%s'"),m_name); if (!mrsDataSet.Open(AFX_DB_USE_DEFAULT_TYPE, mSqlStr)){
    MessageBox(_T("用户数据库打开失败!"));
    return;
    }

    if (mrsDataSet.IsEOF())
    {
    // Open all function for user
    mrsDataSet.AddNew();
    mrsDataSet.m_username=m_name;
    mrsDataSet.m_passwords=m_pwd;
    mrsDataSet.Update();
    mrsDataSet.Close();
    MessageBox(_T("恭喜您,注册成功!"));
    }
    else{
    MessageBox(_T("对不起,你输入的用户名已经在使用了"));
    return ;
    }就这样参考一下
      

  4.   

    select count(XX)  VC调接口看返回值就知道原来有没有这个数据了么
      

  5.   

    一个办法是判断返回的记录集是否已到EOF,判断没有记录,就表示无重复。
    或者Select语句写成:
    strSql1.Format(SELECT COUNT(*) FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2); 
    然后判断查询出来的数量就知道是否有重复。
      

  6.   

    "0x00e05a44"指令引用的"0x00000000"内存。该内存不能为"written"。
      

  7.   

    CString strSql1;
    strSql1.Format("SELECT * FROM TWTPara WHERE DUTType='%s' AND ProductID='s'",m_model,m_batch);CTWTPara twtpara(&database);
    twtpara.Open(AFX_DB_USE_DEFAULT_TYPE,strSql1);if(!twtpara.IsEOF()) 
        {
    MessageBox("该被测件已保存!");
    return;
        }
    else{
    CString strSql2;
    CString strFormat="INSERT INTO TWTPara       (Producer,DUTType,ProductID,QualityLevel,WorkEnvmt,RatedFreqL,RatedFreqH,BandWidth,OutPower,Efficiency,Gain,Other)VALUES('%s','%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s')";
    strSql2.Format(strFormat,m_comp,m_model,m_batch,m_quallvl,m_env,m_freq1,m_freq2,m_bw,m_power,m_effic,m_gain,m_other);
    database.ExecuteSQL(strSql2);
    database.Close();
        }
    代码贴出来各位看看。如果把else前面的语句删掉的话代码可以正确执行,可以实现插入数据的功能。
      

  8.   

    strSql1.Format("SELECT * FROM TWTPara WHERE DUTType='%s' AND ProductID='s'",m_model,m_batch); 
    ===连%号都漏掉了怎么总是笔误呢
      

  9.   

    调试一下,是if(!twtpara.IsEOF()) 造成的内存错误吗?
      

  10.   

    select * 效率不行,用select count(*)
      

  11.   

    select * 效率不行,用select count(*)
      

  12.   

    select * 效率不行,用select count(*)
      

  13.   

    程序在执行哪一句时出错?
    CTWTPara twtpara(&database);
    ============================
    看看你database如何Open的
      

  14.   

    调试就弹出unhandled exeption in dutinfo.exe(MYODBC5.DLL):0xC0000005:Access Violation.
      

  15.   

    SELECT COUNT(*)的返回值怎么调用
      

  16.   

    CTWTPara twtpara(&database); 
    twtpara.Open(AFX_DB_USE_DEFAULT_TYPE,strSql1); 
    ==仔细调试着两部分,肯定是内部出现问题了。
      

  17.   

    VC ADO 获得
     m_pRecordset->GetCollect
      

  18.   

      (1)利用Connection对象的Execute方法执行SQL命令  Execute方法的原型如下所示:     _RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )      其中CommandText是命令字串,通常是SQL命令。
     参数RecordsAffected是操作完成后所影响的行数, 
     参数Options表示CommandText中内容的类型,Options可以取如下值之一:
     adCmdText:表明CommandText是文本命令
     adCmdTable:表明CommandText是一个表名
     adCmdProc:表明CommandText是一个存储过程
     adCmdUnknown:未知    Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。     _variant_t RecordsAffected;    ///执行SQL统计命令得到包含记录条数的记录集
        m_pRecordset =  m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);   //看到这里了吧?
        _variant_t vIndex = (long)0;
        _variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
        //上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
        m_pRecordset->Close();///关闭记录集
        CString message;
        message.Format("共有%d条记录",vCount.lVal);
        AfxMessageBox(message);///显示当前记录条数
      

  19.   

    好像是twtpara.Open(AFX_DB_USE_DEFAULT_TYPE,strSql1);这一有问题行
      

  20.   

    还是sql拼的不对啊!
    哎~~~
      

  21.   

    1. 调用MoveNext一次, 再调用GetRecordCount函数
    2. 还有那个SQL语句, 最好不用select * .... 形式, 改成 
    strSql1.Format=(SELECT top 1 1 FROM 表 WHERE 参数1='%s' AND 参数2='%s',输入值1,输入值2);因为这样速度快, 比count()都快, 如果是count的话, 就不能用GetRecordCount判断记录了, 因为无论有没有数据都会返回一条记录, 只是结果值为不为0了