如何动态定义CRecordSet的字段
无论在MFC还是在ATL中,CRecordSet(不一定这个名字吧)类的字段个数、类型都是事先定义的,请问如何在程序中动态创建这些东西。
我的目的是:用MFC或ATL创建一个CRecordSet的派生类(或者其它方式),传入不同的SQL语句,选出不同的字段(字段个数先后不同,字段类型先后不一致),供我操作,如何实现?请教了!
(ATL中我知将所用字段绑定为字符串,但如何对不同类型作处理呢?最好用MFC实现)
(希望提供例子代码)
问题点数:200、回复次数:11Top
1 楼TangDL(软件流氓)回复于 2001-12-12 13:03:08 得分 0
对了,不用ADO,虽然其操作方便,但太慢了Top
2 楼caigzhi(George Cai)回复于 2001-12-12 18:45:07 得分 0
胡说Top
3 楼caigzhi(George Cai)回复于 2001-12-12 18:53:00 得分 0
ado对个人的要求高一点,但是它是最灵活的,效率也高,
OLEDB就是建立在ADO的基础之上的Top
4 楼masterz(www.fruitfruit.com)回复于 2001-12-12 20:56:13 得分 30
http://codeguru.earthweb.com/mfc_database/generic_recordset.shtml
这篇文章是对CDaoRecordset扩充,你可以参考一下写出基于CRecordset的类Top
5 楼masterz(www.fruitfruit.com)回复于 2001-12-12 21:00:05 得分 30
DYNABIND: Illustrates Dynamic Binding of Database Columns to a Recordset
MSDN sampleTop
6 楼Tasehouny(阿甘)回复于 2001-12-12 21:14:16 得分 100
这个有一点点麻烦,我以前写过一个DBGrid,实现动态绑定,现在代码不知到哪里去了,我给你一个思路吧!
你传入一个SQL语句,然后打开这个记录集
sprintf(strsql,"select * from _Nerve_Forum_Table ");
lSet.Open(CRecordset::snapshot,strsql,CRecordset::readOnly);
你可以用short filecount = lSet.GetODBCFieldCount() 获得字段的数目
CODBCFieldInfo& fieldinfo ;
for(int i=0;i<fieldcount;i++)
{
lSet.GetODBCFieldInfo(i,fieldinfo); //获得字段的类型和名称,自动绑定用到的信息可以从这里获得
}
知道字段的数目,字段的类型,字段的名称,就可按照记录数提取记录的内容了。如果你懒一点,你可以用CDBVariant 类型来代替所有字段的类型。
CDBVariant t
int nId;
lSet.GetFieldValue("id",t);
ASSERT(t.m_dwType==DBVT_LONG);
nId = t.m_lVal;
Item.nForumId = nId;
lSet.GetFieldValue("ParentId",t);
ASSERT(t.m_dwType==DBVT_LONG);
nId = t.m_lVal;
Item.nParentId = nId;
Top
7 楼wealth(wealth)回复于 2001-12-12 21:20:03 得分 10
TangDL:
数据库中其实各个字段的绑定系可以用代码进行,仲记唔记得记录结果集中的各个对象用法?
其实只要你熟悉结果集的对象,此问题就话甘快搞掂。
编程不要依靠人地的代码,世上最好的代码仲系要靠自己
我自己都曾经系呢个问题上搞了几个礼拜,希望你认真的去睇吓个结果集的对象用法。
广州的wealthTop
8 楼TangDL(软件流氓)回复于 2001-12-13 08:41:58 得分 0
To:caigzhi(caigzhi)
“胡说”一词不知何解,这儿这么多高手,对“OLEDB就是建立在ADO的基础之上的”应有正确的理解吧!ADO我用了3年了,只是这次想换个方式。
谢谢masterz、Tasehouny、wealth等,我将尽快尝试,一有结果,马上给分Top
9 楼TangDL(软件流氓)回复于 2001-12-14 12:46:34 得分 0
请教:
字段绑定的原理我倒是有了一点头绪,但对应字段的变量呢,怎么个定义法,我建了一个指针数组,感觉上有些别扭,有好方法吗?
Top
10 楼whool(喔)回复于 2001-12-14 13:22:32 得分 30
CDatabase db;
CRecordSet rt(&db);
db.Open();
CRecordSet.Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
lpszSQL A string pointer containing one of the following:
1A NULL pointer.
2The name of a table.
3An SQL SELECT statement (optionally with an SQL WHERE or ORDER BY clause).
4A CALL statement specifying the name of a predefined query (stored procedure). Be careful that you do not insert whitespace between the curly brace and the CALL keyword.
For more information about this string, see the table and the discussion of ClassWizard’s role under Remarks
Top
11 楼TangDL(软件流氓)回复于 2001-12-17 07:48:00 得分 0
谢了Top




