*********************************************************************************************
1. ADOConn功能類的引入
*********************************************************************************************
// ADOConn.h: interface for the ADOConn class.
//
//////////////////////////////////////////////////////////////////////
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#if !defined(AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_)
#define AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn();
virtual ~ADOConn();
void OnInitADOConn();
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
BOOL ExecuteSQL(_bstr_t bstrSQL);
void ExitConnect();
};
#endif // !defined(AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_)
--------------------------------------------------------------------------------------------
// ADOConn.cpp: implementation of the ADOConn class.
//數(shù)據(jù)庫(kù)連接、讀記錄及斷開操作
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CheckMan.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
//初始化——連接數(shù)據(jù)庫(kù)
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM庫(kù)環(huán)境
::CoInitialize(NULL);
try
{
// 創(chuàng)建Connection對(duì)象
m_pConnection.CreateInstance("ADODB.Connection");
// 設(shè)置連接字符串,必須是BSTR型或者_(dá)bstr_t類型
_bstr_t strConnect = "Provider=SQLOLEDB;Server=127.0.0.1;Database=basename;uid=sa;pwd=pwd;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉異常
catch(_com_error e)
{
AfxMessageBox("數(shù)據(jù)庫(kù)連接失敗,請(qǐng)開啟數(shù)據(jù)庫(kù)服務(wù)!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
}
}
// 執(zhí)行查詢
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 連接數(shù)據(jù)庫(kù),如果Connection對(duì)象為空,則重新連接數(shù)據(jù)庫(kù)
if(m_pConnection==NULL)
OnInitADOConn();
// 創(chuàng)建記錄集對(duì)象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的記錄
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉異常
catch(_com_error e)
{
AfxMessageBox("數(shù)據(jù)庫(kù)記錄讀取失敗!");
PostQuitMessage(0);
// 顯示錯(cuò)誤信息
//AfxMessageBox(e.Description());
}
// 返回記錄集
return m_pRecordset;
}
// 執(zhí)行SQL語句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 是否已經(jīng)連接數(shù)據(jù)庫(kù)
if(m_pConnection==NULL)
OnInitADOConn();
// Connection對(duì)象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 參數(shù)RecordsAffected是操作完成后所影響的行數(shù),
// 參數(shù)Options表示CommandText的類型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存儲(chǔ)過程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox("數(shù)據(jù)庫(kù)SQL語句執(zhí)行失敗!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 關(guān)閉記錄集和連接
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 釋放環(huán)境
::CoUninitialize();
}
*********************************************************************************************
2. 建立數(shù)據(jù)庫(kù)中表對(duì)應(yīng)的表類,將表中的各個(gè)要操作的列都以變量的形式在類中再現(xiàn),注意要保證對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)相通,例如SQL server中的 char n 類型對(duì)應(yīng)VC++中的CString類型等。然后建立要操作的功能對(duì)應(yīng)的功能函數(shù),如sql_select(),sql_insert() 等等。
*********************************************************************************************
--------------------------------------------------------------------------------------------
2.1 INSERT 插入
--------------------------------------------------------------------------------------------
void Ctable::sql_insert()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//將各非字符串的數(shù)據(jù)轉(zhuǎn)換為字符串
CString str_vlong,str_vint,str_vfloat;
str_tjxh.Format("%ld",tjxh);
str_yetl.Format("%d",yetl);
str_jzsly.Format("%f",jzsly);
//插入信息
vSQL="INSERT INTO table(lint,llong,lfloat,lstring,lchar)VALUES ("+vint+","+vlong+","+vfloat+",'"+vstring+"','"+vchar+"')"; //attention! 字符串的書寫,見后面說明
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
MessageBox(NULL,"保存體檢信息成功!" , "提示", 0);
}
--------------------------------------------------------------------------------------------
2.2 SELECT查詢
--------------------------------------------------------------------------------------------
void Ctable::sql_select(CString str)
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
vSQL = "SELECT * FROM table WHERE list="+str; //不用對(duì)str加''
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
if(m_pRecordset->adoEOF==1)
AfxMessageBox("無法找到該數(shù)據(jù)記錄!" );
else
{
vint=atoi((_bstr_t)m_pRecordset->GetCollect("lint")); //int 型讀取
tjxh=atol((_bstr_t)m_pRecordset->GetCollect("tjxh")); //long 型讀取
lysly=atof((_bstr_t)m_pRecordset->GetCollect("yk_lysly"));// float 型讀取
ch=*(char*)((_bstr_t)m_pRecordset->GetCollect("ch")); //char 讀取
str=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("str"); //char n,varchar n,string 的讀取
}
m_AdoConn.ExitConnect();
}
--------------------------------------------------------------------------------------------
2.3 UPDATE 更新
--------------------------------------------------------------------------------------------
void Ctable::sql_update()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//將各非字符串的數(shù)據(jù)轉(zhuǎn)換為字符串
CString str_vlong,str_vint,str_vfloat;
str_vlong.Format("%ld",vlong);
str_vint.Format("%d",vint);
str_vfloat.Format("%f",vfloat);
//更新數(shù)據(jù),注意第一個(gè)加號(hào)不可以是char
vSQL= "UPDATE table SET lstring='"+vstring+"',lchar ='" +vchar+"',lint=" +str_vint+ ","lfloat=" +str_vfloat+ "WHERE list='" +list+ "' ";
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
MessageBox(NULL,"更新記錄成功!" , "提示", 0);
}
--------------------------------------------------------------------------------------------
2.4 DELETE 刪除
--------------------------------------------------------------------------------------------
void Ctable::sql_delete(CString str)
{
//連接數(shù)據(jù)庫(kù)
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//設(shè)置DELETE語句
vSQL = "DELETE FROM hit3D WHERE list='"+str+"' ";
//執(zhí)行DELETE語句
m_AdoConn.ExecuteSQL(vSQL);
//斷開與數(shù)據(jù)庫(kù)的連接
m_AdoConn.ExitConnect();
}
*********************************************************************************
3. ADO控件的使用
*********************************************************************************
--------------------------------------------------------------------------------
3.1 ADO Data 控件
--------------------------------------------------------------------------------
1. 通過 VC 中 project-Add to Project/Components and controls,打開,找到Registered ActiveX Controls/Microsoft ADO Data
Control,version 6.0(OLEDB),加入;
2. 控件屬性的設(shè)置
(1) 通過build命令生成連接字符串;如:Provider=SQLOLEDB.1;Password=happy;Persist Security Info=True;User ID=sa;Initial
Catalog=Lottery;Data Source=127.0.0.1
(2) 通過RecordSource的設(shè)置完成記錄集的生成,如:使用1.adcmd text 形式,SELECT * FROM result3D ORDER BY xuhao DESC
(3) 設(shè)置密碼等。
3. 注意一般將數(shù)據(jù)源設(shè)置為Data Source=127.0.0.1,即為本機(jī)的數(shù)據(jù)源。
4. 可以通過加入Cadodc型的變量m_adodc來設(shè)置高級(jí)屬性,并且可以通過不同的SQL語言來返回要求的記錄集。
通過它一般是從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)記錄集,但是要把記錄集進(jìn)行顯示或其它操作就要通過其它的控件。
--------------------------------------------------------------------------------
3.2 DataGrid 控件
--------------------------------------------------------------------------------
1. 通過 VC 中 project-Add to Project/Components and controls,打開,找到Registered ActiveX Controls/Microsoft DataGrid
Control,version 6.0(OLEDB),加入;
2. 控件屬性的設(shè)置
可以直接通過ALL中進(jìn)行設(shè)置,如各種權(quán)限的設(shè)置等,數(shù)據(jù)來源設(shè)為同時(shí)引入的ADO Data控件的數(shù)據(jù)記錄集。
3. 通過CDataGrid型的變量m_datagrid來設(shè)置顯示的其它屬性,如:
_variant_t vIndex;
vIndex=long(0); //0 為列號(hào)
m_datagrid.GetColumns().GetItem(vIndex).SetCaption("期號(hào)"); //設(shè)置標(biāo)頭文字
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(45); //設(shè)置列寬度
要先加入
#include "column.h"
#include "columns.h"
#include "COMDEF.H"
三個(gè)頭文件。
4. 通過m_datagrid.GetItem(0)等命令來獲取當(dāng)前選中的記錄內(nèi)容。
DataGrid 控件一般用來顯示多條記錄的詳細(xì)內(nèi)容
--------------------------------------------------------------------------------
3.3 DataList 控件和DataCombo 控件
--------------------------------------------------------------------------------
1. 通過 VC 中 project-Add to Project/Components and controls,打開,找到Registered ActiveX Controls中相關(guān)內(nèi)容,加入;
2. 設(shè)置屬性,相差內(nèi)容相同;
3. 要注意它們的使用都是要配合一個(gè)ADO DATA控件返回的數(shù)據(jù)記錄集才可以完成的。
***********************************************************************************
4. VC++ 6.0 + SQL server的開發(fā)中的問題總結(jié)
***********************************************************************************
----------------------------------------------------------------------------------
4.1 vSQL字符串的書寫
----------------------------------------------------------------------------------
在使用ADO技術(shù)進(jìn)行數(shù)據(jù)庫(kù)的訪問時(shí)需要通過vSQL的字符串來進(jìn)行相關(guān)功能的實(shí)現(xiàn)要注意到的是
vSQL是相當(dāng)于一種CString類型的,所有在對(duì)它進(jìn)行生成時(shí)要用到 +
如str="INSERT INTO record3D(number,xuhao,a,b,c)VALUES('"+number+"',"+str_xuhao+")" 一句其實(shí)是幾個(gè)字符串連加在一起,分解如下:
str1= " INSERT INTO record3D(number,xuhao,a,b,c)VALUES(' "
str2= number
str3="',"
str4=str_xuhao
str5= ")"
str=str1+str2+str3+str4+str5;
另外各種數(shù)據(jù)類型要根據(jù)SQL語句的要求或需要' '或不需要' '的設(shè)置。
----------------------------------------------------------------------------------
4.2 SQL server中數(shù)據(jù)庫(kù)表名和列名的約束
----------------------------------------------------------------------------------
有的時(shí)候好像SQL語句的書寫是沒有任何錯(cuò)誤的,但是就是會(huì)報(bào)錯(cuò)提示 無法執(zhí)行執(zhí)行數(shù)據(jù)庫(kù)語句,這時(shí)候就應(yīng)該從數(shù)據(jù)庫(kù)的方面來找原因了,
在設(shè)置數(shù)據(jù)庫(kù)中表名和列名時(shí)一定要應(yīng)該不能使用SQL server本身?yè)碛械南到y(tǒng)約束名,例如:
表名不能以數(shù)字開頭,不能使用user,no,time等
列名不能用: user,no,time等
等等。
在使用了約束名之后,系統(tǒng)并不會(huì)報(bào)錯(cuò),可是它會(huì)給你定義的名稱加以修改,通常是加上一對(duì)[],例如會(huì)將你的no列名改成:[no],這樣你在訪
問的時(shí)候就一定要使用[no]做為列名才能夠找到此列,不然就無法進(jìn)行SQL語句的執(zhí)行了。
----------------------------------------------------------------------------------
4.3 各種數(shù)據(jù)類型的轉(zhuǎn)換
----------------------------------------------------------------------------------
1. CString ----> char*
p_str=(LPSTR)(LPCTSTR)str_CString;
2. CString ----> char[]
strcpy(str_char,(LPSTR)(LPCTSTR)str_CString);
3. CString、char[]、char*----> int
v_int=atoi((LPSTR)(LPCTSTR)str_CString);
v_int=atoi(str_CString);
4. CString、char[]、char*----> long
v_long=atol((LPSTR)(LPCTSTR)str_CString);
v_long=atol(str_CString);
5. char* ----> _bstr_t
_bstr_t str_bstr=p_str;
6. int ---> CString
str_CString.Format("%d",v_int);
7. long ---> CString
str_CString.Format("%ld",v_int);
----------------------------------------------------------------------------------
4.4 SQL刪除一個(gè)表中所有記錄命令
----------------------------------------------------------------------------------
刪除表中的所有行,而不記錄單個(gè)行刪除操作。
語法
TRUNCATE TABLE name
參數(shù)
name
是要截?cái)嗟谋淼拿Q或要?jiǎng)h除其全部行的表的名稱。
注釋
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使
用的系統(tǒng)和事務(wù)日志資源少。
DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。TRUNCATE TABLE 通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來刪除數(shù)據(jù),并且
只在事務(wù)日志中記錄頁(yè)的釋放。
TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的種子。如果想保留標(biāo)識(shí)計(jì)
數(shù)值,請(qǐng)改用 DELETE。如果要?jiǎng)h除表定義及其數(shù)據(jù),請(qǐng)使用 DROP TABLE 語句。
對(duì)于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在
日志中,所以它不能激活觸發(fā)器。
TRUNCATE TABLE 不能用于參與了索引視圖的表。
----------------------------------------------------------------------------------
4.5 UpdateData()
----------------------------------------------------------------------------------
UpdateData(FALSE) 是將數(shù)據(jù)從 變量 傳送到 控件中;
UpdateData(TRUE) 是將數(shù)據(jù)從 控件 傳送到 變量中;
----------------------------------------------------------------------------------
4.6 VC++ 6.0 工程中的類查看中看不到存在的類
----------------------------------------------------------------------------------
有兩種方法解決問題:
1.在工程目錄下把消失的類對(duì)應(yīng)的頭文件和源碼文件都移出文件夾,然后打到工程,在類向?qū)е羞x擇該類,這時(shí)會(huì)提示找不到相應(yīng)的文件,那
么這時(shí)再把類的兩個(gè)文件拷入工程文件夾,然后在類向?qū)е型ㄟ^找到兩個(gè)文件再建立這個(gè)類,這時(shí)在類查看中就會(huì)出現(xiàn)這個(gè)類了。
2.要?jiǎng)h除工程目錄下:project.clw 文件,然后打開工程,選 查看-建立類向?qū)В@時(shí)會(huì)提示說有問題,那么就從文件中再全部導(dǎo)入類,一般
情況下會(huì)解決問題。
聯(lián)系客服
微信登錄中...
請(qǐng)勿關(guān)閉此頁(yè)面