上次问的是ado下得到mdb文件所有表格。代码如下
///This is a sample in MSDN
///here , m_tablesList is  a listbox
/// goog luck!
_bstr_t tablesNames;
CString kooky;
m_tablesList.ResetContent();
UpdateData( TRUE);
try
{
m_recordSet = m_connection->OpenSchema (adSchemaTables,vtMissing,vtMissing);
while (!m_recordSet->EOF )
{
tablesNames = m_recordSet->Fields->Item[L"TABLE_NAME"]->Value;
kooky = (char*) tablesNames;
if (kooky.Left(4) != "MSys")
m_tablesList.AddString( kooky );//添加表名到控件显示
m_recordSet->MoveNext();}
}
catch(...) {}
UpdateData( FALSE );
m_recordSet = NULL;
==================
但这个代码无法得到sqlserver的表格,或者说得到的太多了不是真正的表格名称!
我的连接sqlserver代码如下:
Provider=SQLOLEDB.1;Data Source= 127.0.0.1;User ID=sa;Password=sa;Initial Catalog=master;
恳请大家赐教!

解决方案 »

  1.   

    可以执行sql语句来得到表名
    1.
    select name from sysobjects where xtype='U'2.
    select 表名=name from sysobjects where objectproperty(id,'isusertable')=1关于ado执行sql语句,论坛里面有很多例子,你搜索一下
      

  2.   

    看看SQL自带的客户端网络实用工具,TCP/IP的属性里面详细瞧瞧!
    在系统目录下面有个DBNETLIB.DLL,说白了也是从注册表里读出来的
      

  3.   

    大家好,我是一个初学者,有一个问题:
    我和同学用的同一张VC安装盘,系统同是2000,结果他的VC里有ADO Data控件,可是我的却没有,这是为什么啊?我怎样才能插入ADO Data控件啊?
    说具体点就是如何在下面步骤的结果中能填加ADO控件:
    VC6.0/新建工程/Project/Add to Project/Components and Controls/打开Gallery/打开Registered ActiveX Controls
    上面的文件夹里应该有Microsoft ADO Data Control这个控件的,可是我却没有,怎么回事事?
      

  4.   

    用这个试试!
    _bstr_t table_name = pRst->Fields->GetItem("TABLE_NAME")->Value;
    _bstr_t table_type = pRst->Fields->GetItem("TABLE_TYPE")->Value;
    if ( strcmp(((LPCSTR)table_type),"TABLE")==0) //过滤一下,只输出表格名称,其他的省略
    {
    //TODO:Add your command!
    }    
      

  5.   

    首先多谢各位朋友的详细解答!bohut(伯虎) 朋友的方法是我想要的结果,谢谢!
    inpriser(旺旺)朋友的方法好象不行,没任何显示。要不给我一个具体代码?谢谢。
    xuzheng318(forever C++) 朋友的方法我是菜鸟不懂,感觉太复杂。谢谢。还问大家一下,有什么方法能得到sqlserver所有的数据库,例如master,model,pubs之类的名字?
    谢谢!
      

  6.   

    HRESULT hr;
    try
    {
    hr = m_pConnection.CreateInstance("ADODB.Connection");
    if SUCCEEDED(hr)
    {
    hr=m_pConnection->Open("Provider=SQLOLEDB.1;Data Source=yf;Initial Catalog=wheel","sa","",adConnectUnspecified);
    pRst= m_pConnection->OpenSchema(adSchemaTables);
    while(!(pRst->EndofFile))   
    {    
    _bstr_t table_name = pRst->Fields->GetItem("TABLE_NAME")->Value;
    _bstr_t table_type = pRst->Fields->GetItem("TABLE_TYPE")->Value;
    if ( strcmp(((LPCSTR)table_type),"TABLE")==0) 
    {     
    m_ListCtrl->AddString(( LPCTSTR )table_name);
    }
    pRst->MoveNext();
    }
    pRst->Close();  
    }
    }
    catch(_com_error e)
    {
    CString errormessage;
    errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
    AfxMessageBox(errormessage);///显示错误信息
    }
      

  7.   

    所有数据库的名称也应该在master中有记录吧,看看是在哪个表里。
      

  8.   

    inpriser(旺旺) 朋友你给我的代码我尝试了,显示是什么都没有!如果连接的是mdb的话可以运行成功!yingpf(阿飛)  朋友你能具体说明白点吗?具体那个表。谢谢!
      

  9.   

    不可能,我在SQL Server运行能得到表名啊。
    你再跟踪调试一下吧。
      

  10.   

    inpriser(旺旺) 朋友你的代码我再次调试了一下,发现可以得到部分数据库的表格。例如:Northwind,msdb等数据库。但有一部分无法得到。例如:master.
    请问是怎么回事?是不是我那出问题了,我可是copy的哦.
      

  11.   

    void CSQLOpt::GetSchemaTables(CArray<CString, CString&> &arrtbName)
    {
        _RecordsetPtr   Rs1;    CString csTemp;
        _variant_t varCriteria[4];
        LONG lIndex = 0;
        HRESULT hr = 0; arrtbName.RemoveAll(); try
    {
           // Getting primary key information for table "Authors". _bstr_t bstrTableType("Table"); varCriteria[0].vt = VT_EMPTY;
    varCriteria[1].vt = VT_EMPTY;
    varCriteria[2].vt = VT_EMPTY;
    varCriteria[3] = bstrTableType; VARIANT varData;
    SAFEARRAY FAR* psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 4;
    psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);       // Fill the safe array.
    for( lIndex = 0 ; lIndex < 4 ;lIndex++)
    {
       hr  = SafeArrayPutElement(psa, &lIndex,&varCriteria[lIndex]);
    }
    // Initialize variant with safearray.
    varData.vt = VT_VARIANT | VT_ARRAY;
    V_ARRAY(&varData) = psa; Rs1 = m_pConnection->OpenSchema(adSchemaTables,varData); int nFieldCount = Rs1->Fields->GetCount();
    VARIANT varValue; csTemp.Empty();
    while (VARIANT_TRUE != Rs1->GetadoEOF())
    {
    // Traversing through the Fields collection to get the values.
    if(!csTemp.IsEmpty())
    csTemp += " ; "; varValue = Rs1->Fields->GetItem(_variant_t((long)2))->Value;
    if(varValue.vt == VT_BSTR)
    {
    csTemp += varValue.bstrVal;
    CString strTemp = varValue.bstrVal;
    arrtbName.Add( strTemp );
    AfxMessageBox( strTemp );
    }
    else
    if(varValue.vt == VT_UI4)
    csTemp.Format("%s %l",csTemp,varValue.lVal); Rs1->MoveNext();
    }
    Rs1->Close();
    OutputDebugString(csTemp);
    }
        catch(_com_error &e)
        {
           AfxMessageBox(e.ErrorMessage() );
        }
    }