最后90分求助:vc/mfc中使用ODBC的难题,请指点……

pjf2000 2005-03-22 02:30:00
vc/mfc 项目 + Sql Server2000 开发数据库项目

现有这样两个表:合同表 A, 合同明细表B。结构如下:

A: B:
ContractID VarChar 50 ContractID VarChar 50
Company VarChar 100 DetailID VarChar 50
…… TheFee float 8
Currency VarChar 10

现在小弟要实现这样的功能:
查询每个合同的合同明细金额之和,要求返回合同号,公司名称,合同明细金额之和(按币值分开)

我写了一个Sql语句来实现该功能:
Select a.ContractID, a.Company, Sum(b.TheFee) from A LEFT JOIN B ON a.ContractID = b.ContractID Group By ContractID, Currency

小弟遇到的问题是:
上述Sql语句通过db.Execute()来执行后。在不借助其他表的情况下:对于执行的结果,在vc/mfc中,如何使用ODBC逐条访问。

请高手指点……

学习,关注……
...全文
153 点赞 收藏 19
写回复
19 条回复
goodheartppl 2005年03月24日
用RECORDSET
回复 点赞
inpriser 2005年03月24日
两层循环不就行了?

或者

采用游标
回复 点赞
yzhouen 2005年03月24日
至于如何读取每条记录中的各个数据,在你的sql语句里控制,然后用
SQLBindCol将查询值绑定到变量中,进行读取!
你可以查看这SQLBindCol、SQLExecDirect、SQLFetch几个函数的用法
回复 点赞
pjf2000 2005年03月23日
谢谢!试试先……
回复 点赞
mousefj 2005年03月23日
char pTmp[32];
_ltoa(m_lData,pTmp,10);
这两句要删除
m_lData已经是long型。
回复 点赞
mousefj 2005年03月23日
我的例子得到是CDBVariant 类型
CString m_sVal;
long m_lData;
CDBVariant m_dbVarVal;
m_pRecordset->GetFieldValue("mailSender",m_sVal);
m_pRecordset->GetFieldValue("mailDate",m_dbVarVal);
m_lData=m_dbVarVal.m_lVal;
char pTmp[32];
_ltoa(m_lData,pTmp,10);
回复 点赞
msm 2005年03月23日
楼上正解阿,这个其实应该不难得。
只要有一个结果集和拼接好的sql字符串,剩下的就是体力活了
回复 点赞
pjf2000 2005年03月23日
请高手指点一下……
回复 点赞
Kudeet 2005年03月23日
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库
CDatabase database;
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.
sSql = "SELECT * FROM demo";
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
while (!recset.IsEOF())
{
//读取数值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
回复 点赞
pjf2000 2005年03月23日
好的,我找找看吧……


学习……
回复 点赞
0011411 2005年03月23日
up
回复 点赞
tudou614 2005年03月23日
学习……
回复 点赞
pjf2000 2005年03月23日
to : laiyiling(※陌生人·坚持理想※)

在使用你给我的方法的时候,出现一个问题:
recset.GetFieldValue("Age", sItem1);
如果字段使用的是int或者float类型的话,那么sItem1就没有办法取得该字段的值,请问要怎么解决啊?

请指点一下,谢谢!

学习……
回复 点赞
LemonYang 2005年03月22日
直接使用ODBCAPI函数来写,非常简单,网上有好多例子,可以找一下
回复 点赞
pjf2000 2005年03月22日
顶一下……
回复 点赞
pjf2000 2005年03月22日
楼上的大哥,可不可以详细解释一下你的代码,谢谢!

另外,你的代码中好象没有给出如何读取每条记录中的各个数据。

学习,关注……
回复 点赞
yzhouen 2005年03月22日
sprintf((char*)select,"select……");
rc = SQLExecDirect(hstmt, select, SQL_NTS);
if ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
{
SQLBindCol(hstmt,1,SQL_C_LONG,&collectid,0,&cbcollectid);
SQLBindCol(hstmt,2,SQL_C_LONG,&offset,0,&cbeoffset);
while(TRUE)
{
rc=SQLFetch(hstmt); //取查询结果,并把指针指下一条记录
if ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
{

……
}
else
break;
}
SQLCloseCursor(hstmt);
}
回复 点赞
galaxy_coc 2005年03月22日
用odbc的api SQLGetData可以得到数据集 用vc来做数据库编程很不方便哦,还有感觉你的sql语句好想不对,如果在orcal里肯定是错的 应该group by a.contractID, a.Company
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7893

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告