我在VC中想直接用SQL语句,不过不太懂SQL,
CString strSQL="Update db1 Set zt='开' where jh=“01”
db.ExecuteSQL(strSQL)用了,实现了SQL的UPDATE操作,
但我想实现select查询功能,select zt from db1 where ...,希望大家给个select的示范语句,我看一下,我不知道zt的返回值得到后如何输入到变量,zt的值用什么方法转换到vc中,我现在糊涂了。

解决方案 »

  1.   

    _RecordsetPtr    m_pRecordSet;
    _variant_t fieldvalue;
    strSQL.Format ( "select zt from db1 where ...");

    m_pRecordSet.CreateInstance("ADODB.Recordset");
    m_pRecordSet->Open(_variant_t(strSQL), _variant_t((IDispatch *)pConn, true),
      adOpenKeyset, adLockReadOnly, adCmdText);
    CString ztvalue;
    while(!m_pRecordSet->EndOfFile){
         fieldvalue=m_pRecordSet->Fields->Item["zt"]->Value;
         ::VariantChangeType(&fieldvalue,&fieldvalue,0,VT_BSTR);
         ztvalue=fieldvalue.bstrVal;
         ...
         m_pRecordSet->MoveNext() ;
        }
    }
      

  2.   

    up
    网上有很多关于数据库开发的例子,你可以找找,推荐一个网站:www.vckbase.com
      

  3.   

    通常很多用人用mfc CRecordset 类,确实方便,楼上也提供了ADO发方法,我这里再提供两个例子:
    一个是用CRecordset的,另一个是用OLEDB的。都是超级简单的方法。
    {
    CString strSQL;
    strSQL.Format("SELECT ip,port,password,recid FROM %s",SERVER_LIST_TABEL_NAME); LPCTSTR sFilter;
    CDatabase db;
    TRY
    {
    db.OpenEx(m_OwnInfo.m_strConnectString,CDatabase::noOdbcDialog);
    }
    CATCH(CDBException,e)
    {
    OnLogEventProc("无法打开数据库,可能是密码错误");
    return FALSE;
    }
    END_CATCH;

    CRecordset lSet(&db);
    sFilter = "(ip = '%s') AND (port = '%d') AND (password = '%s')";

    lSet.m_strFilter.Format(sFilter,
    m_OwnInfo.m_strIp,
    m_OwnInfo.m_uPort,
    m_OwnInfo.m_strPwd);

    TRY
    {
    lSet.Open(CRecordset::snapshot,strSQL,CRecordset::readOnly);
    if (lSet.IsEOF())
    {
    lSet.Close();

    OnLogEventProc("服务器运行密码错误");
    return FALSE;
    }
    else
    {
    sFilter = "(ip <> '%s') OR (port <> '%d')";
    lSet.m_strFilter.Format(sFilter,
    m_OwnInfo.m_strIp,
    m_OwnInfo.m_uPort);

    lSet.Requery();

    if (!(lSet.IsEOF())) 
    {
    CDBVariant var;

    lSet.MoveFirst();
    // short nFields = lSet.GetODBCFieldCount( );
    CServerInfo * pServerInfo = NULL;
    while(!(lSet.IsEOF()))
    {
    pServerInfo = new CServerInfo;

    lSet.GetFieldValue("ip",var);
    ASSERT(var.m_dwType==DBVT_STRING);
    var.m_pstring->TrimLeft();
    var.m_pstring->TrimRight();
    pServerInfo->m_strIp  = *(var.m_pstring);

    lSet.GetFieldValue("port",var);
    ASSERT(var.m_dwType==DBVT_LONG);
    pServerInfo->m_uPort = var.m_lVal;

    lSet.GetFieldValue("password",var);
    var.m_pstring->TrimLeft();
    var.m_pstring->TrimRight();
    pServerInfo->m_strPwd = *(var.m_pstring);

    m_lstMaxServer.AddTail(pServerInfo);

    lSet.MoveNext();
    }
    }
    lSet.Close();
    }
    }
    CATCH(CDBException,e)
    {
    #ifdef _DEBUG
    AfxMessageBox(e->m_strError);
    AfxMessageBox("读取最大配置表出错,可能影响整个系统的运行一致性");
    #endif
    OnLogEventProc("读取最大配置表出错,可能影响整个系统的运行一致性");
    return FALSE;
    }
    END_CATCH;

    return TRUE;
    }
      

  4.   

    先执行SQL语句,然后....
    CDBVariant valueVariant;
    m_Recordset->GetFieldValue(short(i),valueVariant)
    (i为第i列),取得第i列的值,赋给一个变量valueVariant。
    然后 你就可以根据实际的数据类型把valueVariant转换为所需要的值,赋给VC中的相应
    变量即可
      

  5.   

    用OLE DB 模板访问数据库的例子
    HRESULT CGetSyncInfo::GetLastModify(LPCTSTR lpszTable, DBTIMESTAMP &dt)
    {
    HRESULT  hr = E_FAIL;
    CSession session;
    CCommand<CDynamicAccessor>cmd;
    CString strCmd; ZeroMemory(&dt,sizeof(DBTIMESTAMP));
    strCmd.Format(TEXT("SELECT MAX(LastModify) AS MaxLastModify FROM %s"),lpszTable);
    hr = session.Open(*m_pDS);
    if(FAILED(hr))
    return hr;

    hr = cmd.Open(session,strCmd);
    if(FAILED(hr))
    return hr;

    hr = cmd.MoveFirst();
    if(hr == S_OK)
    {
    ULONG uIdx = 0;
    dt = *(DBTIMESTAMP*)cmd.GetValue(uIdx);
    return S_OK;
    }
    return hr;
    }