2017-04-13 59 views
1

我正在構建我的第一個MFC應用程序。我已成功連接到數據庫,但是當我嘗試執行查詢時,hResult變爲DB_E_NOTABLEMFC SQL查詢返回DB_E_NOTABLE

這是我的代碼:

class CCitiesTable : public CTable<CAccessor<CCitiesTableAccessor> > 
{ 
     public: 

bool SelectAll(CCitiesArray& oCitiesArray) 
{ 
    CDataSource oDataSource; 
    CSession oSession; 
    CCitiesTable oCitiesTable; 

    try 
    { 
     HRESULT hResult = CoInitialize(0); 

     if (FAILED(hResult)) 
     { 
      //Message(_T("Unable to CoInitialize COM Interface.")); 
      return FALSE; 
     } 
CDBPropSet oDBPropSet(DBPROPSET_DBINIT); 
     oDBPropSet.AddProperty(DBPROP_INIT_DATASOURCE, _T("LENOVO2\\SQL2008")); // сървър 
     oDBPropSet.AddProperty(DBPROP_AUTH_USERID,  _T("sa"));   
     oDBPropSet.AddProperty(DBPROP_AUTH_PASSWORD, _T("massive"));    
     oDBPropSet.AddProperty(DBPROP_INIT_CATALOG,  _T("PhoneBookDB"));  
     oDBPropSet.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false); 
     oDBPropSet.AddProperty(DBPROP_INIT_LCID,  1033L); 
     oDBPropSet.AddProperty(DBPROP_INIT_PROMPT,  static_cast<short>(4)); 

     // Свързваме се към базата данни 
     hResult = oDataSource.Open(_T("SQLOLEDB.1"), &oDBPropSet); 

     if (FAILED(hResult)) 
     { 
      //Message(_T("Unable to connect to SQL Server database. Error: %d"), hResult); 
      return FALSE; 
     } 

     //Open session 
     hResult = oSession.Open(oDataSource); 

     if (FAILED(hResult)) 
     { 
      //Message(_T("Unable to open session. Error: %d"), hResult); 
      oDataSource.Close(); 
      return FALSE; 
     } 

     //Make query 
     CString strQuery; 
     strQuery = _T("SELECT * FROM dbo.CITIES"); 

     // Execute query 
     hResult = oCitiesTable.Open(oSession, strQuery); 

執行上面的HRESULT代碼後是DB_E_NOTABLE。除了桌子在那裏。數據庫:PhoneBookDB架構:dbo表:CITIES。查詢在SQL Server Management Studio中工作得很好。

+0

你確定你需要的dbo.CITIES並不僅僅是城市 –

+0

伊夫試圖與dbo.CITIES,城市和PhoneBookDB.dbo.CITIES。他們都不工作。 – VTodorov

+0

'oCitiesTable'從哪裏來?您顯示的代碼中唯一的地方就是結尾。另外:查詢不一定是一個表。您可以打開一個表格,也可以執行查詢,但可能需要不同的對象類型。 – crashmstr

回答

2

根據CTable::Open的文檔,CTable::Open需要表名,而不是選擇查詢。您收到的錯誤是說"SELECT * FROM dbo.CITIES"不是表名(它不是)。

szTableName [in]要打開的表的名稱,作爲ANSI字符串傳遞。

您需要使用:

CString strTable = _T("CITIES"); 

// Open Table 
hResult = oCitiesTable.Open(oSession, strTable);