要操作SQL数据库要经过以下几个步骤:
0.建立数据库
1.配置数据源
2.数据库的连接
3.数据库的操作
4.类资料
【1】配置数据源
配置数据源一般有两种方法一种是通过注册表,一种是通过SQLConfigDataSource函数,具体操作如下:
第一种:SQLConfigDataSource函数创建数据源,包含 "ODBCINST.h"头文件
SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server","DSN=SQLODBC\0");//创建数据源
第二种:注册表创建数据源,包含"afxdb.h"
CRegKey m_hKey;//注册一个操作注册表的类
m_hKey.Create(HKEY_CURRENT_USER,"Software\\ODBC\\ODBC.INI\\ODBC Data Sources");
//创建ODBC Data Sources项,此项列出的是数据源
m_hKey.SetValue("SQL Server","SQLODBC");
//设置数据源名称和数据源驱动
m_hKey.Create(HKEY_CURRENT_USER,"Software\\ODBC\\ODBC.INI\\SQLODBC");
\\创建 数据源项
\\设置数据源的详细参数
m_hKey.Open(HKEY_CURRENT_USER,"Software\\ODBC\\ODBC.INI\\SQLODBC");
m_hKey.SetValue("SQLTest","Database");
m_hKey.SetValue("C:\\Windows\\system32\\SQLSRV32.dll","Driver");
m_hKey.SetValue("Administrator","LastUser") ;
m_hKey.SetValue("(local)","Server") ;
m_hKey.SetValue("Yes","Trusted_Connection");
【2】数据库的连接
到了MFC的阶段了,首先建立一个MFC工程,放置两个按钮,对两个按钮实现消息响应,一个名称为“连接数据库”,一个为“查询数据库信息”。
因为要使用到CDatabase类所以需要在stdafx.h中包含afxdb.h头文件。
“连接数据库”按钮的消息响应函数代码如下
连接数据源
连接数据库按钮代码//
CDatabase m_db;//嵌入一个CDatabase对象
CRecordset *m_dbrs;
m_dbrs = CRecordset(&m_db);//创建一个记录集
// 连接数据源 Open的参数可以控制记录集的游标,详情看MSDN
m_db.Open("ODBC;DSN=SQLODBC;UID=SQLTest;PWD=12345678",false,false,"ODBC;",false);
m_dbrs = new CRecordset(&m_db); // 创建存放数据的记录集
【3】数据库的操作
执行SQL数据库语句:通过CDatabase执行SQL语句,不返回记录集
CString strSQL = "create table tabname(i int) "; // 组织SQL语句
m_db.ExecuteSQL(strSQL);//执行SQL语句
修改
CString strSQL = "UPDATE test SET name = '王二', password='2222' WHERE name=100"; // 组织SQL语句
m_db.ExecuteSQL(strSQL);
插入
short index = 0;
while (index <= 100)
{
CString str="";
str.Format("%d",index);
CString strSQL = "insert into test(name,password) values("+str+",3333) "; // 组织SQL语句
m_db.ExecuteSQL(strSQL);
index++;
}
删除
CString strSQL = "SELECT name FROM test "; // 组织SQL语句
m_dbrs->Open(CRecordset::dynaset, strSQL); // 用SQL查询数据库
if(!m_dbrs->IsEOF())
{
m_dbrs->Delete();
}
m_dbrs->Close();
查询
try
{
CString strSQL = "SELECT name,password FROM test "; // 组织SQL语句
m_dbrs->Open(CRecordset::forwardOnly, strSQL, CRecordset::readOnly); // 用SQL查询数据库
CString *psd;
short nFields = m_dbrs->GetODBCFieldCount();//返回字段数
//通过IsEOF函数判断记录集是否为空
//(记录集如果定位在最后的话,会返回0,详情请看CRecordset的MSDN说明)
CDBVariant varValue;//利用CDBVariant类取得数据
while(!m_dbrs->IsEOF())
{//不断循环,直到
for(short index = 0; index < nFields; index++)
{
//将字段中的值取出 详情请看CDBVariant类成员变量介绍
m_dbrs->GetFieldValue(index,varValue);
psd = varValue.m_pstring;
if (index == 0)
{
m_list.InsertItem(index,*psd);//插入行数据
}
else
{
m_list.SetItemText(0,index,*psd);//插入行数据
}
}
m_dbrs->MoveNext();
}
m_dbrs->Close();// 关闭记录集
//m_db.Close();//把关闭数据源放在关闭程序代码里
}
catch (CMemoryException* e)
{
}
catch (CFileException* e)
{
}
catch (CException* e)
{
}
【资料】
CDatabase类操作数据源
函数 | 说明 |
CDatabase | 构造一个对象 |
Close | 关闭数据源连接 |
Open | 通过一个ODBC驱动程序创建到数据源的连接 |
OpenEx | 通过一个ODBC驱动程序创建到数据源的连接 |
BeginTrans | 开始事务 |
BindParameters | 允许在调用CDatabase::ExecuteSQL前绑定参数 |
Cancel | 取消异步操作或第二条线程中的过程 |
CommitTrans | 执行事务 |
ExecuteSQL | 执行SQL语句,不返回记录 |
Rollback | 回滚事务,数据源返回先前的状态 |
该类的属性函数如下表:
属性 | 说明 |
CanTransact | 如果数据源支持事务,返回非零 |
CanUpdate | 如果CDatabase可以更新,返回非零 |
GetBookmarkPersistence | 获得书签对记录集对象的持久性 |
GetConnect | 返回ODBC连接串 |
GetCursorCommitBehavior | 获得提交事务对记录集对象的影响 |
GetCursorRollbackBehavior | 获得回滚事务对记录集对象的影响 |
GetDatabaseName | 返回当前使用的数据库名 |
IsOpen | 如果当前CDatabase对象连接到数据源,返回非零 |
SetLoginTimeout | 设置数据源连接的超时数(秒为单位) |
SetQueryTimeout | 设置查询操作的超时数(秒为单位) |
应用程序可使用多个CDatabase类型的对象。构造一个对象并调用Open()成员函数打开一个连接。接着构造CRecordset类型的对象以操作连接的数据源,构造时向记录集对象传递CDatabase类型的指针。完成使用后,用Close()成员函数销毁CDatabase类型的对象。
一般情况下并不需要直接使用CDatabase类型的对象,因为CRecordset类型的对象可以实现大多数的功能、但是在进行事务处理时,CDatabase就起到关键作用。事务(Transaction)指的是将一系列对数据源的更新放在一起,同时提交或一个都不提交,为的是确保多用户对数据源同时操作时的数据正确性。
CRecordset类操作记录集
一个CRecordset类型的对象代表从数据源选择的一组记录的集合——记录集,通过该类的方法实现对数据库中记录的各种操作。
该类常用的数据成员如下表:
成员 | 说明 |
m_hstmt | 包含记录集的ODBC陈述句柄,类型为HSTMT |
m_nFields | 包含记录集中字段数据成员的数量,类型为UNIT |
m_nParams | 包含记录集中参数数据成员的数量,类型为UNIT |
m_pDatabase | 包含一个CDatabase对象指针,通过它访问数据源 |
m_strFilter | 包含CString对象,定义SQL中WHERE子句 |
m_strSort | 包含CString对象,定义SQL中ORDER BY子句 |
该类的构造方法如下表:
构造方法 | 说明 |
Close | 关闭记录集和与之相关的HSTMT |
CRecordset | 构造一个CRecordset对象 |
Open | 通过获得表或执行记录集所代表的查询来打开记录集 |
CRecordset类记录集属性如下表:
属性 | 说明 |
CanAppend | 如果新记录可以通过Addnew添加到记录集,返回非零 |
CanBookmark | 如果记录集支持书签,返回非零 |
CanRestart | 如果Requery可以被调用来再次运行记录集查询,返回非零 |
CanScroll | 如果可以在记录中回滚,返回非零 |
CanTransact | 如果数据源支持事务,返回非零 |
CanUpdate | 如果记录集可以被更新,返回非零 |
GetODBCFieldCount | 返回记录集中字段的数量 |
GetRecordCount | 返回记录集中记录的数量 |
GetSQL | 获得SQL字符串 |
GetStatus | 获得记录集的状态 |
GetTableName | 获得记录集所属的表名 |
IsBOF | 如果记录集定位在第一条记录之前,返回非零 |
IsDeleted | 如果记录集定位在一条删除的记录,返回非零 |
IsEOF | 如果记录集定位在最后一条记录之后,返回非零 |
IsOpen | 如果调用过Open函数,返回非零 |
CRecordset类更行操作如下表:
更新操作 | 说明 |
AddNew | 准备增加一条新纪录,调用Update之后完成添加 |
CancelUpdate | 取消任何未完成的更新 |
Delete | 从记录集中删除当前记录 |
Edit | 准备对当前记录进行修改,调用Update后完成修改 |
Update | 通过将新记录或编辑的数据存入数据源来完成AddNew或Edit操作 |
记录集有两种形式:snapshot(表示数据的静态视图)和dynaset(表示记录集与其他用户对数据库的更新保持同步)。
CFieldExchange类处理数据交换
CFieldExchange类支持数据库类所使用的记录集字段交换(RFX)程式。如果使用自定义的数据类型写数据交换程式,会使用这个类。否则不会直接使用此类。RFX在记录集对象的字段数据成员与数据源中当前记录的相应字段之间交换数据。
CRecordView类显示记录
CRecordView对象用于在控件中显示数据库记录的视图。这种视图是一种直接连到一个CRecordView对象的格式视图,它从一个对话框模板创建资源,并将CRecordView对象的字段显示在对话框模版的控件里。对象利用DDX和RFX机制,使窗体上的空间和记录集的字段值之间数据移动自动化,也就是说,用户不需要编写一行代码就可以完成简单的数据库记录查看程序。
CDBException类处理异常
由CException类派生,以3个继承的成员变量反映对数据库操作时的异常:
m_nRetCode:以ODBC返回代码(SQL_RETURN)的形式表明造成异常的原因
m_strError:字符串,描述造成抛出异常的错误原因
m_strStateNativeOrigin:字符串,用以描述以ODBC错误代码表示的异常错误
使用MFC ODBC编程建立应用程序
MFC ODBC编程模型概述
使用MFC ODBC访问数据库比直接使用ODBC API简单得多,编程步骤如下:
使用CDatabase打开数据源的连接,如果利用AppWizard生成一个ODBC数据库应用程序,则会自动完成操作。
使用ClassWizard向导加入由CRecordset类派生的用户记录集类,完成对数据库的绑定。
创建记录集类对象,如果利用AppWizard生成一个ODBC数据库应用程序,则会自动在文档类中创建。
使用记录及对象对数据库进行遍历、增加、删除、修改等操作。
使用CDatabase类的ExecuteSQL函数直接执行SQL命令。
使用CDatabase类的BeginTrans、CommitTrans和Rollback函数进行事务处理
使用CDatabase类的Close函数关闭数据源连接。