261上位机VC MFC使用ODBC动态获得记录集字段信息
261上位机VC MFC使用ODBC动态获得记录集字段信息
功能展示
ODBC程序的实际编写中记录集的字段信息是未知的,这样我们就得在程序中利用代码动态的获取这些字段的信息,当前例程实现不同数据表的字段信息的获取功能,程序初始化时连接表1,自动获得表的字段信息,点击切换数据表,也可自动获取切换后表的字段信息,效果如图
要点提示
1.字段信息存储在CODBCFieldInfo结构体中,结构体字义如下
struct CODBCFieldInfo {
CStringm_strName; //字段名称 SWORD m_nSQLType; //记录集的SQL数据类型 UDWORD m_nPrecision; //数据的位数精度 SWORD m_nScale; //小数点的位数 SWORDm_nNullability; }; //字段是否可以为NULL 2.结构体信息的获取可以用CRecordSet类的成员 函数GetODBCFieldInfo() void GetODBCFieldInfo( LPCTSTR lpszName, CODBCFieldInfo& fieldinfo );
void GetODBCFieldInfo( short nIndex, CODBCFieldInfo& fieldinfo ); lpszName :字段名称; Fieldinfo: CODBCFieldInfo结构体指针; nIndex:字段序号 实现功能 1.新建基于对话框的应用程序; 2.按照例程界面给主对话框添加三个编辑框ID分别 为IDC_STUID,IDC_STUNAME,IDC_STUGRADYEAR分别关联变量CString m_ID;CString m_Name; CString m_Year; 3.再给主对话框添加两变量private:CDatabase m_DB; CRecordset* m_Set; 及一头文件#include "Afxdb.h"//数据库支持 4.分别添加按钮控件<连接--数据源><第一条记录><下一条记录><上一条记录><最后一条记录>分别关联函数 - void CGkbc8Dlg::OnConnect()
- {
- if(m_DB.IsOpen())
- return;
- if(!m_DB.OpenEx(_T("DSN=student"),0))//连接数据源
- {
- AfxMessageBox("打开数据源失败!!");//报告错误
- return;
- }
- if(m_Set==NULL)
- m_Set=new CRecordset(&m_DB);
- if(!m_Set->IsOpen())
- m_Set->Open(CRecordset::dynaset,_T("Select * from 表1"));//选择数据表并打开
-
- short nFields;//存储字段数目
- nFields=m_Set->GetODBCFieldCount();//获得字段数目
复制代码- CODBCFieldInfo FieldInfo;//存储字段信息的结构体
- m_Set->GetODBCFieldInfo(short(0),FieldInfo);//获得字段信息
- m_sID=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(1),FieldInfo);
- m_sName=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(2),FieldInfo);
- m_sYear=FieldInfo.m_strName;
- if(m_Set->IsEOF())//记录集是否为空
- {
- AfxMessageBox("记录集没有记录");
- return;
- }
- m_Set->MoveFirst();//第一个记录
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第1 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第2 列赋给此控件
- UpdateData(FALSE);//更新对话框
- }
- void CGkbc8Dlg::OnSelect()
- {
- m_Set->MoveFirst();//第一个记录
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第1 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第2 列赋给此控件
- UpdateData(FALSE);//更新对话框
- }
- void CGkbc8Dlg::OnRecordNext()
- {
- m_Set->MoveNext();//下一个记录开始
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第0 列赋给此控件
- UpdateData(FALSE);//更新对话框
- }
- void CGkbc8Dlg::OnRecordPrev()
- {
- m_Set->MovePrev();//上一个记录开始
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第0 列赋给此控件
- UpdateData(FALSE);//更新对话框
- }
复制代码- void CGkbc8Dlg::OnRecordLast()
- {
- m_Set->MoveLast();//最后一个记录开始
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第0 列赋给此控件
- UpdateData(FALSE);//更新对话框
- }
复制代码OnConnect()函数可以选择性在程序初始化是调用一次 5.再给主对话框添加一变量m_bSwitch初始化为m_bSwitch = FALSE; m_Set = NULL;对话框资源中添加三个静态文本控件 分别为IDC_ID ,IDC_NAME, IDC_GRADYEAR, 分别关联变量Cstringm_sID, Cstring m_sName, Cstring m_sYear。添加一按钮<切换 数据表>关联函数,实现不同表间的切换功能 - void CGkbc8Dlg::OnSwitch()
- {
- CODBCFieldInfo FieldInfo;
- short nFields;
- if(m_Set->IsOpen())
- m_Set->Close();
- if(m_bSwitch)
- {
- //选择数据表并打开
- m_Set->Open(CRecordset::dynaset,_T("Select * from 表1"));
- nFields=m_Set->GetODBCFieldCount();
- m_Set->GetODBCFieldInfo(short(0),FieldInfo);
- m_sID=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(1),FieldInfo);
- m_sName=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(2),FieldInfo);
- m_sYear=FieldInfo.m_strName;
- m_Set->MoveFirst();//第一个记录
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第1 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第2 列赋给此控件
- UpdateData(FALSE);//更新对话框
- m_bSwitch=FALSE;
- }
- else
- {
- m_Set->Open(CRecordset::dynaset,_T(“Select * from Basic”)); //选择数据表并打开
复制代码- nFields=m_Set->GetODBCFieldCount();
- m_Set->GetODBCFieldInfo(short(0),FieldInfo);
- m_sID=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(1),FieldInfo);
- m_sName=FieldInfo.m_strName;
- m_Set->GetODBCFieldInfo(short(2),FieldInfo);
- m_sYear=FieldInfo.m_strName;
-
- m_Set->MoveFirst();//第一个记录
- m_Set->GetFieldValue((short)0,m_ID);//把第0 列赋给此控件
- m_Set->GetFieldValue((short)1,m_Name);//把第1 列赋给此控件
- m_Set->GetFieldValue((short)2,m_Year);//把第2 列赋给此控件
- UpdateData(FALSE);//更新对话框
- m_bSwitch=TRUE;
- }
- }
复制代码我们来演示整个功能实现 过程
|