如何获取数据库中的表名问题

YMIW163 2008-11-18 09:29:29
在SQL中有一个名为A的数据库,这个数据库中有很多用户表,如何用VC++获取所有表名,放在一个数组。请问哪路高手知道。
...全文
210 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
m_openstr.Format("use NewDatabase SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' AND NAME LIKE 'ABC%%'");

//这句话应该报SQL语法错误的。我给你写的语句你看了吗?
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
13楼大哥,我的问题不是你回答的那样了。
我可以用SELECT语句执行得了,但是表名没办法在SQL中的记录集中取到。
try
{
_variant_t RecordsAffected;
HRESULT hr_openflag;
Fields *fields=NULL;
CString m_openstr;
m_openstr.Format("use NewDatabase SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' AND NAME LIKE 'ABC%%'");
DataRecord=m_pConnection->Execute((_bstr_t)m_oper,&RecordsAffected5,adCmdText);
if(DataRecord->BOF) ///////在这一步就出错,请问错在哪,按道理这里的记录集中DataRecord中应有很表的记录
{
MessageBox("不存在曲线表!!!");
return false;
}
hr_openflag=DataRecord->get_Fields(&fields);
if(SUCCEEDED(hr_openflag))
{
CString selectstr;
FieldPtr _FieldPtr;
_variant_t _var_Table;
long m_count;
DataRecord->MoveFirst();
m_count=DataRecord->Fields->GetCount();
while(!DataRecord->ADOEOF)
{
_FieldPtr = DataRecord->Fields->GetItem(L"TABLE_NAME");
_var_Table = _FieldPtr->GetValue();
TRACE(_T("表名:%s\n"), _var_Table.bstrVal);
}
}


}
catch(...)
{

}


///////
记录集中DataRecord中应有很表的记录,但是并没有一条表名的记录,
是不是我取表名的方法不对。还是我执行语句出错啊。
是不是这一条
DataRecord=m_pConnection->Execute((_bstr_t)m_oper,&RecordsAffected5,adCmdText);
根本就不是把数据传到记录集中的DataRecord.

请问哪个大哥来帮帮忙,我现在要晕了啊,再搞不出,我得进医院了。
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
如果数据库中有很多表,有一部份表是不知道具体表名,只知道表的开头都是以ABC开头
WHERE [name] LIKE 'ABC%%'
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
怎么没人来处理啊
找不到答案啊。
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
如果数据库中有很多表,有一部份表是不知道具体表名,只知道表的开头都是以ABC开头
怎么样用VC获得表名,并且将这些查得的表名送到一个数组中。
VC的程序怎么写???????
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
Source, ActiveConnection, CursorType, LockType, Options

Source 可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。

ActiveConnection 可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。

CursorType 可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型。可为下列常量之一(参阅 CursorType 属性可获得这些设置的定义)。

常量 说明
AdOpenForwardOnly (默认值)打开仅向前类型游标。
AdOpenKeyset 打开键集类型游标。
AdOpenDynamic 打开动态类型游标。
AdOpenStatic 打开静态类型游标。


LockType 可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值,可为下列常量之一(参见 LockType 属性可获得详细信息)。

常量 说明
AdLockReadOnly (默认值)只读 — 不能改变数据。
AdLockPessimistic 保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
AdLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。
AdLockBatchOptimistic 开放式批更新—用于批更新模式(与立即更新模式相对)。


Options 可选,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。可为下列常量之一(参见 CommandType 属性可获得该列表中前五个常量的详细说明)。

常量 说明
adCmdText 指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdTable 指示 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行。
adCmdTableDirect 指示提供者更改从在 Source 中命名的表中返回所有行。
adCmdStoredProc 指示提供者应该将 Source 视为存储过程。
adCmdUnknown 指示 Source 参数中的命令类型为未知。
adCmdFile 指示应从在 Source 中命名的文件中恢复保留(保存的)Recordset。
adAsyncExecute 指示应异步执行 Source。
adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用。
adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动移到文件末尾。
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
catch(com_error &e)
{
e->ErrMessage();
e->Description(); //这两个错误分别是什么?
}
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
20楼的大哥,问题没你想得那么简单。
现在怎么还没有人帮我解决啊。
lfchen大哥,和我的想法是样,但还是处理不了。
if(DataRecord->BOF && DataRecord->adoEOF)
这一句我也处理不了。
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
还问一下,ADO中记录集Open()函数的各参数是什么意思。
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
m_openstr.Format("use NewDatabase SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE='U' AND [NAME] LIKE 'T_CURVE_%%'");
这条不行啊,还是报错。
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
m_openstr.Format("use NewDatabase SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE='U' AND [NAME] LIKE 'T_CURVE_%%'");
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
try
{
_variant_t RecordsAffected;
HRESULT hr_openflag;
Fields *fields=NULL;
CString m_openstr;
m_openstr.Format("use NewDatabase SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' AND NAME LIKE 'T_CURVE_'");
DataRecord->Open((_variant_t)m_openstr,m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic,adCmdUnknown); ////在这一步就出错,请问错在哪。
if(DataRecord->BOF)
{
MessageBox("不存在曲线表!!!");
return false;
}
hr_openflag=DataRecord->get_Fields(&fields);
if(SUCCEEDED(hr_openflag))
{
CString selectstr;
FieldPtr _FieldPtr;
_variant_t _var_Table;
long m_count;
DataRecord->MoveFirst();
m_count=DataRecord->Fields->GetCount();
while(!DataRecord->ADOEOF)
{
_FieldPtr = DataRecord->Fields->GetItem(L"TABLE_NAME");
_var_Table = _FieldPtr->GetValue();
TRACE(_T("表名:%s\n"), _var_Table.bstrVal);
}
}


}
catch(...)
{

}
风子啊啊 2008-11-19
  • 打赏
  • 举报
回复
select convert(char(50),name) as name1 from sysobjects where type = 'U' order by name1

这个语句就行了
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
if(DataRecord->BOF && DataRecord->adoEOF) //同时在记录头和记录尾,则无记录;正常情况下,打开记录集后,指针是在记录头的,所以DataRecord->BOF 为真
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
m_openstr.Format("use NewDatabase SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' AND NAME LIKE 'ABC%%'");
DataRecord=m_pConnection->Execute((_bstr_t)m_oper,&RecordsAffected5,adCmdText);
if(DataRecord->BOF) ///////在这一步就出错,请问错在哪,按道理这里的记录集中DataRecord中应有很表的记录
{
MessageBox("不存在曲线表!!!");
return false;
}
为什么DataRecord->BOF执行后就出错,
明明可以选出像ABC开头的表,但是DataRecord->BOF为空,是不是不应用这条语句,
那我选出了表,怎么得到表了。
一条晚起的虫 2008-11-19
  • 打赏
  • 举报
回复
报错,执行不了,在VC中有语法错误啊
//什么意思?编译通不过?
YMIW163 2008-11-19
  • 打赏
  • 举报
回复
lfchen :你好
我看了,用了你给我的,报错啊。
m_openstr.Format("use NewDatabase SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE='U' AND [NAME] LIKE 'T_CURVE_%%'");
这条是你给我的吧。我试了,报错,执行不了,在VC中有语法错误啊。
一条晚起的虫 2008-11-18
  • 打赏
  • 举报
回复
具体表名?
YMIW163 2008-11-18
  • 打赏
  • 举报
回复
表名我都可以全部查出来,问题是我怎么样得到具体表名。
YMIW163 2008-11-18
  • 打赏
  • 举报
回复
谢谢。请问你们写个这样的程序没
加载更多回复(1)

4,011

社区成员

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

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