在ADOX 中如何判断一个表的存在与否?

法尔我给他 2009-04-16 12:32:44
在ADOX中应该有个很方便的方法判断吧,那位大大知道,给个例子,谢谢!
...全文
104 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
raymonzhao 2009-04-17
  • 打赏
  • 举报
回复
试着用了一下,但是对MSysObjects系统表没有读写权限,该怎么设置呢(用编程实现)?谢谢诶
-------------
表权限只在于你建连接时的用户名..只要这个用户名有相应的权限就可以了...
法尔我给他 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 raymonzhao 的回复:]
试着用了一下,但是对MSysObjects系统表没有读写权限,该怎么设置呢(用编程实现)?谢谢诶
-------------
表权限只在于你建连接时的用户名..只要这个用户名有相应的权限就可以了...
[/Quote]
感谢大大的帮助!我的数据库只有Admin一个账号,不知道怎么提升权限?
法尔我给他 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oyljerry 的回复:]
先查询所有的表,OpenSchema()
[/Quote]
本人极菜,刚学怎么使用数据库,大大能给详细的操作方法吗,最好有个完整的例子!非常感谢!
法尔我给他 2009-04-17
  • 打赏
  • 举报
回复
非常感谢biweilun 和 raymonzhao 两位大大,虽然我最后用的方法不是两位大大提供的,但是给了我很大的帮助!谢谢!
biweilun 2009-04-16
  • 打赏
  • 举报
回复
这样试试

#include <adoint.h>
#include <adoctint.h>
#include <comdef.h>
#include <shwapi.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "shlwapi.lib")

CComPtr<ADOCatalog>Catalog;
HRESULT hr = Catalog.CoCreateInstance(L"ADOX.Catalog");
if (FAILED(hr))
{
throw _com_error(hr, NULL);
}

static const TCHAR szConnStr[] =
_T("Provider=Microsoft.Jet.OLEDB.4.0;")
_T("Data Source=C:\\TEST1.MDB;");

CComVariant varConn;
hr = Catalog->Create(CComBSTR(szConnStr), &varConn);

CComPtr<ADOTables>Tables = NULL;
Catalog->get_Tables(&Tables);
CComPtr<ADOTable>Table = NULL;
Tables->get_Item(CComVariant(_T("Table Name")), &Table);

if(Table!=NULL)
{
//MessageBox("制定的表存在");
}
biweilun 2009-04-16
  • 打赏
  • 举报
回复
你单步下看看

TablesPtr pTables = pCatalog->GetTables();

这一行的pTables是否取到了值?如果pTables有地址的话,

_Table* pTable = NULL;
pTables->get_Item(CComVariant(_T("Table Name")), &pTable);


pTable将是一个指向那个名字为“Table Name”的表的指针,可以方便的操作。

我突然想到我的代码写的不好。

TablesPtr pTables = NULL;
pTables =pCatalog->GetTables(); //看这行单步过后,pTables的值是否为NULL


法尔我给他 2009-04-16
  • 打赏
  • 举报
回复
非常感谢biweilun ,终于语句通过了,但是这个判定好像没用,语句始终不走{}中间的内容,即使是换成 == S_FALSE
if (pTables->get_Item(CComVariant(_T("Table Name")), &pTable) == S_OK)
{
// OK 指定的表存在。
}
大大知道是什么问题吗?
biweilun 2009-04-16
  • 打赏
  • 举报
回复
msadox.tlh文件这是什么?没有读写权限这个比较麻烦,要用接口的好像。

#include <adoint.h>
#include <adoctint.h>
#include <comdef.h>
#include <shwapi.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "shlwapi.lib")
这些头文件是必要的吧?
法尔我给他 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 raymonzhao 的回复:]
写一个查询系统表的SQL就可以了..我忘了那系统表是啥名了..你先找一下看,不行我到时再翻下原来的代码看
[/Quote]
试着用了一下,但是对MSysObjects系统表没有读写权限,该怎么设置呢(用编程实现)?谢谢诶
法尔我给他 2009-04-16
  • 打赏
  • 举报
回复
试着用里一下,但是对MSysObjects系统表没有读写权限,该怎么设置呢(用编程实现)?谢谢诶
法尔我给他 2009-04-16
  • 打赏
  • 举报
回复
添加

#include <adoint.h>
#include <adoctint.h>
#include <comdef.h>
#include <shwapi.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "shlwapi.lib")
这些语句后
我的msadox.tlh文件全部都是错误,报错里面的全是未定义符号!
这是怎么回事?
谢谢!
biweilun 2009-04-16
  • 打赏
  • 举报
回复
加入

#import "c:\program files\common files\system\ado\msadox.dll"
using namespace ADOX;
biweilun 2009-04-16
  • 打赏
  • 举报
回复

#include <adoint.h>
#include <adoctint.h>
#include <comdef.h>
#include <shwapi.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "shlwapi.lib")

CComPtr<ADOCatalog>Catalog;
HRESULT hr = Catalog.CoCreateInstance(L"ADOX.Catalog");
if (FAILED(hr))
{
throw _com_error(hr, NULL);
}

static const TCHAR szConnStr[] =
_T("Provider=Microsoft.Jet.OLEDB.4.0;")
_T("Data Source=C:\\TEST1.MDB;");

CComVariant varConn;
hr = Catalog->Create(CComBSTR(szConnStr), &varConn);

TablesPtr pTables = pCatalog->GetTables();
_Table* pTable = NULL;
if (pTables->get_Item(CComVariant(_T("Table Name")), &pTable) == S_OK)
{
// OK 指定的表存在。
}
raymonzhao 2009-04-16
  • 打赏
  • 举报
回复
写一个查询系统表的SQL就可以了..我忘了那系统表是啥名了..你先找一下看,不行我到时再翻下原来的代码看
法尔我给他 2009-04-16
  • 打赏
  • 举报
回复
感谢liweilun的回答:运行时出现如下错误,怎么解决呀?error C2039: “get_Item”: 不是“ADOX::_Table”的成员
谢谢!
biweilun 2009-04-16
  • 打赏
  • 举报
回复
不要忘了

#import "c:\program files\common files\system\ado\msadox.dll"
using namespace ADOX;
biweilun 2009-04-16
  • 打赏
  • 举报
回复

_CatalogPtr pCatalog;
pCatalog.CreateInstance(__uuidof(Catalog));
pCatalog->Create(CComBSTR(szConnStr));
//得到了Catalog对象就可以操作它里面的子对象(Groups, Procedures, Tables, Views, Users)等,例如要检查某个表是否已经存在 :
TablesPtr pTables = pCatalog->GetTables();
_Table* pTable = NULL;
if (pTables->get_Item(CComVariant(_T("Table Name")), &pTable) == S_OK)
{ // OK 指定的表存在。
//do something

}

oyljerry 2009-04-16
  • 打赏
  • 举报
回复
先查询所有的表,OpenSchema()

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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