mfc操作数据库
Ⅰ [转载]MFC 如何连接数据库(c++ 连接sql server )老
1.首先,你的机器上要保证有sql server,并能正确进入并创建数据库,表等。2.建议把那个SA的密码自己重新设定一下,设定方法:打开sql server 2005 SQL Server Management Studio,进去后在那个安全性--登录名--右键点击SA属性,设置密码,状态里面改成,授予 启用。3.将ADO代码库引入到工程中,需要在stdafx.h或TEST.h(这个MFC项目的头文件)中添加如下代码,注意不同的操作系统在安装时这个路径可能不一样,所以必须先在系统中找到msado15.dll文件的路径:加入代码:#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")?(通过以上代码就可以将ADO代码库引入到当前工程中)?4.在TEST工程中的TEST.h中加入如下代码:(蓝色为所加入的) class CSQL_TESTApp : public CWinApp{public:?_ConnectionPtr m_pAppConn;?//连接对象指针
CString m_AppConnString;?//连接字符串的声明
bool m_bConnected; //连接标志 public:
CSQL_TESTApp();// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSQL_TESTApp)public:virtual BOOL InitInstance();
。。。。};?5.在TEST工程的TEST.CPP文件中加入如下代码:(蓝色为所加入的)BOOL CSQL_TESTApp::InitInstance(){AfxEnableControlContainer();?HRESULT hRes;try{hRes=m_pAppConn.CreateInstance(_T("ADODB.Connection"));
m_pAppConn->Open(_bstr_t((LPCTSTR) m_AppConnString) , _T("") , _T("") , adModeUnknown);
if(SUCCEEDED(hRes)){m_bConnected = TRUE; //连接成功设置标志位}}catch(_com_error e){CString errormessage;
errormessage.FormatMessage(_T("连接数据库失败 %s"),e.ErrorMessage());
AfxMessageBox(errormessage); //显示错误信息
return FALSE;?}
Ⅱ MFC操作数据库有关的类
1、 MFC的ODBC类简介
MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。程序员不必了解ODBC API和SQL的具体细节,利用ODBC类即可完成对数据库的大部分操作。
MFC的ODBC类主要包括:
CDatabase类:主要功能是建立与数据源的连接。
CRecordset类:该类代表从数据源选择的一组记录(记录集),程序可以选择数据源中的某个表作为一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个表的列到一个记录集中.通过该类可对记录集中的记录进行滚动、修改、增加和删除等操作。
CRecordView类:提供了一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的控件之间传输数据。该类支持对记录的浏览和更新,在撤销时会自动关闭与之相联系的记录集。
CFieldExchange类:支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换。该类的功能与CDataExchange类的对话框数据交换功能类似。
CDBException类:代表ODBC类产生的异常。
概括地讲,CDatabase针对某个数据库,它负责连接数据源;CRecordset针对数据源中的记录集,它负责对记录的操作;CRecordView负责界面,而CFieldExchange负责CRecordset与数据源的数据交换。
利用AppWizard和ClassWizard,用户可以方便地建立数据库应用程序,但这并不意味着可以对MFC的ODBC类一无所知.读者应注意阅读后面几小节中的内容,为学习后面的例子打好基础.
2、 CDatabase类
要建立与数据源的连接,首先应构造一个CDatabase对象,然后再调用CDatabase的Open成员函数.Open函数负责建立连接,其声明为
virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = “ODBC;”, BOOL bUseCursorLib = TRUE ); throw( CDBException, CMemoryException );
参数lpszDSN指定了数据源名(构造数据源的方法将在后面介绍),在lpszConnect参数中也可包括数据源名,此时lpszDSN必需为 NULL,若在函数中未提供数据源名且使lpszDSN为NULL,则会显示一个数据源对话框,用户可以在该对话框中选择一个数据源.参数 bExclusive说明是否独占数据源,由于目前版本的类库还不支持独占方式,故该参数的值应该是FALSE,这说明数据源是被共享的.参数 bReadOnly若为TRUE则对数据源的连接是只读的.参数lpszConnect指定了一个连接字符串,连接字符串中可以包括数据源名、用户帐号 (ID)和口令等信息,字符串中的"ODBC"表示要连接到一个ODBC数据源上.参数bUseCursorLib若为TRUE,则会装载光标库,否则不 装载,快照需要光标库,动态集不需要光标库. 若连接成功,函数返回TRUE,若返回FALSE,则说明用户在数据源对话框中按了Cancel按钮。若函数内部出现错误,则框架会产生一个异常。
下面是一些调用Open函数的例子。
CDatabase m_db; //在文档类中嵌入一个CDatabase对象
//连接到一个名为"Student Registration"的数据源
m_db.Open("Student Registration");
//在连接数据源的同时指定了用户帐号和口令
m_db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Student Registration;UID=ZYF;PWD=1234");
m_db.Open(NULL); //将弹出一个数据源对话框
要从一个数据源中脱离,可调用函数Close。在脱离后,可以再次调用Open函数来建立一个新的连接.调用IsOpen可判断当前是否有一个连接,调用GetConnect可返回当前的连接字符串。函数的声明为
virtual void Close( );
BOOL IsOpen( ) const; //返回TRUE则表明当前有一个连接
const CString& GetConnect( ) const;
CDatabase的析构函数会调用Close,所以只要删除了CDatabase对象就可以与数据源脱离。
3、CRecordset类
CRecordset类代表一个记录集.该类是MFC的ODBC类中最重要、功能最强大的类。
10.5.1 动态集、快照、光标和光标库
在多任务操作系统或网络环境中,多个用户可以共享同一个数据源。共享数据的一个主要问题是如何协调各个用户对数据源的修改。例如,当某一个应用改变了数 据源中的记录时,别的连接至该数据源的应用应该如何处理。对于这个问题,基于MFC的ODBC应用程序可以采取几种不同的处理办法,这将由程序采用哪种记 录集决定。
记录集主要分为快照(Snapshot) 和动态集(Dynaset)两种,CRecordset类对这两者都支持。这两种记录集的不同表现在它们对别的应用改变数据源记录采取了不同的处理方法。
快照型记录集提供了对数据的静态视.快照是个很形象的术语,就好象对数据源的某些记录照了一张照片一样.当别的用户改变了记录时(包括修改、添加和删 除),快照中的记录不受影响,也就是说,快照不反映别的用户对数据源记录的改变.直到调用了CRecordset::Requery重新查询后,快照才会 反映变化.对于象产生报告或执行计算这样的不希望中途变动的工作,快照是很有用的。需要指出的是,快照的这种静态特性是相对于别的用户而言的,它会正确反 映由本身用户对记录的修改和删除,但对于新添加的记录直到调用Requery后才能反映到快照中.
动态集提供了数据的动态视.当别的用户修改或删除了记录集中的记录时,会在动态集中反映出来:当滚动到修改过的记录时对其所作的修改会立即反映到动态集 中,当记录被删除时,MFC代码会跳过记录集中的删除部分.对于其它用户添加的记录,直到调用Requery时,才会在动态集中反映出来。本身应用程序对 记录的修改、添加和删除会反映在动态集中。当数据必须是动态的时侯,使用动态集是最适合的。例如,在一个火车票联网售票系统中,显然应该用动态集随时反映 出共享数据的变化。
在记录集中滚动,需要有一个标志来指明滚动后的位置(当前位置)。ODBC驱动程序会维护一个光标,用来跟踪记录集的当前记录,可以把光标理解成跟踪记录集位置的一种机制。
光标库(Cursor Library)是处于ODBC驱动程序管理器和驱动程序之间的动态链接库(ODBCCR32.DLL).光标库的主要功能是支持快照以及为底层驱动程序 提供双向滚动能力,高层次的驱动程序不需要光标库,因为它们是可滚动的.光标库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除,但不反映其 它用户对记录的改变,由此可见,快照实际上相当于当前的光标库缓冲区.
应注 意的是,快照是一种静态光标(Static Cursor).静态光标直到滚动到某个记录才能取得该记录的数据.因此,要保证所有的记录都被快照,可以先滚动到记录集的末尾,然后再滚动到感兴趣的第 一个记录上.这样做的缺点是滚动到末尾需要额外的开销,会降低性能.
与快照不同,动态集不用光标库维持的缓冲区来存放记录.实际上,动态集是不使用光标库的,因为光标库会屏蔽掉一些支持动态集的底层驱动程序功能.动态集是一种键集驱动光标(Keyset-Driven Cursor),当打开一个动态集时,驱动程序保存记录集中每个记录的键.只要光标在动态集中滚动,驱动程序就会通过键来从数据源中检取当前记录,从而保证选取的记录与数据源同步.
从上面的分析中可以看出,快照和动态集有一个共同的特点,那就是在建立记录集后,记录集中的成员就已经确定了.这就是为什么两种记录集都不能反映别的用户添加记录的原因.
10.5.2 域数据成员与数据交换
CRecordset类代表一个记录集.用户一般需要用ClassWizard创建一个CRecordset的派生类.ClassWizard可以为派 生的记录集类创建一批数据成员,这些数据成员与记录的各字段相对应,被称为字段数据成员或域数据成员.例如,对于表10.2所示的将在后面例子中使用的数 据库表,ClassWizard会在派生类中加入6个域数据成员
10.5.3 SQL查询
记录集的建立实际上主要是一个查询过程,SQL的SELECT语句用来查询数据源.在建立记录集时,CRecordset会根据一些参数构造一个 SELECT语句来查询数据源,并用查询的结果创建记录集.明白这一点对理解CRecordset至关重要.SELECT语句的句法如下:
SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
[ORDER BY m_strSort]
其中table-name是表名,rfx-field-list是选择的列(字段).WHERE和ORDER BY是两个子句,分别用来过滤和排序。下面是SELECT语句的一些例子:
SELECT CourseID, InstructorID FROM Section
SELECT * FROM Section WHERE CourseID=‘MATH202’ AND Capacity=15
SELECT InstructorID FROM Section ORDER BY CourseID ASC
其中第一个语句从Section表中选择CourseID和InstructorID字段.第二个语句从Section表中选择CourseID为 MATH202且Capacity等于15的记录,在该语句中使用了象"AND"或"OR"这样的逻辑连接符.要注意在SQL语句中引用字符串、日期或时 间等类型的数据时要用单引号括起来,而数值型数据则不用.第三个语句从Section表中选择InstructorID列并且按CourseID的升序排 列,若要降序排列,可使用关键字DESC.
提示:如果列名或表名中包含有空格,则必需用方括号把该名称包起来。例如,如果有一列名为“Client Name”,则应该写成“[Client Name]”。
10.5.4 记录集的建立和关闭
要建立记录集,首先要构造一个CRecordset派生类对象,然后调用Open成员函数查询数据源中的记录并建立记录集.在Open函数中,可能会调用GetDefaultConnect和GetDefaultSQL函数.函数的声明为
CRecordset( CDatabase* pDatabase = NULL);
参数pDatabase指向一个CDatabase对象,用来获取数据源.如果pDatabase为NULL,则会在Open函数中自动构建一个 CDatabase对象.如果CDatabase对象还未与数据源连接,那么在Open函数中会建立连接,连接字符串(参见10.3.1)由成员函数 GetDefaultConnect提供.
virtual CString GetDefaultConnect( );
该函数返回缺省的连接字符串.Open函数在必要的时侯会调用该函数获取连接字符串以建立与数据源的连接.一般需要在CRecordset派生类中覆盖该函数并在新版的函数中提供连接字符串.
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );
该函数使用指定的SQL语句查询数据源中的记录并按指定的类型和选项建立记录集.参数nOpenType说明了记录集的类型,如表10.3所示,如果要求 的类型驱动程序不支持,则函数将产生一个异常.参数lpszSQL是一个SQL的SELECT语句,或是一个表名.函数用lpszSQL来进行查询,如果 该参数为NULL,则函数会调用GetDefaultSQL获取缺省的SQL语句.参数dwOptions可以是一些选项的组合,常用的选项在表10.4 中列出.若创建成功则函数返回TRUE,若函数调用了CDatabase::Open且返回FALSE,则函数返回FALSE.
表10.3 记录集的类型
类型
含义
AFX_DB_USE_DEFAULT_TYPE
使用缺省值.
CRecordset::dynaset
可双向滚动的动态集.
CRecordset::snapshot
可双向滚动的快照.
CRecordset::dynamic
提供比动态集更好的动态特性,大部分ODBC驱动程序不支持这种记录集.
CRecordset::forwardOnly
只能前向滚动的只读记录集.表10.4 创建记录集时的常用选项
选项
含义
CRecordset::none
无选项(缺省).
CRecordset::appendOnly
不允许修改和删除记录,但可以添加记录.
CRecordset::readOnly
记录集是只读的.
CRecordset::skipDeletedRecords
有些数据库(如FoxPro)在删除记录时并不真删除,而是做个删除标记,在滚动时将跳过这些被删除的记录.virtual CString GetDefaultSQL( );
Open函数在必要时会调用该函数返回缺省的SQL语句或表名以查询数据源中的记录.一般需要在CRecordset派生类中覆盖该函数并在新版的函数中提供SQL语句或表名.下面是一些返回字符串的例子.
“Section” //选择Section表中的所有记录到记录集中
“Section, Course” //合并Section表和Course表的各列到记录集中
//对Section表中的所有记录按CourseID的升序进行排序,然后建立记录集
“SELECT * FROM Section ORDER BY CourseID ASC”
上面的例子说明,通过合理地安排SQL语句和表名,Open函数可以十分灵活地查询数据源中的记录.用户可以合并多个表的字段,也可以只选择记录中的某些字段,还可以对记录进行过滤和排序.
上一小节说过,在建立记录集时,CRecordset会构造一个SELECT语句来查询数据源.如果在调用Open时只提供了表名,那么SELECT语 句还缺少选择列参数rfx-field-list(参见10.5.3).框架规定,如果只提供了表名,则选择列的信息从DoFieldExchange中 的RFX语句里提取.例如,如果在调用Open时只提供了"Section"表名,那么将会构造如下一个SELECT语句:
SELECT CourseID,SectionNo,InstructorID,RoomNo, Schele,Capacity FROM Section
建立记录集后,用户可以随时调用Requery成员函数来重新查询和建立记录集.Requery有两个重要用途:
使记录集能反映用户对数据源的改变(参见10.5.1).
按照新的过滤或排序方法查询记录并重新建立记录集.
在调用Requery之前,可调用CanRestart来判断记录集是否支持Requery操作.要记住Requery只能在成功调用Open后调用,所以程序应调用IsOpen来判断记录集是否已建立.函数的声明为
virtual BOOL Requery( );throw( CDBException, CMemoryException );
返回TRUE表明记录集建立成功,否则返回FALSE.若函数内部出错则产生异常.
BOOL CanRestart( ) const; //若支持Requery则返回TRUE
BOOL IsOpen( ) const; //若记录集已建立则返回TRUE
CRecordset类有两个公共数据成员m_strFilter和m_strSort用来设置对记录的过滤和排序.在调用Open或Requery 前,如果在这两个数据成员中指定了过滤或排序,那么Open和Requery将按这两个数据成员指定的过滤和排序来查询数据源.
成员m_strFilter用于指定过滤器.m_strFilter实际上包含了SQL的WHERE子句的内容,但它不含WHERE关键字.使用m_strFilter的一个例子为:
m_pSet->m_strFilter=“CourseID=‘MATH101’”; //只选择CourseID为MATH101的记录
if(m_pSet->Open(CRecordset::snapshot, “Section”))
. . . . . .
成员m_strSort用于指定排序.m_strSort实际上包含了ORDER BY子句的内容,但它不含ORDER BY关键字.m_strSort的一个例子为
m_pSet->m_strSort=“CourseID DESC”; //按CourseID的降序排列记录
m_pSet->Open();
. . . . . .
事实上,Open函数在构造SELECT语句时,会把m_strFilter和m_strSort的内容放入SELECT语句的WHERE和ORDER BY子句中.如果在Open的lpszSQL参数中已包括了WHERE和ORDER BY子句,那么m_strFilter和m_strSort必需为空.
调用无参数成员函数Close可以关闭记录集.在调用了Close函数后,程序可以再次调用Open建立新的记录集.CRecordset的析构函数会调用Close函数,所以当删除CRecordset对象时记录集也随之关闭。
10.5.5 滚动记录
CRecordset提供了几个成员函数用来在记录集中滚动,如下所示.当用这些函数滚动到一个新记录时,框架会自动地把新记录的内容拷贝到域数据成员中.
void MoveNext( ); //前进一个记录
void MovePrev( ); //后退一个记录
void MoveFirst( ); //滚动到记录集中的第一个记录
void MoveLast( ); //滚动到记录集中的最后一个记录
void SetAbsolutePosition( long nRows );
该函数用于滚动到由参数nRows指定的绝对位置处.若nRows为负数,则从后往前滚动.例如,当nRows为-1时,函数就滚动到记录集的末尾.注意,该函数不会跳过被删除的记录.
virtual void Move( long nRows, WORD wFetchType = SQL_FETCH_RELATIVE );
该函数功能强大.通过将wFetchType参数指定为SQL_FETCH_NEXT、SQL_FETCH_PRIOR、 SQL_FETCH_FIRST、SQL_FETCH_LAST和SQL_FETCH_ABSOLUTE,可以完成上面五个函数的功能.若 wFetchType为SQL_FETCH_RELATIVE,那么将相对当前记录移动,若nRows为正数,则向前移动,若nRows为负数,则向后移 动.
如果在建立记录集时选择了CRecordset::skipDeletedRecords选项,那么除了SetAbsolutePosition外,在滚动记录时将跳过被删除的记录,这一点对象FoxPro这样的数据库十分重要.
如果记录集是空的,那么调用上述函数将产生异常.另外,必须保证滚动没有超出记录集的边界.调用IsEOF和IsBOF可以进行这方面的检测.
BOOL IsEOF( ) const;
如果记录集为空或滚动过了最后一个记录,那么函数返回TRUE,否则返回FALSE.
BOOL IsBOF( ) const;
如果记录集为空或滚动过了第一个记录,那么函数返回TRUE,否则返回FALSE.
Ⅲ MFC基于对话框的工程怎么使用数据库保存数据
CString Filepath="Data.accdb";
int i=m_list.GetItemCount();//在列表的队尾添加,所以先获取行数
db.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.AddNew();//在记录集的队尾添加
Dbset.SetFieldValue("Name",_variant_t(m_name));
Dbset.SetFieldValue("Age",atol(m_age));//将CString格式转换为数据库规定的格式
Dbset.SetFieldValue("Extra",_variant_t(m_extra));
Dbset.Update();//一定要及时更新
Dbset.Close();
db.Close();//并关闭////////////////////////////
看这段代码,是把三个edit控件里的值写入Data.accdb数据库文件中。
Ⅳ MFC中怎么连接SQL数据库
1. 由于使用的是ADO架构 首先需要在StdAfx.h文件中导入msado15.dll 和 oledb32.dll连个动态连接库文件倒入方式为:
#import "msado15.dll" no_namespace rename ("EOF", "adoEOF")
#import "oledb32.dll" no_namespace
两个文件的实际所在位置由于系统安装的位置不同而不同。
no_namespace 使用无名命名空间 程序段比较短关联较少的话可以这样使用 否则请使用命名空间以免发生冲突,
rename ("EOF", "adoEOF") 重命名 EOF为 adoEOF 以免常量冲突。
2. 关于SQL Server以及的一些要求 首先安装SQL Server的机器必须是 NT架构以上的系统 如果使用的是Windows XP SP2 的话需要对SQL Server打上SP4补丁方可网络访问。
3. 最好建立一个单独的数据库操作类 使程序中需要对数据库进行操作的地方继承这个类。
4. 类成员如下
_ConnectionPtr m_pConnection; // 数据库
_RecordsetPtr m_pRecordset; // 命令
_CommandPtr m_pCommand; // 记录
5. 方法如下
bool connect2database();
bool check_user(_bstr_t name, _bstr_t pwd);
bool CBugListCommon::connect2database()
{
_bstr_t ConnectionString = "Provider=sqloledb;Data Source='SQLSERVER';Integrated Security='SSPI';Initial Catalog='Test';User Id='sa';Password='sa';";
//Data Source 数据库实例名
//Initial Catalog表名
//User Id 用户名
//Password 密码
if(FAILED(CoInitialize(NULL)))
return FALSE;
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->Open(ConnectionString , "", "", adConnectUnspecified);
return TRUE;
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败");
return FALSE;
}
return FALSE;
}
bool CBugListCommon::check_user(_bstr_t name, _bstr_t pwd)
{
_bstr_t cmdtxt = "SELECT User_Name, User_PassWord FROM User_Table WHERE (User_Name = N'";
cmdtxt = cmdtxt + name + "')";
// cmdtxt == SELECT User_Name, User_PassWord FROM User_Table WHERE (User_Name = N'name')
m_pCommand.CreateInstance("ADODB.Command");
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText = cmdtxt;
m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdText);
if(!m_pRecordset->adoEOF)
{
_bstr_t tn;
tn = m_pRecordset->GetCollect("User_PassWord");
if(tn == pwd)
return TRUE;
else
return FALSE;
}
return FALSE;
}
Ⅳ MFC中如何连接access数据库
比如在你的工程目录中建一个 dbfvir.mdb //Access数据库,然后你需要做以下操作:
1.在StadAfx.h里面添加#include <afxdb.h> //新加入头文件,用于CDatabase类。
2.在StadAfx.h最后的#endif上添加#import "msado15.dll" no_namespace rename("EOF","rsEOF")
这时,你要把msado15.dll拷到与dbf同级的目录,也就是工程目录里,当然你可以该路径
3.在你自己的工程里,比如MyProc是你建的工程,添加代码
CMyPorcApp::CMyProcApp(){
CoInitialize(NULL);
SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",
"DSN=MyImage;DBQ=dbf\vir.mdb;DEFAULTDIR=dbf"); //注册本地数据库数据源
m_db.OpenEx("DSN=MyImage;;",CDatabase::noOdbcDialog);//MyImage是数据源名称
}
4.在前面的函数体之前创建全局变量CDatabase m_db; CRecordset m_rec(&m_db);
5.使用数据库{
CString strSQL="select * from virdb";
BSTR bstrSQL=strSQL.AllocSysString();
m_rec.Open(CRecordset::dynaset,strSQL);
while(!m_rec.IsEOF())
{
// 使用数据库的代码,读出来的数据都是字符串型的
CString MyVirable;
m_rec.GetFieldValue("字段名",MyVirable); //将某个字段的当前行的值读到MyVirabl中
// ......
m_rec.MoveNext(); //将记录移到下一行
}
}
本程序是自动注册数据源的,当然可以手动注册数据源,关于如何注册数据源并不麻烦,叙述起来不太方面,你就参考其他的吧。不过建议不用手动注册数据源,这样你地程序移植性不好.
Ⅵ MFC中,如何连接sqlite3的数据库,并对此数据库操作
这个比较容易。按照网上提供的方法把sqlite编译成dll和lib
将dll和lib在项目的输入中添加好
在要操作的文件中#include “sqlite3.h”就可以了。我做过这方面的项目,虽然是嵌入式wince使用,但是基本和windows相同。
下面是详细的用法:
一. 编译动态链接库库文件
1). 打开VC新建一个“Win32 Dynamic-Link Library”工程,命名为:sqlite3(也可以是其他的,注意这个就是编译后的dll和lib的名字)
2). 在接下来的对话框中选择"An empty DLL project",点 FINISH->OK
3). 将源码中所有的 *.c *.h *.def 复制到工程文件夹下
4). 在工程的Source File中添加你下载到的SQLite源文件中所有*.c文件,
注意这里不要添加shell.c和tclsqlite.c这两个文件。*注意需要将tclsqlite.c和shell.c、icu.c去掉。其中tclsqlite.c用于生成基于tcl的api,如果要编译,这需要另外下载tcl.h;shell.c用于生成命令行模式的sqlite.exe,如果是静态库形式则可以选择; icu是internationalcomponents forunicode,如果需要则需另外下载相关头文件。
5). 将 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
6). 在Header File中添加你下载到的SQLite源文件中所有*.h文件,
7). 开始编译,Build(F7)一下
也许到这里会遇到一个错误:
e:\zieckey\sqlite\sqlite3\sqlite3ext.h(22) : fatal error C1083: Cannot open include file: 'sqlite3.h': No such file or directory
经检查发现,源码中包含sqlite3.h都是以 #include <sqlite3.h> 方式包含的,
这就是说编译器在系统默认路径中搜索,这样当然搜索不到 sqlite3.h 这个头文件啦,
这时可以改为 #include "sqlite3.h" ,让编译器在工程路径中搜索,
但是如果还有其他地方也是以 #include <sqlite3.h> 方式包含的,那么改源码就显得有点麻烦,
好了,我们可以这样,在菜单栏依次选择:Tools->Options...->Directeries
在下面的Directeries选项中输入你的 sqlite3.h 的路径,这里也就是你的工程目录.
添加好后,我们在编译一下就好了,
最后我们在工程目录的 Debug 目录生成了下面两个重要文件:
动态链接库文件 sqlite3.dll 和引入库文件 sqlite3.lib
二. 使用动态链接库
下面我们来编写个程序来测试下我们的动态链接库.
在VC下新建一个空的"Win32 Console Application" Win32控制台程序,工程命名为:TestSqliteOnWindows
再新建一个 test.cpp 的C++语言源程序,源代码如下:
// name: test.cpp
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !
// Author : zieckey
// data : 2006/11/28
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
char *sql = " CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
//插入数据
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
int nrow = 0, ncolumn = 0;
char **azResult; //二维数组存放结果
//查询数据
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( "row:%d column=%d \n" , nrow , ncolumn );
printf( "\nThe result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
//删除数据
sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );
printf( "\nAfter deleting , the result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
//释放掉 azResult 的内存空间
sqlite3_free_table( azResult );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sqlite3_close(db); //关闭数据库
return 0;
}
另外,将sqlite3.h sqlite3.lib sqlite3.dll文件复制到我们的工程目录.
最后 Project->Settings 在Link选项卡找到Object/library moles : 在最后填入sqlite3.lib 。
如果原来就有链接,请使用空格分隔。
现在可以编译了.
运行结果如下:
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
zErrMsg = (null)
row:3 column=5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 200605011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 23
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 34
azResult[17] = 45
azResult[18] = 200605011306
azResult[19] = 15.4
zErrMsg = (null)
row:2 column=5
After deleting , the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 2
azResult[6] = 23
azResult[7] = 45
azResult[8] = 200605011306
azResult[9] = 16.4
azResult[10] = 3
azResult[11] = 34
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 15.4
zErrMsg = (null)
Press any key to continue
在上面的第五步
5). 将 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
是必须的, sqlite3.def 这个文件的加入会生成 *.lib引入库文件,这个对于*.dll文件是很重要的.否则你光有*.dll文件在程序调用的时候就不是那么方便了,因为这样你只能通过动态加载dll的方式调用dll库中函数
这个程序,我们先创建一个数据库,然后新建一个表,然后插入一些数据,
再查询看看插入的数据是否正确,然后又删除一些数据,删除后我们再查询了一下,
发现我们的删除操作也是成功的.
这个程序简单的调用 sqlite 的函数接口来实现对数据库的管理,
包括创建数据库、创建表格、插入数据、查询数据、删除数据等。
Ⅶ 如何使用MFC进行数据库查询
问题很简单我给你看看一段代码你就知道了
try
{
CDatabase db;
db.Open(NULL,false,false,"ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};DBQ=手机进销存管理数据库.mdb");
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly,"select * from Input;",CRecordset::readOnly);
CString s;
rs.GetFieldValue("厂商",s);
MessageBox(s);
}
catch (CDBException e)
{
MessageBox(e.m_strError);
Ⅷ MFC怎么与数据库连接,求详细步骤!!!!!急急急!!!!!!
比如在你的工程目录中建一个
dbf\vir.mdb
//access数据库,然后你需要做以下操作:
1.在stadafx.h里面添加#include
//新加入头文件,用于cdatabase类。
2.在stadafx.h最后的#endif上添加#import
"msado15.dll"
no_namespace
rename("eof","rseof")
这时,你要把msado15.dll拷到与dbf同级的目录,也就是工程目录里,当然你可以该路径
3.在你自己的工程里,比如myproc是你建的工程,添加代码
cmyporcapp::cmyprocapp(){
coinitialize(null);
sqlconfigdatasource(null,odbc_add_dsn,
"microsoft
access
driver
(*.mdb)",\
"dsn=myimage;dbq=dbf\\vir.mdb;defaultdir=dbf");
//注册本地数据库数据源
m_db.openex("dsn=myimage;;",cdatabase::noodbcdialog);//myimage是数据源名称
}
4.在前面的函数体之前创建全局变量cdatabase
m_db;
crecordset
m_rec(&m_db);
5.使用数据库{
cstring
strsql="select
*
from
virdb";
bstr
bstrsql=strsql.allocsysstring();
m_rec.open(crecordset::dynaset,strsql);
while(!m_rec.iseof())
{
//
使用数据库的代码,读出来的数据都是字符串型的
cstring
myvirable;
m_rec.getfieldvalue("字段名",myvirable);
//将某个字段的当前行的值读到myvirabl中
//
......
m_rec.movenext();
//将记录移到下一行
}
}
本程序是自动注册数据源的,当然可以手动注册数据源,关于如何注册数据源并不麻烦,叙述起来不太方面,你就参考其他的吧。不过建议不用手动注册数据源,这样你地程序移植性不好.
Ⅸ MFC如何用数据库
你首先安装Mysql,然后使用下面代码
在MyProc类中增加MySqlConnect方法,strUSR,strPWD分别为用户名和密码,登陆数据库需要
BOOL MyPorc::MySqlConnect(CString strUSR,CString strPWD)
{
unsigned short Port = 3306; //端口
CString IPAddress ="127.0.0.1"; //本地数据库
CString UserName = strUSR;
CString Password = strPWD;
ssock=(MYSQL *)malloc(sizeof(MYSQL));
mysql_init(ssock);
if(ssock == NULL)
{
AfxMessageBox("连接失败,请稍后在试! ");
return FALSE;
}
ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
if(!ssock)
{
unsigned int mtint = mysql_errno(ssock);
AfxMessageBox("登陆失败! ");
return FALSE;
}
return TRUE;
}
Ⅹ 如何进行MFC数据库编程
MFC数据库编程包含如下:
首先,你要选择使用什么方式连接数据库,有ODBC,ADO等,
其他,就是sql语句操作数据库了,对后是怎么存储操作数据。