转自:
Shane的BLOG
首先申明:本文仅面向初学者,非常初的那种,有任何关于为什么的问题,请勿询问本人,浩瀚如烟的MSDN就是你的去处。我们这里仅解决如何做的问题,目标是让大家能够让自己的程序立刻跑起来,能够做一些自己想要的简单操作。
流程:
传说中的瀑布模型,可以让你看上去更专业一点
(当然也仅仅是看上去,因为诸葛先生说:“过时了”)
准备工作
我们要引入ADO类型库:
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
注:”EndOfFile”可以更换为其他字符串,在后面的程序看到”EndOfFile”更换为你自己定义的字符串即可。
为了使用Execute方法,请包含icrsint.h
#include "icrsint.h"
开始编程工作:
初始化COM库
CoInitialize(NULL);
AfxOleInit();
注:CoInitialize(NULL);用于非MFC环境下初始化COM库
有说法2个都必须有,但我在实践中仅用CoInitialize(NULL)未发生问题,共同使用也未发生问题。暂时将2者都应用了。
HRESULT hr; //用于表示错误代码
if FAILED(CoInitialize(NULL))
{
CoUninitialize();
AfxOleInit();
hr = E_UNEXPECTED;
}
建立数据库连接
用Connection对象连接数据库:
添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
HRESULT hr; //用于表示错误代码
hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象实例
住:无论是Connection对象还是Recordset对象都必须使用CreateInstance方法创建对象实例,否则其后续操作无法完成。
连接数据库:
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Test.mdb","","", adModeUnknown); //Access2000
m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb”,"","", adModeUnknown);//Access2007
m_pConnection->Open("Provider=SQLOLEDB.1;Server=iim-xia; Database=TestDB; uid=sa; pwd=这是密码不告诉你; ","","",adModeUnknown);//SQLSever
注:其中Server是数据库服务器名,Database是数据库名,uid是用于登录该数据库的用户名,pwd是该用户的密码,错误代码error
下面是一段用于连接数据库的程序:用try和catch块来捕捉错误以防止程序崩溃。
CoInitialize(NULL);
AfxOleInit();//
_ConnectionPtr m_pConnection;//建立Connection对象的指针;
HRESULT hr; //用于表示错误代码
try
{
}
catch(_com_error e)///捕捉异常
{
}
以上是建立数据链接的过程,针对不同的数据库,替换红字标注的部分。
获取数据
首先建立数据集,我们的一切操作以数据集(Recordset)为基础:
我们需要一个指向Recordset的指针:
_RecordsetPtr m_pRecordset;
同Connection对象一样,必须实例化:
m_pRecordset.CreateInstance("ADODB.Recordset");
使用Open方法来使用SQL语言对数据库操作:
m_pRecordset->Open("SELECT ID,X,Y,SpeedGroup,TenNum FROM TestList " ,
这是一条select语句:从表TestList中选择列名为“ID”、“X”、“Y”、“SpeedGrooup”、“TenNum”放入m_pRecordset(数据集对象指针)。
这时我们的数据集里就有ID、X、Y、SpeedGroup、TenNum这些值。他们的排列顺序来自于你的Select语句,而非数据库里的表里的列的位置。你也可以用通配符“*”(SELECT * FROM TestList)来选择表TestList中所有的列。
为了您的程序安全,避免程序崩溃,请“踹”(try) it。如下:
HRESULT hr; //用于表示错误代码
try
{
}
catch(_com_error e)///捕捉异常
{
}
下面是如何将数据集中的数据取出(这里只是一般性的数据:int、long、char之类):
先来个CString C_DataS,还需要一个_variant_t
CString C_DataS; _variant_t
try
{
}
catch(_com_error e)///捕捉异常
{
}
注:CString的类型转换去网上查询。
try
{
}
catch(_com_error e)///捕捉异常
{
}
上面的一“踹”是用来添加一行数据的。注释掉的那一行是用于删除操作。
m_pRecordset->Update();执行后,才真正的修改了数据库。
注:以上的一“踹”不能在使用Execute方法建立的数据集里“踹”。(我不知道是不是我自己的问题)
更简单的方法,使用Connection->Execute方法来建立数据集,方法如下:
m_pRecordset = m_pConnection->Execute("SELECT * FROM TentacleCoordinate", &RecordsAffected , adCmdText);
别忘了定义:
_variant_t RecordsAffected;
其它的对数据库的操作:
这些都是基于SQL语言的,Execute方法。
创建表:
m_pConnection->Execute("CREATE TABLE TestList(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);
插入值:
m_pConnection->Execute("INSERT INTO TestList(ID,username,old,birthday) VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);
别忘了关上它:
饭前便后要洗手,洗手别忘关龙头:
if(m_pRecordset->State)
{
}
if(m_pConnection->State)
{
}
全文放在魔方上了:word版提取文件连接
自从上一篇开始好久没有继续把剩下的继续写出来了,我是懒人吗,因该可以理解的(这里无耻一把先)
try
{
}
catch(_com_error e)///捕捉异常
{
}
这一“踹”用于修改某一行的值。Move是移动recordset指针到从首行以后的第400行。
注:第一行为0。所以这句话是移动到了第401行处。
PutCollect就是修改列名为“Y”的当前行的值。
下面便开始建立一个最简单地数据库应用程序,简单到连界面都没有的(Win32控制台程序)。
建立一个工程,如图
文件->新建->项目
选择Visual C++项目->Win32->Win32控制台项目
在此页面选择应用程序设置活页->钩上MFC,选择完成。
钩上MFC可以让我们使用一些MFC特性的东西。在解决方案资源管理器中可以看到:
源文件:stdafx.cpp、TESTDB.cpp
头文件:stdafx.h、Resource.h、TESTDB.h
我们在stdafx.h中添加:
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
请放在#include <afx.h>之后。
在添加用于使用Execute方法的头文件#include "icrsint.h"
然后便可在TESTDB.cpp添加自己的数据库处理代码:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
}
以上为自动生成代码。
我们在else大括号中添加代码:
// TESTDB.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "TESTDB.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
}
以上程序经调试通过。
常用数据的转换:
从数据库中读取数据需要对数据类型进行转换:
使用_variant_t得变量来从数据库中获取所需数据,定义如下:
_variant_t DATA;
然后使用 DATA.lavl的方法来将DATA中所存放的数据转换为我们所需的数据(lavl 转换为长整型 long)
DATA. dblVal,转换为双精度类型double。
DATA. fltVal,转换为浮点型 float。(注我在SQL Server2005中使用浮点数,但是必须用双精度才能正确读出,若是读为浮点数则数值不正确)。