MFC连接SQL数据库操作

本文介绍了在MFC中连接和操作SQL数据库的步骤,包括配置数据源、数据库连接、执行SQL语句以及异常处理。重点讲解了CDatabase、CRecordset、CFieldExchange和CDBException类在数据库操作中的作用,如记录集的增删改查、数据交换和异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要操作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函数关闭数据源连接。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值