判断access中某个表是否存在的语句

zxdyu2009 2010-06-22 08:49:20
本人使用VC,用ADO操作Access数据库,现要判断某个数据库的某个表是否存在,请问如何写?谢谢!
...全文
731 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuifengde 2010-06-22
  • 打赏
  • 举报
回复
哦,14楼用了openschema
chuifengde 2010-06-22
  • 打赏
  • 举报
回复
可以作一个函数,ado的openschema可以直接获得表名
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
表不存在时,用select *会直接出错,异常还捕获不到?表存在肯定没问题。
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 chuifengde 的回复:]
dao直接引用用tabledefs来访问表名,出错即不存在
[/Quote]
大哥,ado呢?
chuifengde 2010-06-22
  • 打赏
  • 举报
回复
dao直接引用用tabledefs来访问表名,出错即不存在
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wwwwa 的回复:]
应该可以捕获
catch (_com_error e)
{
CString strComError;
strComError.Format("Error: %08lx\nError Message: %s\nSource: %s\nDescription: %s",
e.Error(), //
e.ErrorMessage(), //
(LPCSTR) e.Sour……
[/Quote]

rc->Open(bstrSQL,
pConn.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
//这句执行直接出错,中断了运行,根本进不了catch,MY GOD
WWWWA 2010-06-22
  • 打赏
  • 举报
回复
应该可以捕获
catch (_com_error e)
{
CString strComError;
strComError.Format("Error: %08lx\nError Message: %s\nSource: %s\nDescription: %s",
e.Error(), //
e.ErrorMessage(), //
(LPCSTR) e.Source(), //
(LPCSTR) e.Description()); //
::MessageBox(NULL,strComError,"Database Error",MB_ICONEXCLAMATION);
return ;
}
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wwwwa 的回复:]
6.遍历数据库中的所有表名
_ConnectionPtr m_pConnect;

_RecordsetPtr pSet;
HRESULT hr;
try
{
hr = m_pConnect.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
CString dd;
dd.Format……
[/Quote]
遍历表格的方法,因为我的表最后比较多,最后加入的表的,判断是否存在的时候,要遍历很久吧,时间太长。
WWWWA 2010-06-22
  • 打赏
  • 举报
回复
6.遍历数据库中的所有表名
_ConnectionPtr m_pConnect;

_RecordsetPtr pSet;
HRESULT hr;
try
{
hr = m_pConnect.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
CString dd;
dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",file);
hr = m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);
pSet = m_pConnect->OpenSchema(adSchemaTables);
while(!(pSet->adoEOF))
{
//获取表格
_bstr_t table_name = pSet->Fields->GetItem("TABLE_NAME")->Value;
//获取表格类型
_bstr_t table_type = pSet->Fields->GetItem("TABLE_TYPE")->Value;
//过滤一下,只输出表格名称,其他的省略
if ( strcmp(((LPCSTR)table_type),"TABLE")==0){
CString tt;
tt.Format("%s",(LPCSTR)table_name);
AfxMessageBox(tt);
}
pSet->MoveNext();
}
pSet->Close();
}
m_pConnect->Close();
}catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
return -1;
}
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 acmain_chm 的回复:]
引用我调试运行,执行SELECT * FROM 新表,不会进入catch,直接就是异常了,那怎么判断表是否存在。
说明:我的表是不存在的。

自己写个判断函数

bool isTableExist(char* tableName)
{
bool b = true;
try {
.... "select * from tablename

}catch(exceptio……
[/Quote]
关键是进不去catch,直接在执行语句的时候就中断了。
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwwa 的回复:]
try
{
//你的代码
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
看看能否捕获异常??
用ADO连接MDB?
[/Quote]

std::string strHisDbPath = theApp.m_SystemSetInfo.szHisDbStorePath;
//strHisDbPath += "\\";
strHisDbPath += theApp.m_SystemSetInfo.ExistSystemSet.szCurrentSysName;
strHisDbPath += ".mdb";
CString strConn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = "));
strConn += strHisDbPath.c_str();
::CoInitialize(NULL);
HRESULT hr = S_OK;
if (!CFileHelper::IsFileExist(strHisDbPath.c_str()))
{
//if db file not exist,then create it
try
{
ADOX::_CatalogPtr pCatalog = NULL;
hr = pCatalog.CreateInstance(__uuidof (ADOX::Catalog));
if(FAILED(hr))
{
_com_issue_error(hr);
}
else
{
pCatalog->Create(_bstr_t(strConn)); //Create mdb
}
}
catch(_com_error *e)
{
TRACE(e->ErrorMessage());
::CoUninitialize();
return FALSE;
}
}
_ConnectionPtr pConn;
try
{
//Create table
pConn.CreateInstance(__uuidof(Connection));
pConn->Open(_bstr_t(strConn), "", "", adConnectUnspecified);
_RecordsetPtr rc ;
rc.CreateInstance(__uuidof(Recordset));
_variant_t RecordsAffected;
CString strSql,strTableName,strTemp;
strTemp = "select * from ";
BSTR bstrSQL;
for (int i = 0; i < theApp.m_StationSystem.StationTagVector.size(); i++)
{
strTableName = theApp.m_StationSystem.StationTagVector.at(i).szTagName;
//rc = pConn->OpenSchema(adSchemaTables);
strSql = strTemp + strTableName;
bstrSQL = strSql.AllocSysString();
try
{
rc->Open(bstrSQL,
pConn.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);

// pConn->Execute(bstrSQL,&RecordsAffected,adCmdText);
}
catch (_com_error* e)
{
TRACE(e->ErrorMessage());//这里不进来了,直接在上面的OPEN函数执行时出错了
}
//hr = pConn->Execute(bstrSQL, &RecordsAffected, adCmdText);
}
}
catch (_com_error* e)
{
TRACE(e->ErrorMessage());
pConn = NULL;
::CoUninitialize();
return FALSE;
}

pConn->Close();
pConn = NULL;
::CoUninitialize();
ACMAIN_CHM 2010-06-22
  • 打赏
  • 举报
回复
[Quote]我调试运行,执行SELECT * FROM 新表,不会进入catch,直接就是异常了,那怎么判断表是否存在。
说明:我的表是不存在的。[/Quote]

自己写个判断函数

bool isTableExist(char* tableName)
{
bool b = true;
try {
.... "select * from tablename

}catch(exception e)
{
b=false;
}
return b;
}
WWWWA 2010-06-22
  • 打赏
  • 举报
回复
try
{
//你的代码
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
看看能否捕获异常??
用ADO连接MDB?
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wwwwa 的回复:]
第一个方法,错误原因有新表不存在这种错误不?
可以
[/Quote]
我通过你的
SELECT * FROM 新表
捕获错误
我调试运行,执行SELECT * FROM 新表,不会进入catch,直接就是异常了,那怎么判断表是否存在。
说明:我的表是不存在的。
ACMAIN_CHM 2010-06-22
  • 打赏
  • 举报
回复
[Quote]这个需要开放MSysObjects对象的安全属性,但是我的数据库是在程序中创建的,不能手动更改安全属性。谢谢你的回答。[/Quote]如果是我就使用 try catch 了。你可以根据expception e的返回信息断定是否是表不存在。
WWWWA 2010-06-22
  • 打赏
  • 举报
回复
第一个方法,错误原因有新表不存在这种错误不?
可以
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
你直接访问系统表MSysObjects就可以了。

select * from MSysObjects where Name='mytableName'
[/Quote]
这个需要开放MSysObjects对象的安全属性,但是我的数据库是在程序中创建的,不能手动更改安全属性。谢谢你的回答。
zxdyu2009 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwwa 的回复:]
你的第一个方法,捕获错误,不好吧,错误引起不一定是表存在引起的错误。
SELECT * FROM 新表
捕获错误

第二个方法,我的表太多了(可能上万来了),我每次加新表都要判断是否存在,每次都要取得所有表,不现实吧。
可以将所有表存入一个表中,查询此表
[/Quote]
第一个方法,错误原因有新表不存在这种错误不?
第二个方法要添加一个新表,每次新添加的表都要把表名放入这个表,删除也要把这个表的内容相应的表名删除,增加了复杂度。
看来还得用第一种方法。谢谢你!
ACMAIN_CHM 2010-06-22
  • 打赏
  • 举报
回复
你直接访问系统表MSysObjects就可以了。

select * from MSysObjects where Name='mytableName'
WWWWA 2010-06-22
  • 打赏
  • 举报
回复
你的第一个方法,捕获错误,不好吧,错误引起不一定是表存在引起的错误。
SELECT * FROM 新表
捕获错误

第二个方法,我的表太多了(可能上万来了),我每次加新表都要判断是否存在,每次都要取得所有表,不现实吧。
可以将所有表存入一个表中,查询此表
加载更多回复(2)

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧