我在网上想寻找一个使用CDao*类来从数据表读出或写入数据资料,但是我没有得到什么线索。现在自己完成了这个功能,从一个微软的Access文件(.MDB)文件中快速、动态、简便的创建/写入/读出数据 。我们的例子是一个基于对话框的程序。
设计我们的接口
为了建立我们的数据库接口,首先我们应该在工程的StdAfx.h文件中加入afxdao.h的声明。
我们将会用到两个类CDaoDatabase和CDaoRecordset,在程序中需要用到这两个类的地方构造它们:
CDaoDatabase database;
CDaoRecordset recordset(&database);
创建我们的数据库文件
如果我们动态的创建一个Access文件,我们不需要使用CDaoDatabase::Open(),因为Create()函数将自动的为我们打开我们连接的数据库:
CString lpszFile = "C://Database.mdb";
database.Create(lpszFile);
打开一个已经存在的数据库文件
database.Open(lpszFile);
很好,现在我们已经成功的连接到了一个数据库中,接下来我们可以向数据表中写入数据了。这里先介绍一些数据表的结构,这对你将来从事数据库开发是有好处的。
一个数据表是一系列的数据单。你可以在一个数据库文件中使用多个数据表,每一个数据表由行(rows)和列(columns)组成。对应与一个行和列的值叫做字段(field)。下面是一个标准的数据表的图示:
现在让我们返回主题。我们首先需要在我们的数据库文件中创建一个数据表。怎么做呢?我们通过创建一个SQL执行字符串来告诉我们的数据库实例来执行它,例如:
CString SqlCmd = "CREATE TABLE MyTable
(Name VARCHAR(20),Age VARCHAR(3));";
database.Execute(SqlCmd);
上面的SQL命令在我们的数据库文件中创建了一个新的叫做MyTable的数据表。它有两列,一个是Name,一类是Age。Name列的数据限制在20个字符,Age列的数据限制在3个字符。很简单吧。
注意:在一个文件中不能创建同名数据表,除非你先通过使用正确的SQL字符串调用Execute()函数,删除这个表。
在新的数据表中加入数据
用CDaoRecordset实例打开我们的数据库,当我们第一次创建它时,我们将有一个CDaoDatabase实例的指针,现在他们都被连接了。为了打开我们的记录并写入数据,我们做下面的代码:
recordset.Open(AFX_DAO_USE_DEFAULT_TYPE,
"SELECT * FROM MyTable", 0);
database.Execute("INSERT INTO MyTable(Name);");
database.Execute("INSERT INTO MyTable(Age);");
recordset.AddNew();
recordset.SetFieldValue("Name","Chris");
recordset.SetFieldValue("Age","13");
recordset.Update();
recordset.MoveNext();
recordset.AddNew();
recordset.SetFieldValue("Name","Joe");
recordset.SetFieldValue("Age","20");
recordset.Update();
下面我们来具体说明一下上面代码的意义:
1.我们使用SQL命令SELECT * FROM MyTable打开记录实例。这意味着打开函数将得到MyTable数据表中的所有可以访问的数据,不管是写或是读。
2.使用SQL字符串调用Execute()来在数据表中加入两个新的列。
3.调用AddNew(),允许我们加入一个新的数据
4.两次调用SetFieldValue,分别为同一行三上的两列加入数据。
5.调用Update()更新数据表的数据。
6.调用MoveNext()把记录指针移向下一个空行,再重复上面的加入数据的方法。
以上就是全部的向数据表中加入数据的方法,下面我们介绍如何从数据表中读出数据。这部分也是相当简单且容易理解的。
CDaoRecordset::GetFieldValue()函数有两个参数,一个是我们想得到数据的列的名称,它与记录指针的当前位置相对应,我们可以通过调用下面的函数自由的移动它:
::Seek();
::MoveFirst();
::MoveNext();
::MovePrev();
::MoveLast();
第二个参数是一个COleVariant实例,COleVariant是一个基于COM的对象。我们的字段数据将被存储在这个对象中,但是把这个存储对象转换到我们可以识别的CString变量是我们所需要的,下面的代码就是来完成这个工作:
COleVariant olevar;
确认我们的CDaoRecordset实例已经被打开,我们调用
while(!recordset.IsEOF());
{
olevar.ChangeType(VT_BSTR, NULL);
recordset.GetFieldValue("Name",olevar);
CString strData = (LPCSTR)olevar.pbstrVal;
// Code for inserting data into a listbox, for example
recordset.MoveNext();
}
ChangeType()方法把COleVariant实例转换到BSTR(一种晦涩的字符串格式)。然后我们pbstrValue方法把格式转换为CString,我们可以在任何需要的地方使用它。这些可以重复使用知道到达数据表中记录的末尾。
相信以上的说明对你有所帮助。
设计我们的接口
为了建立我们的数据库接口,首先我们应该在工程的StdAfx.h文件中加入afxdao.h的声明。
我们将会用到两个类CDaoDatabase和CDaoRecordset,在程序中需要用到这两个类的地方构造它们:
CDaoDatabase database;
CDaoRecordset recordset(&database);
创建我们的数据库文件
如果我们动态的创建一个Access文件,我们不需要使用CDaoDatabase::Open(),因为Create()函数将自动的为我们打开我们连接的数据库:
CString lpszFile = "C://Database.mdb";
database.Create(lpszFile);
打开一个已经存在的数据库文件
database.Open(lpszFile);
很好,现在我们已经成功的连接到了一个数据库中,接下来我们可以向数据表中写入数据了。这里先介绍一些数据表的结构,这对你将来从事数据库开发是有好处的。
一个数据表是一系列的数据单。你可以在一个数据库文件中使用多个数据表,每一个数据表由行(rows)和列(columns)组成。对应与一个行和列的值叫做字段(field)。下面是一个标准的数据表的图示:
现在让我们返回主题。我们首先需要在我们的数据库文件中创建一个数据表。怎么做呢?我们通过创建一个SQL执行字符串来告诉我们的数据库实例来执行它,例如:
CString SqlCmd = "CREATE TABLE MyTable
(Name VARCHAR(20),Age VARCHAR(3));";
database.Execute(SqlCmd);
上面的SQL命令在我们的数据库文件中创建了一个新的叫做MyTable的数据表。它有两列,一个是Name,一类是Age。Name列的数据限制在20个字符,Age列的数据限制在3个字符。很简单吧。
注意:在一个文件中不能创建同名数据表,除非你先通过使用正确的SQL字符串调用Execute()函数,删除这个表。
在新的数据表中加入数据
用CDaoRecordset实例打开我们的数据库,当我们第一次创建它时,我们将有一个CDaoDatabase实例的指针,现在他们都被连接了。为了打开我们的记录并写入数据,我们做下面的代码:
recordset.Open(AFX_DAO_USE_DEFAULT_TYPE,
"SELECT * FROM MyTable", 0);
database.Execute("INSERT INTO MyTable(Name);");
database.Execute("INSERT INTO MyTable(Age);");
recordset.AddNew();
recordset.SetFieldValue("Name","Chris");
recordset.SetFieldValue("Age","13");
recordset.Update();
recordset.MoveNext();
recordset.AddNew();
recordset.SetFieldValue("Name","Joe");
recordset.SetFieldValue("Age","20");
recordset.Update();
下面我们来具体说明一下上面代码的意义:
1.我们使用SQL命令SELECT * FROM MyTable打开记录实例。这意味着打开函数将得到MyTable数据表中的所有可以访问的数据,不管是写或是读。
2.使用SQL字符串调用Execute()来在数据表中加入两个新的列。
3.调用AddNew(),允许我们加入一个新的数据
4.两次调用SetFieldValue,分别为同一行三上的两列加入数据。
5.调用Update()更新数据表的数据。
6.调用MoveNext()把记录指针移向下一个空行,再重复上面的加入数据的方法。
以上就是全部的向数据表中加入数据的方法,下面我们介绍如何从数据表中读出数据。这部分也是相当简单且容易理解的。
CDaoRecordset::GetFieldValue()函数有两个参数,一个是我们想得到数据的列的名称,它与记录指针的当前位置相对应,我们可以通过调用下面的函数自由的移动它:
::Seek();
::MoveFirst();
::MoveNext();
::MovePrev();
::MoveLast();
第二个参数是一个COleVariant实例,COleVariant是一个基于COM的对象。我们的字段数据将被存储在这个对象中,但是把这个存储对象转换到我们可以识别的CString变量是我们所需要的,下面的代码就是来完成这个工作:
COleVariant olevar;
确认我们的CDaoRecordset实例已经被打开,我们调用
while(!recordset.IsEOF());
{
olevar.ChangeType(VT_BSTR, NULL);
recordset.GetFieldValue("Name",olevar);
CString strData = (LPCSTR)olevar.pbstrVal;
// Code for inserting data into a listbox, for example
recordset.MoveNext();
}
ChangeType()方法把COleVariant实例转换到BSTR(一种晦涩的字符串格式)。然后我们pbstrValue方法把格式转换为CString,我们可以在任何需要的地方使用它。这些可以重复使用知道到达数据表中记录的末尾。
相信以上的说明对你有所帮助。