系统每个用户拥有一张属于自己的表,但每次登陆数据库用户都需要确定数据库中是否存在这张表,确定有再进行操作,假如没有就新建一张表,假如某一用户其表名为“ABC”,表名是通过不同登陆用户传递不同参数决定的。而且不允许再建一张表单独存储所有用户的表名。该如何实现?小妹真的不明白,开发环境是VC++和Oracle,拜托各位了
解决方案 »
- 为什么我装不上WINDOWS MOBILE 6 PROFESSIONAL SDK?
- 对话框不能关闭的问题
- Socket客户端,主线程中connect和send,另开一个线程专用于recv,debug版一切正常,但release版recv得不到正确的数据
- 怎么看vc补丁的版本?
- XP下MFC应用到Win7下,启动会崩溃
- 人-车-环境专业软件创意设计,Up者有分!
- 有什么办法 可以停止一个进程 或 使 MessageBox 中断消息循环
- error C2664: 'Execute' : cannot convert parameter 1 from 'class std::basic_strin
- 大虾们呀,帮帮我这个菜鸟吧(一个菜单问题)
- list控件选择问题
- 为什么在为对话框建立类的时候总是报错呢?
- onDraw()与onPaint()的区别是什么?
// 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_)
// 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;
}
...... CTables table(pdb);
if(table.FindTable(lpszTableName))
{
表存在
}
{
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;
}