回顾一些学习和使用的数据库基础知识:
首先看下创建一个数据库操作类:
#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 < lCount; 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 < lCount; 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)