VC数据库难题!高手请进!

auroraiel 2002-11-01 10:32:30
加精
1、数据库里有多个表,我想在程序运行后动态选择表,怎样通过MFC ODBC取得数据库中的各个表的名字?(如果不用ODBC API可以吗)
2、数据库里的几个相互联系的表,通过List Control可以把它们的数据显示出来,但不知如何向多个相互联系的表中插入数据。
...全文
71 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiesuiyaa 2010-06-27
  • 打赏
  • 举报
回复
天才方利在DXF文件读取过程中取得了突破性的进展
可喜可贺
明早奖励自己
一碗皮蛋粥
以示庆贺
天助自助者
tiesuiyaa 2010-06-27
  • 打赏
  • 举报
回复
天才方利在DXF文档的读取工作中取得了突破性的进展
可喜可贺
明早奖励自己一碗皮蛋粥
以示庆贺
auroraiel 2002-11-05
  • 打赏
  • 举报
回复
对于第二个问题,如果课程数不是确定的怎么办,如果一条insert 语句不行,我是否可以用多条insert语句?
small_wei 2002-11-05
  • 打赏
  • 举报
回复
如果课程数不是确定的话,一条语句是搞不定的,但也只能用一条insert语句插入学号 姓名 年龄,然后根据学号用update修改相应的成绩。这种情况最使用存储过程。
auroraiel 2002-11-04
  • 打赏
  • 举报
回复
我只知道一个表能够对应一个类,那么怎么用一个类连接多个表,是否表的结构一定要相同呢?
small_wei 2002-11-04
  • 打赏
  • 举报
回复
第一个问题:
如果是sql server:
select name from sysobjects where uid = (select uid from sysusers where name='username')
access:
CTables.h:
class CTables : public CRecordset
{
virtual CString GetDefaultConnect() { return ""; }
virtual CString GetDefaultSQL() { return ""; }

public:
CTables(CDatabase* pDatabase);
BOOL Open(LPCSTR pszTableQualifier = NULL,
LPCSTR pszTableOwner = NULL,
LPCSTR pszTableName = NULL,
LPCSTR pszTableType = NULL,
UINT nOpenType = forwardOnly);

CString m_strTableQualifier;
CString m_strTableOwner;
CString m_strTableName;
CString m_strTableType;
CString m_strRemarks;

virtual void DoFieldExchange(CFieldExchange*);
};
CTables.cpp:

#include "CTables.h"

//---------------------------------------------------------------------
// CColumnPrivileges


//---------------------------------------------------------------------
// CTables

CTables::CTables(CDatabase* pDatabase)
: CRecordset(pDatabase)
{
m_strTableQualifier = _T("");
m_strTableOwner = _T("");
m_strTableName = _T("");
m_strTableType = _T("");
m_strRemarks = _T("");
m_nFields = 5;
}

BOOL CTables::Open(LPCSTR pszTableQualifier,
LPCSTR pszTableOwner,LPCSTR pszTableName,LPCSTR pszTableType,
UINT nOpenType)
{
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;
}

// Cache state info and allocate hstmt
SetState(nOpenType,NULL,readOnly);
if (!AllocHstmt())
return FALSE;

TRY
{
OnSetOptions(m_hstmt);
AllocStatusArrays();

// Call the ODBC function
AFX_ODBC_CALL(::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();

// Fetch the first row of data
MoveNext();

// If EOF, result set is empty, set BOF as well
m_bBOF = m_bEOF;

}

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_strRemarks);
}

使用时:
CDatabase db;
db.Open("aa");
CTables tb(&db);

char lpszType[64];
strcpy(lpszType, "'TABLE'");
tb.Open(NULL,NULL,NULL,lpszType,CRecordset::snapshot);
while (! tb.IsEOF()){
ml.AddString(tb.m_strTableName);
tb.MoveNext();
}
//m1.SetWindowText(s1);
tb.Close();
db.Close();
第二个问题:
如果课程数是确定的话可以一条sql语句搞定。然后用:db.ExecuteSQL(..)来执行。
sql语句是:
insert into tbalename select 学号,姓名,年龄,(select 成绩 from 成绩表 where 学号=学生表.学号 and 课程号=1 ),(select 成绩 from 成绩表 where 学号=学生表.学号 and 课程号=2 ),(select 成绩 from 成绩表 where 学号=学生表.学号 and 课程号=3 ) from 学生表
52001314 2002-11-04
  • 打赏
  • 举报
回复
如果要对应多个表,可以用CRecrodset.Open(..,sql);
CRecordset.GetValue((short)0,str);取得各个字段。
52001314 2002-11-04
  • 打赏
  • 举报
回复
你一个添加一个recordset派生类,选择对应表的时候选中多个表(表A,B...)。

m_pset->m_strFilter="id='aaa' and A.name=b.name";

就是类似于select * from table A,B where id='aaa' and A.name=b.name

只能进行查询。这样是一个类同时对应多个表,不是可以一会儿连接A,一会儿可以l连接表B
52001314 2002-11-03
  • 打赏
  • 举报
回复
用派生类的话,查询可以同时查询多表,如果你的类是连接多个表的话。
但是,插入的话,可能只能用一个类对应一个表的才能插入吧?如果一个类对应多个表,它怎么知道你要插入哪里?(用AddNew()的话)
auroraiel 2002-11-02
  • 打赏
  • 举报
回复
我正学习MFC ODBC怎么能轻易放弃!
ma811 2002-11-02
  • 打赏
  • 举报
回复
用ADO吧
auroraiel 2002-11-02
  • 打赏
  • 举报
回复
但如果是其它数据库如Access等怎么办,难道没有其它什么函数,非要用ODBC API函数吗
Pipi0714 2002-11-02
  • 打赏
  • 举报
回复
假如连接的数据哭是SQL server你可以访问他的系统表sysobjects看里面的字段你就可以把用户表的名字找出来
auroraiel 2002-11-02
  • 打赏
  • 举报
回复
我用的是CRecordset的派生类
52001314 2002-11-01
  • 打赏
  • 举报
回复
不能同时插入多个表,只能一个一个插入吧?


你是用CRecordset的派生类,还是直接执行SQL语句?
auroraiel 2002-11-01
  • 打赏
  • 举报
回复
用CRecordset::GetTableName()虽能取得数据表的名字,但这是在CRecordset中先将此表打开,表名在此之前已被指定了,我想取的表名是刚刚用CDatabase 打开一个数据库后(此时没有打开表,也不知道数据库中有什么表),取得数据库中所有表的名字,或其中某个表的名字。
auroraiel 2002-11-01
  • 打赏
  • 举报
回复
比如我有三个表,分别是学生、课程、成绩,
学生表为:
学号 姓名 年龄
001 张三 20
002 李四 23
003 王五 21

课程表为:
课程号 课程名
1 数学
2 语文
3 英语

成绩表为:
学号 课程号 成绩
001 1 99
001 2 98
002 3 96
003 2 97
想要插入的数据为:
学号 姓名 年龄 数学 语文 英语
004 某一 20 98 88
005 某二 22 95 90
hsyhsy 2002-11-01
  • 打赏
  • 举报
回复
1.CRecordset::GetTableName()
2.不知你想怎么向多个表插入数据?

4,011

社区成员

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

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