271上位机VC MFC使用ODBC新建数据表
271上位机VC MFC使用ODBC新建数据表
功能展示
在我们数据库工程开发中,往往要新建表,我们当前例程演示新建表的功能,例程仅演示新数据表的建立,并没有向新表中添加任何数据,效果如图,点击菜单的<创建 新表格>,例程会新建一数据表,由于表中没有记录,所以还会弹出提示对话框; 要点提示 1.创建表格只要调用CDataBase类的成员函数ExecuteSQL便可,例程中实现的代码段为sTableCommand="CREATE TABLE 工控编程吧1(WebName varchar(10) NOT NULL,WebAddrvarchar(20))"; m_Set->m_pDatabase->ExecuteSQL(sTableCommand);
《CREATE TABLE 工控编程吧1》表示新创建数据表工控编程吧1,WebAddr,WebName 为表的字段名, varchar(10) 表示字段的类型,NOT NULL表示字段不能为空 实现功能 1.新建一视窗派生于CListView的单文档的应用程序; 3.在视窗类中包含二头文件#include<afxdb.h>#include<ODBCINST.H> 4.在视窗类中添加三成员变量public:public: CDatabase m_DB; CListCtrl* m_List;//列表视图控件的指针
CRecordset* m_Set;//记录集对象的指针并在构造函数中初始化,在析构函数中删除 - CGkbc8View::CGkbc8View()
- {
- m_Set=NULL;
- m_List=&GetListCtrl();//获取列表视图控件
- m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
- }
- CGkbc8View::~CGkbc8View()
- {
- if(m_Set!=NULL)
- delete m_Set;
- }
复制代码5.在视窗中化函数OnInitialUpdate()中注册数据源,并连接记录集显示数据 - void CGkbc8View::OnInitialUpdate()
- {
- CListView::OnInitialUpdate();
- if(m_Set==NULL)
- {
- if(!SQLConfigDataSource(NULL, //父窗口指针;
- ODBC_ADD_DSN, //添加的数据源的类型;
- "Microsoft Access Driver (*.mdb)",//驱动程序名;
- //属性:
- "DSN=Students\0" //数据源名
- "Description=工控编程吧测试用\0" //数据源的说明
- "FileType=Microsoft Access\0" //数据源文件类型
- "DBQ=E:\\每日任务\\STUDENTSINFO.MDB\0"//数据库文件全路径名
- //在根据现有数据设置列的数据类型时所要扫描的行数。 可以为 1 到 16,
- //默认值为 8;如果设置为 0,将扫描 所有行。(如果数字超出界限,会返回一个错误)
- "MaxScanRows=0\0")
- )
- {
- AfxMessageBox("创建数据源失败!!");
- return;
- }
- m_Set=new CRecordset(&m_DB);
- if(!m_DB.OpenEx(_T("DSN=Students"),0))
- {
- AfxMessageBox("打开数据源失败!!");
- return;
- }
- m_Set->Open(CRecordset::dynaset,_T("Select * from Basic"));
- }
- int i=0,j=0;
- CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
- LV_COLUMN LvColumn;//存储列信息的结构体
- LvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
- //读取记录集的字段信息
- int nDBFields=m_Set->GetODBCFieldCount();
- for(i=0;i<nDBFields;i++)
- {
- m_Set->GetODBCFieldInfo(i,DbFi);
- LvColumn.iSubItem=i;
复制代码- LvColumn.fmt=LVCFMT_CENTER;
- LvColumn.cx=DbFi.m_strName.GetLength()*10+20;
- LvColumn.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
- GetListCtrl().InsertColumn(i,&LvColumn);
- }
- //根据记录集的数据信息添加行
- LV_ITEM LvItem;//条目结构体对象
- CString string;//字符串临时变量
- CDBVariant DbVariant;
- i=0;
- if(m_Set->IsEOF())//记录集是否为空
- {
- AfxMessageBox("记录集没有记录");
- return;
- }
- m_Set->MoveFirst();//从第一个记录开始
- while(m_Set->IsEOF()==0)//是否到达最后一个记录
- {
- LvItem.mask=LVIF_TEXT;
- LvItem.iItem=i;
- LvItem.iSubItem=0;
- m_Set->GetFieldValue((short)0,string);
- LvItem.pszText=string.GetBuffer(string.GetLength());
- m_List->InsertItem(&LvItem);//插入条目
- //显示列数据
- for(j=1;j<nDBFields;j++)
- {
- m_Set->GetFieldValue((short)j,string);
- m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
- }
- m_Set->MoveNext();//下移记录
- i++;
- }
- }
复制代码6.添加菜单项<创建新表格>关联函数,实现执行SQL语句功能 - void CGkbc8View::OnCreate()
- {
- m_List->SetRedraw(FALSE);
- m_List->DeleteAllItems();
- CHeaderCtrl* pHeader = (CHeaderCtrl*) m_List->GetDlgItem(0);
- int nColCount = pHeader->GetItemCount();
复制代码- for(int k=nColCount-1;k>=0;k--)
- {
- int re=m_List->DeleteColumn(k);
- }
- if(m_Set->IsOpen())
- m_Set->Close();
- //<>
- CString sTableCommand;
- sTableCommand="CREATE TABLE 工控编程吧1(WebName varchar(10) NOT NULL,WebAddr varchar(20))";
- m_Set->m_pDatabase->ExecuteSQL(sTableCommand);
- CString sSelect;
- sSelect="SELECT * FROM 工控编程吧1;";
- if(!m_Set->IsOpen())
- m_Set->Open(CRecordset::dynaset,sSelect);
- int j=0;
- CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
- LV_COLUMN LvColumn;//存储列信息的结构体
- LvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
- //读取记录集的字段信息
- int nDBFields=m_Set->GetODBCFieldCount();
- for(int i=0;i<nDBFields;i++)
- {
- m_Set->GetODBCFieldInfo(i,DbFi);
- LvColumn.iSubItem=i;
- LvColumn.fmt=LVCFMT_CENTER;
- LvColumn.cx=DbFi.m_strName.GetLength()*10+20;
- LvColumn.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
- GetListCtrl().InsertColumn(i,&LvColumn);
- }
- //根据记录集的数据信息添加行
- LV_ITEM m_item;//条目结构体对象
- CString string;//字符串临时变量
- CDBVariant DbVariant;
- i=0;
- if(m_Set->IsEOF())//记录集是否为空
- {
- AfxMessageBox("记录集没有记录");
- return;
- }
- m_Set->MoveFirst();//从第一个记录开始
- while(m_Set->IsEOF()==0)//是否到达最后一个记录
-
复制代码- {
- m_item.mask=LVIF_TEXT;
- m_item.iItem=i;
- m_item.iSubItem=0;
- m_Set->GetFieldValue((short)0,string);
- m_item.pszText=string.GetBuffer(string.GetLength());
- m_List->InsertItem(&m_item);//插入条目
- //显示列数据
- for(j=1;j<nDBFields;j++)
- {
- m_Set->GetFieldValue((short)j,string);
- m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
- }
- m_Set->MoveNext();//下移记录
- i++;
- m_List->SetRedraw();
- m_List->Invalidate();
- }
- }
复制代码我们来演示功能实现的整个过程
|