系统每个用户拥有一张属于自己的表,但每次登陆数据库用户都需要确定数据库中是否存在这张表,确定有再进行操作,假如没有就新建一张表,假如某一用户其表名为“ABC”,表名是通过不同登陆用户传递不同参数决定的。而且不允许再建一张表单独存储所有用户的表名。该如何实现?小妹真的不明白,开发环境是VC++和Oracle,拜托各位了

解决方案 »

  1.   

    table类的头文件
    // Tables.h: interface for the CTables class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_TABLES_H__1E80A4DF_573B_41C6_88F3_09A927C351DC__INCLUDED_)
    #define AFX_TABLES_H__1E80A4DF_573B_41C6_88F3_09A927C351DC__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class CTables : public  CRecordset  
    {
    public:
    virtual CString GetDefaultConnect() { return ""; }
    virtual CString GetDefaultSQL()     { return ""; }// Construction
    public:
    CTables(CDatabase* pDb); 
    virtual ~CTables();// Attribute
    public:
    CString m_strTableQualifier;
    CString m_strTableOwner;
    CString m_strTableName;
    CString m_strTableType;
    CString m_strRes; // 全部表格名称
    CStringArray m_tblNames;// Operation
    public:
    BOOL Open(LPCSTR pszTableQualifier = NULL,
          LPCSTR pszTableOwner = NULL,
      LPCSTR pszTableName = NULL,
      LPCSTR pszTableType = NULL,
      UINT nOpenType = forwardOnly); BOOL FindTable(LPCTSTR tbl); virtual void DoFieldExchange(CFieldExchange*);};#endif // !defined(AFX_TABLES_H__1E80A4DF_573B_41C6_88F3_09A927C351DC__INCLUDED_)
      

  2.   

    table类的实现文件
    // Tables.cpp: implementation of the CTables class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "Tables.h"//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CTables::CTables(CDatabase* pDb) : CRecordset(pDb)
    {
    m_strTableQualifier = _T("");
    m_strTableOwner = _T("");
    m_strTableName = _T("");
    m_strTableType = _T("");
    m_strRes = _T("");
    m_nFields = 5;
    }CTables::~CTables()
    {}BOOL CTables::Open(LPCSTR pszTableQualifier,
    LPCSTR pszTableOwner,LPCSTR pszTableName,LPCSTR pszTableType,
    UINT nOpenType)
    {
    ASSERT(m_pDatabase != NULL);
    ASSERT(m_pDatabase->IsOpen()); RETCODE nRetCode;
    UWORD bFunctionExists; // make sure SQLTables exists
    AFX_SQL_SYNC(::SQLGetFunctions(m_pDatabase->m_hdbc,
    SQL_API_SQLTABLES,&bFunctionExists));
    if (!Check(nRetCode) || !bFunctionExists)
    {
    if (!bFunctionExists)
    TRACE(_T("SQLTables not supported\n"));
    return FALSE;
    } m_nOpenType = nOpenType;
    m_bUpdatable = FALSE; // make sure hstmt is allocated
    if (m_hstmt==SQL_NULL_HSTMT)
    {
    AFX_SQL_SYNC(::SQLAllocStmt(m_pDatabase->m_hdbc,&m_hstmt));
    if (!Check(nRetCode))
    ThrowDBException(nRetCode,m_hstmt);
    } OnSetOptions(m_hstmt); TRY
    {
    // call the ODBC function
    AFX_SQL_ASYNC(this,::SQLTables(m_hstmt,
    (UCHAR FAR*)pszTableQualifier,SQL_NTS,
    (UCHAR FAR*)pszTableOwner,SQL_NTS,
    (UCHAR FAR*)pszTableName,SQL_NTS,
    (UCHAR FAR*)pszTableType,SQL_NTS));  if (!Check(nRetCode))
    ThrowDBException(nRetCode,m_hstmt); // Allocate memory and cache info
    AllocAndCacheFieldInfo();
    AllocRowset(); // Allocate the field info and status arrays if
    // not done already in BuildSelectSQL
    if ((m_nFields != 0 || m_nParams != 0) &&
    m_rgFieldInfos==NULL)
    {
    AllocStatusArrays();
    }
    MoveNext();
    }
    CATCH_ALL(e)
    {
    Close();
    THROW_LAST();
    }
    END_CATCH_ALL return TRUE;
    }void CTables::DoFieldExchange(CFieldExchange* pFX)
    {
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, _T("TABLE_QUALIFIER"), m_strTableQualifier);
    RFX_Text(pFX, _T("TABLE_OWNER"), m_strTableOwner);
    RFX_Text(pFX, _T("TABLE_NAME"), m_strTableName);
    RFX_Text(pFX, _T("TABLE_TYPE"), m_strTableType);
    RFX_Text(pFX, _T("REMARKS"), m_strRes);
    }BOOL CTables::FindTable(LPCTSTR lpTblName)
    {
    Open(NULL, NULL, NULL, "TABLE"); // Cycle through all the tables
    CString strTableRef;
    while (!IsEOF())
    {
    // Build the string from owner name and table name
    if (m_strTableName.CompareNoCase(lpTblName)==0)
    {
    Close();
    return TRUE;
    }
    MoveNext();
    }
    Close(); return FALSE;
    }
      

  3.   

    table类的用法CDataBase *pdb;
    ...... CTables table(pdb);
    if(table.FindTable(lpszTableName))
    {
    表存在
    }
      

  4.   

    BOOL CChemicalsApp::IsExistTable(CString strTableName)
    {
    ASSERT(theApp.m_pConn!=NULL);
    ASSERT(theApp.m_pConn->State==adStateOpen); _RecordsetPtr pRstSchema=NULL;
    pRstSchema.CreateInstance(__uuidof(Recordset)); BOOL bRet=FALSE;
    //*****************
    //build up filter
    //
    //***************** SAFEARRAY FAR* psa = NULL;
    SAFEARRAYBOUND rgsabound;
    _variant_t  var;
    _variant_t  Array;
    rgsabound.lLbound = 0;
    rgsabound.cElements = 4;
    psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
    var.vt = VT_EMPTY;
    long ix;
    ix = 0;
    SafeArrayPutElement(psa, &ix, &var); ix= 1;
    SafeArrayPutElement(psa, &ix, &var); ix = 2;
    SafeArrayPutElement(psa, &ix, &var); ix = 3;
    var.vt = VT_BSTR;
    CString strTableType=_T("TABLE");
    var.bstrVal = strTableType.AllocSysString();
    SafeArrayPutElement(psa, &ix, &var); Array.vt = VT_ARRAY|VT_VARIANT;
    Array.parray = psa;  _bstr_t bstrTableName;
    try
    {
    pRstSchema=theApp.m_pConn->OpenSchema(adSchemaTables,&Array); while (!(pRstSchema->adoEOF))
    {
    bstrTableName=pRstSchema->Fields->GetItem(L"TABLE_NAME")->Value;
    if(bstrTableName==(_bstr_t)strTableName)
    bRet=TRUE;
    pRstSchema->MoveNext();
    } }
    catch (_com_error e)
    {
    theApp.PrintComError(e);
    } if(pRstSchema->State==adStateOpen)
    pRstSchema->Close(); return bRet;
    }