SQL Server 基本操作之增删改查

回顾一些学习和使用的数据库基础知识:

首先看下创建一个数据库操作类:

#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)

        SELECT '004','12345','马六','男',1,'1234567890123','2012-10-01','[email protected]' UNION all
        SELECT '005','12345','杜七','男',1,'1234567890123','2012-10-01','[email protected]'
数据库基本操作之删除:
       语法: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 Scode AS 学生编号,SName AS 学生姓名,Saddress AS 学生地址 From Students Where SAddress = '河南新乡'
      可以使用+号将两列合成一列:Select studentname + sex,address from student 两列合成一列 数据类型必须一致
      查询空行 Select Sname from students where semail is null
      限制行数 select top 5 Sname,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.studentno
select [列名] from <表名> where [条件] group by 条件
       按照年纪统计总人数和  举例:select gradeid as 年级 count(*) as 总人数 from student group by gradeid 

你可能感兴趣的:(Sql,Server)