如何配置ODBC数据源(以Access数据库为例)数据库 2009-11-03 15:53:00 阅读515 评论0 字号:大中小 订阅 .
假设我们已经通过Access创建了一个Sample.mdb文件(假设放在C:\DB\目录下),里面包含了所有的表,索引和数据。首先我们打开“控制面板”--“管理工具”--“数据源(ODBC)”
在用户DSN这一页,单击填加。
然后选择数据库的驱动程序,这里我们选择Microsoft Access Driver(*.mdb)。两外也有两项是以(*.mdb结尾)的。不过不能选那两个。然后单击完成。
然后在数据源名(N)上指定一个名字,可以任意指定,以后在程序里面使用的DSN就是这个名字了。然后选择数据库,在弹出的窗口中找到
C:\DB\Sample.mdb,选择,确定。
这里,有两个复选框,可以规定数据库以只读或者独占的方式打开。另外,也可以通过右下角的"网络(N)…"按纽选择网络上另一台机器上的数据库。
返回到如下界面:
假设我们已经通过Access创建了一个Sample.mdb文件(假设放在C:\DB\目录下),里面包含了所有的表,索引和数据。首先我们打开“控制面板”--“管理工具”--“数据源(ODBC)”
在用户DSN这一页,单击填加。
然后选择数据库的驱动程序,这里我们选择Microsoft Access Driver(*.mdb)。两外也有两项是以(*.mdb结尾)的。不过不能选那两个。然后单击完成。
然后在数据源名(N)上指定一个名字,可以恣意指定,以后在程序里面使用的DSN就是这个名字了。然后选择数据库,在弹出的窗口中找到
C:\DB\Sample.mdb,选择,确定。
这里,有两个复选框,可以规定数据库以只读或者独占的方势打开。另外,也可以通过右下角的"枉络(N)…"按纽选择枉络上另一台机器上的数据库。
返回到如下界面:
这时,已经选择好了数据库,可以确定退出。
1.头文件引入ado库;
2.初始化com库;
3.写具体代码;
例如以下代码可以实现连接access数据库并读取字段内容到listbox中:
void CSJKDlg::OnButton1()
{
// TODO: Add your control notification handler code here
_variant_t var;
CString strName,strAdd;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\My Documents\\sjk.mdb",
"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库sjk.mdb是否在当前路径下!");
//return FALSE;
}
try
{
m_pRecordset->Open("SELECT * FROM biao",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
MessageBox("表内数据为空");
}
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("add");
if(var.vt != VT_NULL)
strAdd = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAdd );
m_pRecordset->MoveNext();
}
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
MessageBox(e->ErrorMessage());
}
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset.Release();
m_pConnection.Release();
}
四、利用MFC的C++语言ODBC编程
VisualC++2.0对ODBCAPI进行了封装,封装后,最重要的数据库MFC
类有CDatabase、CRecordset和CRecordView类.尤其是CRecordset类,
它一方面与CDatabase类的对象进行数据交换,另一方面又与CRecordV
iew类进行数据交换,是CDatabase类和CRecordView类之间的桥梁.它
们之间的作用关系如图2所示.
实际上,CDatabase类的每个对象代表了一个数据源的连接,适宜
于对数据源下的某个表格进行整体操作;CRecordset类的每个对象代
表了记录的集合,这个集合是对指定数据表格按预定的查询条件获得
的,它适宜于对所选的记录集合进行操作;CRecordView类的每个对象
是与之相联系CRecordset类对象的外部表现形式,它的作用是把CReco
rdset类对象的变化以一些标准Windows控制的形式表现出来,是主要
的用户界面.
在应用编程时,根据问题的复杂程度和要求,可采用两种不同的方
法来实现.如果仅仅是对某指定的数据库进行
一些简单的操作,如向数据库中追加、删除、更改一些特定的记
录等,并且不需要显示数据库的这些变化的话,就可以采用第一种方法
,仅仅利用CDatabase类的相关功能来实现.这种方法只需两步就可完
成:
1.调用CDatabase类的打开(Open)函数,进行数据源的实际连接.
2.调用CDatabase类的成员函数ExecuteSQL,执行一条SQL语句,实
现特定的数据库操作.下面InsertRecord函数是实现向数据源compone
n的表COMPONEN中插入一行记录,记录的TYPE字段的值为"pump"的最简
代码.
void InsertRecord()
{
CDatabase m-db;
m-db.Open(NULL,FALSE,FALSE,″ODBC;DSN=componen″);
m-db.ExecuteSQL(″insertinto COMPONEN(TYPE)value(′pump
′)″);
m-db.Close();
}
然而,在实际编程中,这种情况很少,多数数据库应用程序不仅要
实现复杂得多的数据库操作,还需要显示变化了的数据库的情况,这样
就需要用到VisualC++的文档/视图结构,需要CDatabase、CRecordset
、CRecordView和CDocument类之间相互配合来实现.下面以VisualC++
2.0的AppWizard和ClassWizard产生的一个实际工程test.mak为例,说
明这些类是如何相互作用的.
工程test.mak的数据源是componen的COMPONEN表,该表的结构如
表1所示.test.exe要实现的功能是按默认的条件查询COMPONEN表,滚
动记录集,并在屏幕上显示当前记录集中的当前记录.有关的代码如下
所示:
表1COMPONEN的结构
class CTestSet:public Crecordset
{
public:
CTestSet(CDatabase*pDatabase=NULL);
DECLARE-DYNAMIC(CTestSet)
//{{AFX-FIELD(CTestSet,CRecordset)
CStringm-NAME;
CString m-CATALOGID;
CStringm-SIZE;
CStringm-ORDERID;
CString m-PRODUCER;
//}}AFX-FIELD
//{{AFX-VIRTUAL(CTestSet)
public:
virtual CStringGetDefaultConnect();//Default connectio
n string
virtual CString GetDefault//default SQLfor Recordset
virtual void DoFieldExchange(CFieldExchange*pFX);//RFX
support
//}}AFX-VIRTUAL
……
};
CStringCTestSet::GetDefaultConnect()
{
return-T(″ODBC;DSN=componen;″);
}
CStringCTestSet::GetDefaultSQL()
{
return-T(″COMPONEN″);
}
void CTestSet::DoFieldExchange(CFieldExchange*pFX)
&nb
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/database_other/20071226/95674.html