回顾一些学习和使用的数据库基础知识:
首先看下创建一个数据库操作类:
#pragma once
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
using namespace ADODB;
class COpearteDatabase
{
public:
COpearteDatabase(void);
~COpearteDatabase(void);
private:
_ConnectionPtr m_pConnection;// 用于数据库的连接
_RecordsetPtr m_pRecordset; // 用于获取记录集
_bstr_t m_strConnect; // 用于重联数据库
public:
void InitADOConn(int v_iSelect, CString v_sDb0, CString v_sDb1, CString v_sDb2, CString v_sDb3);
void ReADOConn(_bstr_t m_strConnect);
_RecordsetPtr GetRecordset(CString strSQL);
bool ExcuteSQL(CString strSQL);
void ExitConn(void);
void CloseRecordset(void);
_bstr_t GetStrConnect(void);
void SetStrConncet(CString strConnect);
int GetField_Int(CString v_sField);
double GetField_Double(CString v_sField);
bool GetField_Bool(CString v_sField);
CString GetField_String(CString v_sField);
COleDateTime GetField_DateTime(CString v_sField);
private:
bool m_bFlag;
public:
void SetADOConnFlag(bool bFlag);
bool GetADOConnFlag(void);
};
#include "stdafx.h"
#include "OpearteDatabase.h"
enum
{
TYPE_SQL = 0,
TYPE_ACEESS,
TYPE_ODBC,
};
COpearteDatabase::COpearteDatabase(void)
: m_strConnect(_T(""))
, m_bFlag(false)
{
}
COpearteDatabase::~COpearteDatabase(void)
{
}
void COpearteDatabase::InitADOConn(int v_iSelect, CString v_sDb0, CString v_sDb1, CString v_sDb2, CString v_sDb3)
{
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
switch (v_iSelect)
{
case TYPE_SQL:
m_strCOnnect= "Provider=SQLOLEDB;Server="+v_sDb0+";Database="+v_sDb1+";uid="+v_sDb2+";pwd="+v_sDb3;
break;
case TYPE_ACEESS:
m_strCOnnect= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+v_sDb1+";jet oledb:database password="+v_sDb3;
break;
case TYPE_ODBC:
m_strCOnnect= "Data Source="+v_sDb0+";uid="+v_sDb2+";pwd="+v_sDb3;
break;
}
m_pConnection->Open(m_strConnect,"","",adModeUnknown);
m_bFlag = true;
}
catch(_com_error e)
{
CString strTemp;
m_bFlag = false;
strTemp.Format(_T("Error = %d,ErrorInof = %s,ErrorMessage = %s,Description = %s"),e.Error(),
e.ErrorInfo(),
e.ErrorMessage(),
e.Description()
);
//AfxMessageBox(strTemp);
}
return;
}
void COpearteDatabase::ReADOConn(_bstr_t m_strConnect)
{
}
_RecordsetPtr COpearteDatabase::GetRecordset(CString strSQL)
{
if (!m_bFlag)
ReADOConn(m_strConnect);
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open((_bstr_t)strSQL,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
m_pRecordset->CacheSize = 2000;
}
catch(_com_error e)
{
ADODB::ErrorsPtr ptrErrors = m_pConnection->Errors;
long lCount = ptrErrors->Count;
ADODB::ErrorPtr ptrError = NULL;
CString sError,sSQLState;
for(long n = 0; n
ptrError = ptrErrors->GetItem(n);
sError.Format(
_T("Description: %s, SQLState: %s, NativeError: %d, Number: %d, Source: %s"),
(LPCTSTR)ptrError->Description,
(LPCTSTR)ptrError->SQLState,
ptrError->NativeError,
ptrError->Number,
(LPCTSTR)ptrError->Source
);
//AfxMessageBox(sError,MB_YESNO|MB_ICONQUESTION);
sSQLState = (LPCTSTR)ptrError->SQLState;
if (!sSQLState.Compare(_T("HY018")) ||!sSQLState.Compare(_T("08S01")))
{
m_bFlag = FALSE;
ReADOConn(m_strConnect);
if (m_bFlag)
return GetRecordset(strSQL);
}
}
}
return m_pRecordset;// 返回记录集
}
bool COpearteDatabase::ExcuteSQL(CString strSQL)
{
if (!m_bFlag)
ReADOConn(m_strConnect);
try
{
// Connection对象的Execute方法:(_bstr_t CommandText, VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名;adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
ADODB::ErrorsPtr ptrErrors = m_pConnection->Errors;
long lCount = ptrErrors->Count;
ADODB::ErrorPtr ptrError = NULL;
CString sError,sSQLState;
for(long n = 0; n
ptrError = ptrErrors->GetItem(n);
sError.Format(
_T("Description: %s, SQLState: %s, NativeError: %d, Number: %d, Source: %s"),
(LPCTSTR)ptrError->Description,
(LPCTSTR)ptrError->SQLState,
ptrError->NativeError,
ptrError->Number,
(LPCTSTR)ptrError->Source
);
AfxMessageBox(sError,MB_OK);
sSQLState = (LPCTSTR)ptrError->SQLState;
if (!sSQLState.Compare(_T("HY018")) || !sSQLState.Compare(_T("08S01")))
{
m_bFlag = FALSE;
ReADOConn(m_strConnect);
if (m_bFlag)
ExcuteSQL(strSQL);
}
}
return false;
}
return false;
}
void COpearteDatabase::ExitConn(void)
{
try
{
if (m_pRecordset != NULL)
{
m_pRecordset->Close();
m_pRecordset = NULL;
}
m_pConnection->Close();
}
catch (_com_error e)
{
}
return;
}
void COpearteDatabase::CloseRecordset(void)
{
try
{
if (m_pRecordset != NULL)
{
m_pRecordset->Close();
m_pRecordset = NULL;
}
}
catch(_com_error)
{
}
return;
}
_bstr_t COpearteDatabase::GetStrConnect(void)
{
return m_strConnect;
}
void COpearteDatabase::SetStrConncet(CString strConnect)
{
m_strCOnnect= strConnect;
return;
}
int COpearteDatabase::GetField_Int(CString v_sField)
{
_variant_t Var;
int iValue;
try
{
Var = m_pRecordset->GetCollect((_variant_t)v_sField);
if (Var.vt != VT_NULL)
iValue = Var.intVal;
else
iValue = 0;
return iValue;
}
catch(_com_error e)
{
CString strTemp;
m_bFlag = false;
strTemp.Format(e.Error(),
e.ErrorInfo(),
e.ErrorMessage(),
e.Description()
);
//AfxMessageBox(strTemp);
return -1;
}
}
double COpearteDatabase::GetField_Double(CString v_sField)
{
_variant_t Var;
double dVaule;
Var = m_pRecordset->GetCollect((_variant_t)v_sField);
if (Var.vt != VT_NULL)
dVaule = Var.dblVal;
else
dVaule = 0.0;
return dVaule;
}
bool COpearteDatabase::GetField_Bool(CString v_sField)
{
_variant_t Var;
bool bVaule;
Var = m_pRecordset->GetCollect((_variant_t)v_sField);
if(Var.vt != VT_NULL)
bVaule = (bool)Var.boolVal;
else
bVaule = false;
return bVaule;
}
CString COpearteDatabase::GetField_String(CString v_sField)
{
_variant_t Var;
CString strValue;
Var = m_pRecordset->GetCollect((_variant_t)v_sField);
if (Var.vt != VT_NULL)
strValue = Var.bstrVal;
else
strValue = " ";
strValue.Trim();
return strValue;
}
COleDateTime COpearteDatabase::GetField_DateTime(CString v_sField)
{
_variant_t Var;
COleDateTime coDateTime;
Var=m_pRecordset->GetCollect((_variant_t)v_sField);
if (Var.vt != VT_NULL)
coDateTime=Var.date;
else
//vd=COleDateTime::GetCurrentTime();//默认:当前日期
coDateTime=COleDateTime(1990,1,1,0,0,0);
return coDateTime;
}
void COpearteDatabase::SetADOConnFlag(bool bFlag)
{
m_bFlag = bFlag;
return;
}
bool COpearteDatabase::GetADOConnFlag(void)
{
return m_bFlag;
}
再回顾一些关于数据库基础操作知识:
数据库基本应用方式:
应用程序 --------数据库服务器 应用程序操作和查询 ,数据服务器响应和提供数据。
数据库数据的准确性包括如下:域完整性,实体完整性,引用完整性以及自定义完整性(触发器)
域完整性(Domain Integrity)是指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。
实体完整性实体完整性指表中行的完整性。主要用于保证操作的数据(记录)非空、唯一且不重复。即实体完整性要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为"空"(NULL)或重复
引用完整性:涉及到外键的数据库表不能超出另外一个数据库表的范围。
数据库基本操作之插入:
语法:INSERT [INTO] 表名 [列名] VALUES(值列表)
举例说明:INSERT INTO table1(id,name,address) Vaules(1,'wz','mm')
INSERT INTO table2(id,name,address) Select ID from table1
INSERT INTO Student(StudentNo,LoginPwd,StudentName,Sex,GradeId,Phone,BornDate,Email)
SELECT '004','12345','马六','男',1,'1234567890123','2012-10-01','ABC@126.COM'UNION all SELECT '005','12345','杜七','男',1,'1234567890123','2012-10-01','ABC@126.COM'数据库基本操作之删除: 语法:Delete [from] 表名 [where删除条件] 或者Truncate TABLE 表名,数据删除操作一定要加上条件否则会直接删除所有数据库基本操作之修改: 语法:Update 表名 Set 列名 = “” where 条件举例:update students set ssex = 0 update students set address = '上海黄浦' where saddress = '上海虹桥'数据库基本操作之查找:查询产生一个虚拟表,看到的表的形式显示的结果,但结果并不是真正的存储。 语法:SELECT [列名] form 表名 [where 查询条件] [order by 排序的列名] 可以使用AS进行命名:Select ScodeAS 学生编号,SName AS 学生姓名,Saddress AS 学生地址 From Students Where SAddress = '河南新乡' 可以使用+号将两列合成一列:Selectstudentname + sex,address from student 两列合成一列 数据类型必须一致 查询空行 Select Sname from studentswhere semail is null 限制行数 select top 5Sname,SAddress From Students where ssex = 0数据库基本操作之查找之模糊查询:使用Like,Between,IN 进行模糊查询 使用聚合函数统计和汇总查询信息 Select * from students where 姓名 Like '张%',举例通配符: - 一个字符 A like 'c-' cs,cd 等 % 任意长度的字符串 B like 'c0%' [] 括号中所指定范围内的一个字符 C Like '9w0[1-2]' [^]不在括号中所指定范围内的一个字符 D Like '9w0[^1-2]'举例:插叙student 表中 地址包含山东的学生姓名 电话,以及地址 Select studentname,phone,address from student where address like '%山东%' Select score from studentresult where studentNO = 'S1101004' and subjectid in ('1','2','3')聚合函数:对某一列值进行计算,并返回计算后的值,具有统计数据的作用其中包括SUM求和,Avg求平均,Max求最大值,Min求最小值分组查询:连接查询 举例:Select from student form 表1 INNER Join result as r on ...student studentno = result.studentnoselect [列名] from <表名> where [条件] group by 条件 按照年纪统计总人数和 举例:select gradeid as 年级 count(*) as 总人数 from student group by gradeid