*********************************************************************************************
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ù)庫連接,、讀記錄及斷開操作
//////////////////////////////////////////////////////////////////////
#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ù)庫
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM庫環(huán)境
::CoInitialize(NULL);
try
{
// 創(chuàng)建Connection對象
m_pConnection.CreateInstance("ADODB.Connection");
// 設置連接字符串,,必須是BSTR型或者_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ù)庫連接失敗,請開啟數(shù)據(jù)庫服務!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
}
}
// 執(zhí)行查詢
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 連接數(shù)據(jù)庫,如果Connection對象為空,,則重新連接數(shù)據(jù)庫
if(m_pConnection==NULL)
OnInitADOConn();
// 創(chuàng)建記錄集對象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的記錄
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉異常
catch(_com_error e)
{
AfxMessageBox("數(shù)據(jù)庫記錄讀取失敗!");
PostQuitMessage(0);
// 顯示錯誤信息
//AfxMessageBox(e.Description());
}
// 返回記錄集
return m_pRecordset;
}
// 執(zhí)行SQL語句,,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 是否已經(jīng)連接數(shù)據(jù)庫
if(m_pConnection==NULL)
OnInitADOConn();
// Connection對象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,,通常是SQL命令,。
// 參數(shù)RecordsAffected是操作完成后所影響的行數(shù),
// 參數(shù)Options表示CommandText的類型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存儲過程,;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox("數(shù)據(jù)庫SQL語句執(zhí)行失敗!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 關閉記錄集和連接
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 釋放環(huán)境
::CoUninitialize();
}
*********************************************************************************************
2. 建立數(shù)據(jù)庫中表對應的表類,,將表中的各個要操作的列都以變量的形式在類中再現(xiàn),注意要保證對應的數(shù)據(jù)結構相通,,例如SQL server中的 char n 類型對應VC++中的CString類型等,。然后建立要操作的功能對應的功能函數(shù),如sql_select(),sql_insert() 等等,。
*********************************************************************************************
--------------------------------------------------------------------------------------------
2.1 INSERT 插入
--------------------------------------------------------------------------------------------
void Ctable::sql_insert()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//將各非字符串的數(shù)據(jù)轉換為字符串
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; //不用對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ù)轉換為字符串
CString str_vlong,str_vint,str_vfloat;
str_vlong.Format("%ld",vlong);
str_vint.Format("%d",vint);
str_vfloat.Format("%f",vfloat);
//更新數(shù)據(jù),,注意第一個加號不可以是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ù)庫
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//設置DELETE語句
vSQL = "DELETE FROM hit3D WHERE list='"+str+"' ";
//執(zhí)行DELETE語句
m_AdoConn.ExecuteSQL(vSQL);
//斷開與數(shù)據(jù)庫的連接
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. 控件屬性的設置
(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的設置完成記錄集的生成,,如:使用1.adcmd text 形式,,SELECT * FROM result3D ORDER BY xuhao DESC
(3) 設置密碼等。
3. 注意一般將數(shù)據(jù)源設置為Data Source=127.0.0.1,,即為本機的數(shù)據(jù)源,。
4. 可以通過加入Cadodc型的變量m_adodc來設置高級屬性,并且可以通過不同的SQL語言來返回要求的記錄集,。
通過它一般是從數(shù)據(jù)庫中獲取數(shù)據(jù)記錄集,,但是要把記錄集進行顯示或其它操作就要通過其它的控件,。
--------------------------------------------------------------------------------
3.2 DataGrid 控件
--------------------------------------------------------------------------------
1. 通過 VC 中 project-Add to Project/Components and controls,打開,找到Registered ActiveX Controls/Microsoft DataGrid
Control,version 6.0(OLEDB),,加入;
2. 控件屬性的設置
可以直接通過ALL中進行設置,,如各種權限的設置等,數(shù)據(jù)來源設為同時引入的ADO Data控件的數(shù)據(jù)記錄集,。
3. 通過CDataGrid型的變量m_datagrid來設置顯示的其它屬性,,如:
_variant_t vIndex;
vIndex=long(0); //0 為列號
m_datagrid.GetColumns().GetItem(vIndex).SetCaption("期號"); //設置標頭文字
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(45); //設置列寬度
要先加入
#include "column.h"
#include "columns.h"
#include "COMDEF.H"
三個頭文件。
4. 通過m_datagrid.GetItem(0)等命令來獲取當前選中的記錄內(nèi)容,。
DataGrid 控件一般用來顯示多條記錄的詳細內(nèi)容
--------------------------------------------------------------------------------
3.3 DataList 控件和DataCombo 控件
--------------------------------------------------------------------------------
1. 通過 VC 中 project-Add to Project/Components and controls,打開,,找到Registered ActiveX Controls中相關內(nèi)容,加入;
2. 設置屬性,,相差內(nèi)容相同;
3. 要注意它們的使用都是要配合一個ADO DATA控件返回的數(shù)據(jù)記錄集才可以完成的,。
***********************************************************************************
4. VC++ 6.0 + SQL server的開發(fā)中的問題總結
***********************************************************************************
----------------------------------------------------------------------------------
4.1 vSQL字符串的書寫
----------------------------------------------------------------------------------
在使用ADO技術進行數(shù)據(jù)庫的訪問時需要通過vSQL的字符串來進行相關功能的實現(xiàn)要注意到的是
vSQL是相當于一種CString類型的,所有在對它進行生成時要用到 +
如str="INSERT INTO record3D(number,xuhao,a,b,c)VALUES('"+number+"',"+str_xuhao+")" 一句其實是幾個字符串連加在一起,,分解如下:
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語句的要求或需要' '或不需要' '的設置,。
----------------------------------------------------------------------------------
4.2 SQL server中數(shù)據(jù)庫表名和列名的約束
----------------------------------------------------------------------------------
有的時候好像SQL語句的書寫是沒有任何錯誤的,但是就是會報錯提示 無法執(zhí)行執(zhí)行數(shù)據(jù)庫語句,,這時候就應該從數(shù)據(jù)庫的方面來找原因了,,
在設置數(shù)據(jù)庫中表名和列名時一定要應該不能使用SQL server本身擁有的系統(tǒng)約束名,例如:
表名不能以數(shù)字開頭,,不能使用user,no,time等
列名不能用: user,no,time等
等等,。
在使用了約束名之后,系統(tǒng)并不會報錯,,可是它會給你定義的名稱加以修改,,通常是加上一對[],例如會將你的no列名改成:[no],這樣你在訪
問的時候就一定要使用[no]做為列名才能夠找到此列,,不然就無法進行SQL語句的執(zhí)行了,。
----------------------------------------------------------------------------------
4.3 各種數(shù)據(jù)類型的轉換
----------------------------------------------------------------------------------
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刪除一個表中所有記錄命令
----------------------------------------------------------------------------------
刪除表中的所有行,,而不記錄單個行刪除操作,。
語法
TRUNCATE TABLE name
參數(shù)
name
是要截斷的表的名稱或要刪除其全部行的表的名稱。
注釋
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行,。但 TRUNCATE TABLE 比 DELETE 速度快,,且使
用的系統(tǒng)和事務日志資源少。
DELETE 語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項,。TRUNCATE TABLE 通過釋放存儲表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),,并且
只在事務日志中記錄頁的釋放。
TRUNCATE TABLE 刪除表中的所有行,,但表結構及其列,、約束、索引等保持不變,。新行標識所用的計數(shù)值重置為該列的種子,。如果想保留標識計
數(shù)值,請改用 DELETE,。如果要刪除表定義及其數(shù)據(jù),,請使用 DROP TABLE 語句。
對于由 FOREIGN KEY 約束引用的表,,不能使用 TRUNCATE TABLE,,而應使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在
日志中,,所以它不能激活觸發(fā)器,。
TRUNCATE TABLE 不能用于參與了索引視圖的表。
----------------------------------------------------------------------------------
4.5 UpdateData()
----------------------------------------------------------------------------------
UpdateData(FALSE) 是將數(shù)據(jù)從 變量 傳送到 控件中;
UpdateData(TRUE) 是將數(shù)據(jù)從 控件 傳送到 變量中;
----------------------------------------------------------------------------------
4.6 VC++ 6.0 工程中的類查看中看不到存在的類
----------------------------------------------------------------------------------
有兩種方法解決問題:
1.在工程目錄下把消失的類對應的頭文件和源碼文件都移出文件夾,,然后打到工程,,在類向導中選擇該類,,這時會提示找不到相應的文件,,那
么這時再把類的兩個文件拷入工程文件夾,然后在類向導中通過找到兩個文件再建立這個類,,這時在類查看中就會出現(xiàn)這個類了,。
2.要刪除工程目錄下:project.clw 文件,然后打開工程,,選 查看-建立類向導,,這時會提示說有問題,那么就從文件中再全部導入類,,一般
情況下會解決問題,。