在VC中動態使用FoxPro數據庫
發表時間:2024-02-23 來源:明輝站整理相關軟件相關文章人氣:
[摘要]紫 瑗 前言 我們在用VC++進行基于數據的綜合開發時,會經常訪問到大量的物理存儲位置不可預見的FoxPro數據表(.DBF文件)。這時,我們就要使用到動態加載ODBC的技術去訪問這些數據表! 黾夹g要點分析 使用ODBC技術時,要求程序開發人員能預先確定數據源的位置,利用“控制面板”中的...
紫 瑗
前言
我們在用VC++進行基于數據的綜合開發時,會經常訪問到大量的物理存儲位置不可預見的FoxPro數據表(.DBF文件)。這時,我們就要使用到動態加載ODBC的技術去訪問這些數據表。
■技術要點分析
使用ODBC技術時,要求程序開發人員能預先確定數據源的位置,利用“控制面板”中的“ODBC管理器”手工加載數據庫。但在實際的開發中,特別是基于Client/Server網絡環境的綜合開發中,往往無法確定數據源的位置,而只能進行動態加載。對于這種情況,我們可以使用一個Windows API函數 SQLConfigDataSource( )來完成這一操作。
■應用舉例
先用FoxPro生成一張數據表Member.dbf,并設計好各項字段。注意字段名用英文,否則在VC++中使用時會出現錯誤。
接著利用Visulal C++ 的向導生成一個基于對話框的程序,命名為DBFDemo。修改主對話框,如圖所示。利用ClassWizard為程序加入一個基類為CRecordset的名為CUserInfo的新類,按照向導的指示,取得Member.dbf的表結構。在類CUserInfo的頭文件上加入兩個文件包含語句:
#include "afxdb.h"
#include "odbcinst.h"
下面給出范例程序的關鍵代碼:
BOOL CDBFDemoDlg::OnInitDialog()
//主對話框的初始化函數
{
……//省略部分機器生成代碼
//下面一句開始動態增加一個ODBC驅動
SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Visual FoxPro Driver",
"DSN=UserInfo\0Description=UserInfo\
0SourceType=dbf\0Source=d:\\DBF\0");
Database.Open(_T("UserInfo"));
//打開ODBC驅動,Database派生于CDatabase類
UserInfo.m_pDatabase=&&Database;
//設置與CDatabase的連接,UserInfo派生于CUserInfo類
UserInfo.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT FROM member",CRecordset::none);
return TRUE;
}
void CDBFDemoDlg::GetRecordValue()
{
//這個函數取得打開的表中的記錄,并利用DDX/DDV機制相應設置對話框中的各控件
m_Order=UserInfo.m_order;
//取得記錄中各字段的值,并設置相應的控件值
m_Name=UserInfo.m_name;
m_Age=UserInfo.m_age;
m_Addr=UserInfo.m_addr;
if(UserInfo.m_sex==TRUE)
//典型的設置記錄中類型為BOOL型的字段的操作
this-〉CheckRadioButton(IDB_MAN,IDB_WOMAN,IDB_MAN);
else this-〉CheckRadioButton(IDB_MAN,IDB_WOMAN,IDB_WOMAN);
UpdateData(FALSE);
//將記錄信息顯示在對話框中
}
void CDBFDemoDlg::OnNext()
//按鈕“下一個”的響應函數
{
if(!UserInfo.IsEOF())
//測試記錄是否到底部
{
UserInfo.MoveNext();
//向下移動一個記錄
GetRecordValue();
//設置對話框中的記錄顯示
} else
{
//報告到達最末記錄信息
::MessageBox(this-〉m_hWnd,"到達最末記錄","消息框",MB_OK);
UserInfo.MovePrev();
//若到最末記錄,上移一個記錄,避免空操作
}
}
void CDBFDemoDlg::OnPrev()
//按鈕“下一個”的響應函數
{
if(!UserInfo.IsBOF())
//測試記錄是否到達頂部
{
UserInfo.MovePrev();
//向上移動一個記錄
GetRecordValue();
//設置對話框中的記錄顯示
} else
{ //報告到達首記錄
::MessageBox(this-〉m_hWnd,"到達首記錄","消息框",MB_OK);
UserInfo.MoveNext();
}
}
void CDBFDemoDlg::SetRecordValue()
{//這個函數根據對話框中各控件的值設置數據表中的某個記錄的各字段值
UpdateData(TRUE);
//利用DDX/DDV機制取得控件中的值
UserInfo.m_order=m_Order;
UserInfo.m_name=m_Name;
UserInfo.m_addr=m_Addr;
UserInfo.m_sex=Sex;
//變量Sex可以取得“性別”一項中所選的值
UserInfo.m_age=m_Age;
UserInfo.Update(); //更新記錄的值
}
void CDBFDemoDlg::OnApply()
//按鈕“應用”的響應函數
{ //這個函數可以進行用戶所選擇的如“新增用戶”、“修改用戶”、“刪除用戶”的操作
switch(Operator) //變量Operator的值由用戶的選擇而決定
{
case ADD:
//宏“ADD”已經在程序開頭時進行了定義
if(UserInfo.CanAppend()==TRUE)
UserInfo.AddNew(); //新增用戶
SetRecordValue();
this-〉OnAdd();
break;
case MODI: //修改用戶信息
UserInfo.Edit();
SetRecordValue();
break;
case DELE: //刪除用戶
if(UserInfo.IsDeleted()==FALSE)
{
UserInfo.Delete();
this-〉OnPrev();
}
break;
default: //用戶沒有進行操作選擇
::MessageBox(this-〉m_hWnd,"請選擇你所要進行的操作","忘記選擇操作",MB_OK);
break;
}
}
限于篇幅,筆者只列出其主要代碼,讀者可以根據這些關鍵代碼完成這個范例程序。
程序在中/英文Windows 98、VC++ 6.0環境下編譯通過,運行正常。需要注意的是,由于范例中使用的是Visual FoxPro 6.0的ODBC驅動器,所以要試驗這個程序,請先安裝VFP 6.0。