我在VC中用ADO访问access数据库,用了视图,可运行时出错?详细代码如下:
CString sSql,strName;
_variant_t RecordsAffected;
_RecordsetPtr m_pRecordset2;
sSql.Format("CREATE VIEW  testview AS SELECT username FROM users1 UNION SELECT username FROM users"); 
m_pRecordset2 = theApp.m_pConnection->Execute((_bstr_t)sSql,&RecordsAffected,adCmdText); 
while (!(m_pRecordset2->adoEOF))
{    
    strName.Format("user name is %s",
(char*)_bstr_t(m_pRecordset2->Fields->GetItem("username")->Value));
m_ListBox.AddString(strName);
m_pRecordset2->MoveNext();
}
m_pRecordset2->Close();
m_pRecordset2 = NULL; 
我的数据库中有两个表users1和users,想把两个表中所有的用户名查出来,m_pConnection已经连接上数据库,程序退出时关闭了连接。
可我执行上面语句时,发生了运行时错误?不知原因何在,希望各位能帮忙看一下,多谢
还想问一下,创建视图有什么用处?是不是查询时速度快些,一般什么情况下使用啊?

解决方案 »

  1.   

    _RecordsetPtr m_pRecordset2;
    m_pRecordset2.CreateInstance("ADODB.Recordset");
      

  2.   

    执行这样的SQL不会返回Recordset的!
      

  3.   

    嗯,查了一下资料好像是这样的,那应该如何得到视图中的数据呢?
    我这么用了一下,可还是有运行时错
    CString sSql,strName;
    _variant_t RecordsAffected;
    _RecordsetPtr m_pRecordset2;
    m_pRecordset2.CreateInstance("ADODB.Recordset");
    sSql.Format("CREATE VIEW  testview AS SELECT username FROM users1 UNION SELECT username FROM users"); 

    theApp.m_pConnection->Execute((_bstr_t)sSql,&RecordsAffected,adCmdText); 

    strName.Format("SELECT username FROM testview"); 
    m_pRecordset2 = theApp.m_pConnection->Execute((_bstr_t)strName,&RecordsAffected,adCmdText); 
    while (!(m_pRecordset2->adoEOF))
    {    
        strName.Format("user name is %s",
    (char*)_bstr_t(m_pRecordset2->Fields->GetItem("username")->Value));
    m_ListBox.AddString(strName);
    m_pRecordset2->MoveNext();
    }
    m_pRecordset2->Close();
    m_pRecordset2 = NULL;
      

  4.   

    CString strSQL = "select * from testview";
    m_pRecordset2.Open((LPTSTR)strSQL.GetBuffer(255),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
    ..........
      

  5.   

    m_pConnection是你的数据库连接指针
      

  6.   

    我发现注视其他代码,只创建视图,好像都不行,也是出现runtime error,
    视图到底应该如何创建,access+ado改如何用?
    CString sSql,strName;
    _variant_t RecordsAffected;
    _RecordsetPtr m_pRecordset2;
    m_pRecordset2.CreateInstance("ADODB.Recordset");
    sSql.Format("CREATE VIEW  testview AS SELECT username FROM users1 UNION SELECT username FROM users");
      

  7.   


    protected:
    _CatalogPtr m_pCatalog;
    ///////////////////////////////////////
    HRESULT hr;
    bool CreateView(CString strName, CString strCommand)
    {
    HRESULT hr;
    ADODB::_CommandPtr pCommand = NULL;
    pCommand.CreateInstance(__uuidof(ADODB::Command)); try
    {
    pCommand->put_CommandText(strCommand.AllocSysString());
    hr = m_pCatalog->Views->Append(_bstr_t(strName.GetBuffer(0)), pCommand);
    if(SUCCEEDED(hr))
    {
    m_pCatalog->Views->Refresh();
    m_pView = m_pCatalog->Views->GetItem(strName.GetBuffer(0));
    pCommand.Release();
    return true;
    }
    else
    {
    return false;
    }
    }
    catch(_com_error &e)
    {
    dump_com_error(e);
    return false;
    }
    }
    ////////////////////////////////////////
    CString sViewName,sCmdText;
    sViewName="查询1";
    sCmdText="Create view myView as......";
    if(!CreateView(sViewName,sCmdText))
    {
        //......
    }
      

  8.   

    access
    sql server
    oracle
    ...
    的SQL语法是不一样的。
    另外,楼主一开始的程序是创建试图,又如何能返回记录信息?
    起码需要运行"select * from view_name"才是正确返回试图记录的正确方法。
      

  9.   

    我在access中先建好了2个表,然后我想建立一个对这两个表的视图
    CString sSql,strName,strName1;
    _variant_t RecordsAffected;
    sSql.Format("CREATE VIEW testview AS SELECT username FROM users1 UNION SELECT username FROM users"); 
    theApp.m_pConnection->Execute((_bstr_t)sSql,&RecordsAffected,adCmdText); 
    可以为什么我这么建立视图,会发生runtime error呢?
    access中怎么建立视图呢?
      

  10.   

    看 tiegerium(/*唐秀观*/)的代码
    是不是视图一定要用Create Table这么创建表才可以用啊?我 在access中直接建立两个表,然后在程序中可以建立视图吗?
      

  11.   

    你需要在access里面去创建试图,看看它的语法。
    很大区别呢。
      

  12.   

    错了,应该是:
    sCmdText="select a.*,b.* from tableA a,tableB b where a.id=b.id order by a.id";
    //---------------------------------------
    当然,Access的jet sql和T_SQL是不一样的。你直接用"create view myview as select ....."
    是不行的,在Access没有视图和存储过程的说法。
      

  13.   

    吗的,在Access的模块里可以用(vba)创建,就是:"create view myview as....";
    但在SQL视图里就不行!在VC里就是用到ADOX,真麻烦。