迷糊中奋斗了一个星期,
终于把数据库连上了,
在这里,先为各位看帖答疑的朋友致谢
另外,为我那些愚蠢的问题,我也在此致歉
(大概被看成不学无术而讨厌了吧,将心比心,我也会)
(有时候,头脑也会有不灵光的时候,尽问一些傻问题,回过头才知傻)
---------------------------------------------------------------------现在只差查询和修改,添加项了。(知道怎么执行SQL语句和一些基本的语句,但不熟悉)
我的程序思路是让程序对话框在初始化的时候,用dat文件中保存的数据库管理帐号和密码进行连接。
许多书上都讲的是在程序用CRecordview将数据源中的项映射到变量中去,(大概是吧,不确定,又一蠢问题),没有连接这一步,所以让我不知所措。现在,我有一张表,保存着用户的帐号密码。
在事件处理程序里面,要较验用户的帐号密码。
怎么执行查询?MSDN的CDatabase,CRecordset,CRecordview都有稍微看了下,貌似没有示例,没看明白,特别是CRecordview的记录太少了。还有一个是执行查询之后,要把查到的项显示出来,哪里有函数负责?我用的是MYSQL。---------------------------------------------------------------------
在这,恳请各位高手分享下你们的成长经历(怎么看书?看什么书?怎么去认识代码?)
我的QQ291151053
望赐教

解决方案 »

  1.   

    在天极网上找到解决方法了,上代码就出问题了。
    CRecordset PBD;
    PBD.m_pDatabase=DB;
    CString book;
    CDBVariant tempbook;
    int flag=1;
    //=_T("book");
    //GetDlgItem(IDD_bookcheck)->
    GetDlgItemText(IDC_EDIT1,book);
    PBD.Open(-1,_T("SELECT book FROM book"));
    //CString tbook=_T("SELECT ")+book+_T(" FROM book");
    //AfxMessageBox(book);
        while(flag)
    {
    if(PBD.IsEOF())
    {
    flag=0;
    }
    PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR); //这一句要怎么用呐,不能转换的问题
    if(book==tempbook.m_pstringW)
    {
    flag=0;
    }
    PBD.MoveNext();
    }
      

  2.   

    PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR); //这一句要怎么用呐,不能转换的问题 
    看数据库中的字段类型
    C data type               SQL data type 
    SQL_C_BIT                 SQL_BIT 
    SQL_C_UTINYINT            SQL_TINYINT 
    SQL_C_SSHORT              SQL_SMALLINT 
    SQL_C_SLONG               SQL_INTEGER 
    SQL_C_FLOAT               SQL_REAL 
    SQL_C_DOUBLE              SQL_FLOATSQL_DOUBLE 
    SQL_C_TIMESTAMP           SQL_DATESQL_TIMESQL_TIMESTAMP 
    SQL_C_CHAR                SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR 
    SQL_C_BINARY              SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY 
     
      

  3.   

    楼上的东西,我查阅过了。
    book域中存的是varchar,那样应该对吧
    可是程序在运行的时候崩掉了
      

  4.   

    >>PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR); //这一句要怎么用呐,不能转换的问题 
    ------------------------------
    第三个参数不填应该可以。
      

  5.   

    连mysql还是直接用它的C接口比较好
    安装目录有例子
      

  6.   

    PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR); //这一句要怎么用呐,不能转换的问题 
    if(book==tempbook.m_pstringW) 
    //这两句里面是哪一句导致崩溃的?
      

  7.   

    AFX_ODBC_CALL(::SQLGetData(hstmt, nFieldIndex,nFieldType, pvData, nLen, &nActualSize));调试在这一句发生内存冲突了。能看出问题吗?
    其他的东西看不明白。
      

  8.   

    在 PBD.open 之后与 PBD.GetFieldValue 之前加这句试试:
    PBD.MoveFirst( );
      

  9.   

    CRecordset PBD;
    PBD.m_pDatabase=DB;
    CString book;
    CDBVariant tempbook;
    int flag=1;
    //=_T("book");
    //GetDlgItem(IDD_bookcheck)->
    GetDlgItemText(IDC_EDIT1,book);
    PBD.Open(-1,_T("SELECT book FROM book"));
    PBD.MoveFirst( );
    //CString tbook=_T("SELECT ")+book+_T(" FROM book");
    //AfxMessageBox(book);
        while(flag)
    {
    if(PBD.IsEOF())
    {
    flag=0;
    }
    PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR);
    if(book==*(tempbook.m_pstringW))
    {
    flag=0;
    }
    PBD.MoveNext();
    }
    还是崩溃了
      

  10.   

    哦,对了,程序有 bug 啊.
        while(flag)
    {
    if(PBD.IsEOF())
    {
    flag=0;
    // 我想,这里应该加个 break;
      break;

    ....
      

  11.   

    AFX_ODBC_CALL(::SQLGetData(hstmt, nFieldIndex,nFieldType, pvData, nLen, &nActualSize)); 
    //F11,进入函数内部,单步,看看是那个出错
      

  12.   

    12楼,进不去函数内部,一直提示内存冲突
    调用堆栈的信息
    mfc90ud.dll!CRecordset::GetData(CDatabase * pdb=0x00a28880, void * hstmt=0x009b35e0, short nFieldIndex=1, short nFieldType=1, void * pvData=0x00a291f8, long nLen=1021, short nSQLType=-9)  行4465 + 0x1f 字节 C++
      

  13.   

    确定是这一句引起崩溃了
    PBD.GetFieldValue(short(0),tempbook,SQL_C_CHAR);