首先申明:本文僅面向初學者,非常初的那種,有任何關(guān)于為什么的問題,請勿詢問本人,浩瀚如煙的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"
CoInitialize(NULL);
AfxOleInit();
注:CoInitialize(NULL);用于非MFC環(huán)境下初始化COM庫
有說法2個都必須有,但我在實踐中僅用CoInitialize(NULL)未發(fā)生問題,共同使用也未發(fā)生問題。暫時將2者都應用了。
HRESULT hr; //用于表示錯誤代碼
if FAILED(CoInitialize(NULL))
{
CoUninitialize();
AfxOleInit();
hr = E_UNEXPECTED;
}
用Connection對象連接數(shù)據(jù)庫:
添加一個指向Connection對象的指針:
_ConnectionPtr m_pConnection;
HRESULT hr; //用于表示錯誤代碼
hr = m_pConnection.CreateInstance("ADODB.Connection");//創(chuàng)建Connection對象實例
?。簾o論是Connection對象還是Recordset對象都必須使用CreateInstance方法創(chuàng)建對象實例,否則其后續(xù)操作無法完成。
連接數(shù)據(jù)庫:
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是數(shù)據(jù)庫服務(wù)器名,Database是數(shù)據(jù)庫名,uid是用于登錄該數(shù)據(jù)庫的用戶名,pwd是該用戶的密碼,錯誤代碼error
下面是一段用于連接數(shù)據(jù)庫的程序:用try和catch塊來捕捉錯誤以防止程序崩潰。
CoInitialize(NULL);
AfxOleInit();//
_ConnectionPtr m_pConnection;//建立Connection對象的指針;
HRESULT hr; //用于表示錯誤代碼
try
{
}
catch(_com_error e)///捕捉異常
{
}
以上是建立數(shù)據(jù)鏈接的過程,針對不同的數(shù)據(jù)庫,替換紅字標注的部分。
首先建立數(shù)據(jù)集,我們的一切操作以數(shù)據(jù)集(Recordset)為基礎(chǔ):
我們需要一個指向Recordset的指針:
_RecordsetPtr m_pRecordset;
同Connection對象一樣,必須實例化:
m_pRecordset.CreateInstance("ADODB.Recordset");
使用Open方法來使用SQL語言對數(shù)據(jù)庫操作:
m_pRecordset->Open("SELECT ID,X,Y,SpeedGroup,TenNum FROM TestList " ,
這是一條select語句:從表TestList中選擇列名為“ID”、“X”、“Y”、“SpeedGrooup”、“TenNum”放入m_pRecordset(數(shù)據(jù)集對象指針)。
這時我們的數(shù)據(jù)集里就有ID、X、Y、SpeedGroup、TenNum這些值。他們的排列順序來自于你的Select語句,而非數(shù)據(jù)庫里的表里的列的位置。你也可以用通配符“*”(SELECT * FROM TestList)來選擇表TestList中所有的列。
為了您的程序安全,避免程序崩潰,請“踹”(try) it。如下:
HRESULT hr; //用于表示錯誤代碼
try
{
}
catch(_com_error e)///捕捉異常
{
}
下面是如何將數(shù)據(jù)集中的數(shù)據(jù)取出(這里只是一般性的數(shù)據(jù):int、long、char之類):
先來個CString C_DataS,還需要一個_variant_t
CString C_DataS; _variant_t
try
{
}
catch(_com_error e)///捕捉異常
{
}
注:CString的類型轉(zhuǎn)換去網(wǎng)上查詢。
try
{
}
catch(_com_error e)///捕捉異常
{
}
上面的一“踹”是用來添加一行數(shù)據(jù)的。注釋掉的那一行是用于刪除操作。
m_pRecordset->Update();執(zhí)行后,才真正的修改了數(shù)據(jù)庫。
注:以上的一“踹”不能在使用Execute方法建立的數(shù)據(jù)集里“踹”。(我不知道是不是我自己的問題)
更簡單的方法,使用Connection->Execute方法來建立數(shù)據(jù)集,方法如下:
m_pRecordset = m_pConnection->Execute("SELECT * FROM TentacleCoordinate", &RecordsAffected , adCmdText);
別忘了定義:_variant_t RecordsAffected;
其它的對數(shù)據(jù)庫的操作:
這些都是基于SQL語言的,Execute方法。
創(chuàng)建表:
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);
別忘了關(guān)上它:
飯前便后要洗手,洗手別忘關(guān)龍頭:
if(m_pRecordset->State)
{
}
if(m_pConnection->State)
{
}
聯(lián)系客服