您的位置:首页 > 数据库

SQL server 数据库之ADO操作技术1

2012-10-14 10:35 253 查看
关于SQLserver的数据库操作

1.导入两个文件

以下是:(DatabaseAccess.h文件)

//DatabaseAccess.h:interfacefortheCDatabaseAccessclass.
//
//////////////////////////////////////////////////////////////////////

#if!defined(AFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_)
#defineAFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_

#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include<Afxtempl.h>

//描述_ParameterPtr对象信息的结构
typedefstructtagParameterInfo{			//参数信息
_bstr_t						Name;		//参数名字
enumDataTypeEnum			Type;		//参数类型
enumParameterDirectionEnum	Direction;	//参数方向(输入、输出)
long						Size;		//参数尺寸
_variant_t					Value;		//参数值。
}PARAMETERINFO,*PPARAMETERINFO;

//使用前在StdAfx.h中加入#import"C:\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
//访问数据库前先用::CoInitialize(NULL)初始化COM环境。
//程序退出时使用::CoUninitialize()释放资源。

classCDatabaseAccess
{
private:
bool				m_bIsOracle;	//ORACLE与SQLServer切换标志。默认是ORACLE数据库
_ConnectionPtr		m_pCon;			//连接对象
public:

intGetRecordSetCount(_RecordsetPtrm);
//连接本地数据库(无密码)
BOOLConnectDB(char*DatabaseName);

//连接本地数据库(有密码)通过ODBC方式连接
BOOLConnectDB(constchar*DatabaseName,char*PassWord);

CDatabaseAccess();

virtual~CDatabaseAccess();

//连接到数据库服务器,DSN方式1成功0失败
BOOLConnectDBSQL(char*pcDSNName,char*pcUserName,char*pcUserPassword);

//连接到数据库服务器,需要IP,端口和Oracle全局数据库名或SID的连接方式。1成功0失败
BOOLConnectDB(constchar*pcUserName,constchar*pcUserPassword,constchar*pcServerIP,constchar*pcServerPort="1024",constchar*pcConnectServiceName="MFD");

//关闭与数据库的连接
voidCloseConnect();

//设置数据库类型(ORACLE与SQLServer)
voidSetDatabaseType(boolbIsOracle=true);

//执行存储过程(普通存储过程,即非包中的),非零-正确执行;0-参数个数为负数
BOOLExecuteProcedure(constchar*pcProcedureName,PARAMETERINFOaPrameterInfo[],BYTEbCount);

//执行存储过程返回记录集的地址。在此函数中使用约定包名:mfd_callpkg。字段列表用"逗号"隔开如:"empid,empname"
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName,PARAMETERINFOaParameterInfo[],BYTEbParametersCount,constchar*pcFieldsList,constchar*pcPackageName="mfd_callpkg");

//无参数的存储过程(普通存储过程,非包中)
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName);

//无参数的存储过程
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName,constchar*pcFieldsList);

//执行SQL语句
_RecordsetPtr*ExecuteSQLSentence(constchar*pcSentence);

};

#endif//!defined(AFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_)

以下是(DatabaseAccess.cpp文件)
//DatabaseAccess.cpp:implementationoftheCDatabaseAccessclass.
//
//////////////////////////////////////////////////////////////////////

#include"stdAfx.h"
#include"DatabaseAccess.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDatabaseAccess::CDatabaseAccess()
{
CoInitialize(NULL);
m_bIsOracle=true;		//默认是使用ORACLE数据库

try
{
m_pCon.CreateInstance(_uuidof(Connection));
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::CDatabaseAccess()--创建COM实例失败%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return;
}
catch(...){
TRACE("--CDatabaseAccess::CDatabaseAccess()--未知错误,创建COM实例失败\n");
return;
}
}

CDatabaseAccess::~CDatabaseAccess()
{
CloseConnect();
}

//关闭与数据库的连接
voidCDatabaseAccess::CloseConnect()
{
try
{
if(m_pCon->State)
m_pCon->Close();
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::CloseConnect()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return;
}
catch(...){
TRACE("--CDatabaseAccess::CloseConnect()--不明错误\n");
return;
}
}

//设置数据库类型
voidCDatabaseAccess::SetDatabaseType(boolbIsOracle/*=true*/)
{
m_bIsOracle=bIsOracle;
}

//连接到数据库服务器,采用系统DSN方式1成功0失败
BOOLCDatabaseAccess::ConnectDBSQL(char*pcDSNName,char*pcUserName,char*pcUserPassword)
{
//连接SqlServer数据库
if(!m_bIsOracle)
{
try
{
CString		strConnection;	//连接字符串
strConnection.Format("DSN=%s;UID=%s;PWD=%s",pcDSNName,
pcUserName,pcUserPassword);
HRESULT		hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();

if(SUCCEEDED(hResult))
return1;				//连接成功!
else
return0;				//连接失败!

}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ConnectDB()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return0;				//连接失败
}
catch(...){
TRACE("--CDatabaseAccess::ConnectDB()--不明错误\n");
return0;
}
}
}

//连接到数据库服务器,需要IP,端口和Oracle全局数据库名或SID的连接方式。1成功0失败.
BOOLCDatabaseAccess::ConnectDB(constchar*pcUserName,constchar*pcUserPassword,constchar*pcServerIP,constchar*pcServerPort,constchar*pcGlobalDatabaseName/*="MFD"*/)
{
if(!m_bIsOracle)
{
try
{
CString		strConnection;	//连接字符串
strConnection.Format("Provider=SQLOLEDB.1;Password=%s;PersistSecurityInfo=True;UserID=%s;InitialCatalog=%s;DataSource=%s",
pcUserPassword,pcUserName,pcGlobalDatabaseName,pcServerIP);
TRACE("%s\n",strConnection.GetBuffer(0));
HRESULT		hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return1;				//连接成功!
else
return0;				//连接失败!
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ConnectDB()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return0;				//连接失败
}
catch(...){
TRACE("--CDatabaseAccess::ConnectDB()--不明错误\n");
return0;
}

}
else
{
try
{
CString		strConnection;	//连接字符串
strConnection.Format("Provider=MSDAORA.1;DataSource=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%s)))(CONNECT_DATA=(SERVICE_NAME=%s)));UserID=%s;Password=%s",
pcServerIP,pcServerPort,pcGlobalDatabaseName,pcUserName,pcUserPassword);
TRACE("%s\n",strConnection.GetBuffer(0));
HRESULT		hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return1;				//连接成功!
else
return0;				//连接失败!
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ConnectDB()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return0;				//连接失败
}
catch(...){
TRACE("--CDatabaseAccess::ConnectDB()--不明错误\n");
return0;
}
}
}

//执行存储过程(普通存储过程,即非包中的),非零-正确执行;0-失败(参数个数为负数)。
BOOLCDatabaseAccess::ExecuteProcedure(constchar*pcProcedureName,PARAMETERINFOaParameterInfo[],BYTEbCount)
{
_CommandPtr			pCmd;
HRESULThRet=pCmd.CreateInstance(_uuidof(Command));
if(FAILED(hRet))
{
TRACE("--CDatabaseAccess::ExecuteProcedure()--创建COMMAND对象失败!");
return0;
}

_ParameterPtr*aParameterPtr=NULL;
if(bCount>0)
{
//动态创建参数对象
aParameterPtr=new_ParameterPtr[bCount];
memset(aParameterPtr,0,sizeof(_ParameterPtr)*bCount);
}

try
{
_bstr_tbstrSPName(pcProcedureName);		//存储过程名
if(bCount<=0)								//无参数
{
if(bCount<0)
{
return0;							//出错
}

pCmd->ActiveConnection=m_pCon;		//设置COMMAND对象的属性
pCmd->CommandText=bstrSPName;
pCmd->CommandType=adCmdStoredProc;
//动态创建记录集对象。
_RecordsetPtr*ppRs=new_RecordsetPtr();
(*ppRs)=pCmd->Execute(NULL,NULL,NULL);		//执行存储过程

return(BOOL)ppRs;
}

pCmd->ActiveConnection=m_pCon;			//设置COMMAND对象的属性
pCmd->CommandText=bstrSPName;
pCmd->CommandType=adCmdStoredProc;

//创建参数实例并添加之
for(inti=0;i<bCount;i++)
{
aParameterPtr[i]=pCmd->CreateParameter(aParameterInfo[i].Name,aParameterInfo[i].Type,aParameterInfo[i].Direction,aParameterInfo[i].Size);
pCmd->Parameters->Append(aParameterPtr[i]);
}
if(!m_bIsOracle)									//SQLServer中需要!
pCmd->Parameters->Refresh();					//资源集中的操作

//对输入参数的处理
for(i=0;i<bCount;i++)
{
if(aParameterInfo[i].Direction==adParamInput||aParameterInfo[i].Direction==adParamInputOutput)
{
if(m_bIsOracle)								//oracle数据库
{
pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name))->Value=aParameterInfo[i].Value;
}
else										//SQLserver数据库
{
CStringstr;
str.Format("@%s",((char*)aParameterInfo[i].Name));
pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value=aParameterInfo[i].Value;
}
}
}

pCmd->Execute(NULL,NULL,NULL);					//通过COMMAND对象来执行存储过程。

//对输出参数的处理
for(i=0;i<bCount;i++)
{
if(aParameterInfo[i].Direction==adParamOutput||aParameterInfo[i].Direction==adParamInputOutput)
{
if(m_bIsOracle)								//oracle数据库
{
aParameterInfo[i].Value=pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name))->Value;
}
else										//SQLserver数据库
{
CStringstr;
str.Format("@%s",((char*)aParameterInfo[i].Name));
aParameterInfo[i].Value=pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;
}
}
}
if(bCount>0)
delete[]aParameterPtr;
return1;
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ExecuteProcedure()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
if(bCount>0)
delete[]aParameterPtr;
return0;
}
catch(...){
TRACE("--CDatabaseAccess::ExecuteProcedure()--不明错误\n");
if(bCount>0)
delete[]aParameterPtr;
return0;
}
}

//执行存储过程返回记录集的地址。在此函数中使用约定包名:mfd_callpkg。字段列表用"逗号"隔开如:"empid,empname"。
//存储过程格式约定:包名.存储过程名(输入参数,输入参数,输出参数,结果集)。
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName,PARAMETERINFOaParameterInfo[],BYTEbParametersCount,
constchar*pcFieldsList,constchar*pcPackageName/*="mfd_callpkg"*/)
{
_RecordsetPtr*ppRs=new_RecordsetPtr;							//动态创建记录集对象
HRESULThpRecordset=(*ppRs).CreateInstance(_uuidof(Recordset));
if(FAILED(hpRecordset))
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()--创建RECORDSET对象失败!");
returnNULL;
}

_CommandPtr			pCmd;
HRESULThRet=pCmd.CreateInstance(_uuidof(Command));
if(FAILED(hRet))
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()--创建COMMAND对象失败!");
returnNULL;
}

constCStringstrResultsetNumber="1000";						//结果集中记录的个数.好像是上限
CStringstrCallScript;									//调用格式.
strCallScript="{call";
if(strlen(pcPackageName))										//如果在包中。则连入包名。
{
strCallScript+=pcPackageName;
strCallScript+=".";
}
strCallScript+=pcProcedureName;
strCallScript+="(";
for(inti=1;i<=bParametersCount;i++)
{
strCallScript+="?,";
}
strCallScript+="{resultset";
strCallScript+=strResultsetNumber;
strCallScript+=",";
strCallScript+=pcFieldsList;
strCallScript+="})}";

TRACE("%s\n",strCallScript.GetBuffer(0));
_ParameterPtr*aParameterPtr=NULL;
if(bParametersCount>0)
{	//动态创建参数对象
aParameterPtr=new_ParameterPtr[bParametersCount];
memset(aParameterPtr,0,sizeof(_ParameterPtr)*bParametersCount);
}

try
{
if(bParametersCount<=0)					//无参数
{
if(bParametersCount<0)
{
deleteppRs;
return(_RecordsetPtr*)NULL;		//出错
}

pCmd->ActiveConnection=m_pCon;		//设置COMMAND对象的属性
pCmd->CommandText=strCallScript.AllocSysString();
pCmd->CommandType=adCmdText;

_variant_t	vtEmpty(DISP_E_PARAMNOTFOUND,VT_ERROR);		//变体类型空值

(*ppRs)->CursorLocation=adUseClient;
(*ppRs)->Open((IDispatch*)pCmd,vtEmpty,adOpenKeyset,adLockOptimistic,adOpenRecordUnspecified);

returnppRs;
}

pCmd->ActiveConnection=m_pCon;			//设置COMMAND对象的属性
pCmd->CommandText=strCallScript.AllocSysString();
pCmd->CommandType=adCmdText;

//创建参数实例并添加之
for(inti=0;i<bParametersCount;i++)
{
aParameterPtr[i]=pCmd->CreateParameter(aParameterInfo[i].Name,aParameterInfo[i].Type,aParameterInfo[i].Direction,aParameterInfo[i].Size);
pCmd->Parameters->Append(aParameterPtr[i]);
}

if(!m_bIsOracle)									//SQLServer中需要!
pCmd->Parameters->Refresh();					//资源集中的操作

//对输入参数的处理
for(i=0;i<bParametersCount;i++)
{
if(aParameterInfo[i].Direction==adParamInput||aParameterInfo[i].Direction==adParamInputOutput)
{
if(m_bIsOracle)								//oracle数据库
{
pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name))->Value=aParameterInfo[i].Value;
}
else										//SQLserver数据库
{
CStringstr;
str.Format("@%s",((char*)aParameterInfo[i].Name));
pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value=aParameterInfo[i].Value;
}
}
}

_variant_t	vtEmpty(DISP_E_PARAMNOTFOUND,VT_ERROR);		//变体类型空值

(*ppRs)->CursorLocation=adUseClient;
(*ppRs)->Open((IDispatch*)pCmd,vtEmpty,adOpenKeyset/*adOpenForwardOnly*/,adLockOptimistic,adOpenRecordUnspecified);

//对输出参数的处理
for(i=0;i<bParametersCount;i++)
{
if(aParameterInfo[i].Direction==adParamOutput||aParameterInfo[i].Direction==adParamInputOutput)
{
if(m_bIsOracle)								//oracle数据库
{
aParameterInfo[i].Value=pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name))->Value;
}
else										//SQLserver数据库
{
CStringstr;
str.Format("@%s",((char*)aParameterInfo[i].Name));
aParameterInfo[i].Value=pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;
}
}
}
if(bParametersCount>0)
delete[]aParameterPtr;
returnppRs;												//返回记录集对象的指针.
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()--%s,%s%x\n",(char*)e.Description(),(char*)e.ErrorMessage(),e.Error());
if(e.Error()==0x80004005)
{
TRACE("到数据库的网络连接可能已经断开。\n");
}
if(bParametersCount>0)
delete[]aParameterPtr;
deleteppRs;
returnNULL;
}
catch(...){
TRACE("--ExecProGetRecordset()--不明错误\n");
if(bParametersCount>0)
delete[]aParameterPtr;
deleteppRs;
returnNULL;
}
}

//无参数的存储过程(普通存储过程,非包中)。
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName)
{
return(_RecordsetPtr*)ExecuteProcedure(pcProcedureName,(PARAMETERINFO*)NULL,0);
}

//无参数的存储过程
_RecordsetPtr*CDatabaseAccess::ExecProGetRecordset(constchar*pcProcedureName,constchar*pcFieldsList)
{
returnExecProGetRecordset(pcProcedureName,(PARAMETERINFO*)NULL,0,pcFieldsList);
}

//执行SQL语句
_RecordsetPtr*CDatabaseAccess::ExecuteSQLSentence(constchar*pcSentence)
{
_RecordsetPtr*ppRs=new_RecordsetPtr;			//动态创建记录集对象。

try
{
(*ppRs).CreateInstance(_uuidof(Recordset));
(*ppRs)->Open(_variant_t(pcSentence),m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
returnppRs;

}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ExecuteSQLSentence()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
deleteppRs;
returnNULL;
}
catch(...){
TRACE("--CDatabaseAccess::ExecuteSQLSentence()--不明错误\n");
deleteppRs;
returnNULL;
}
}
//连接内地数据库方式(无用户名和密码格式)(Access数据库)
BOOLCDatabaseAccess::ConnectDB(char*DatabaseName)
{
if(!m_bIsOracle)
{
try
{
CString		strConnection;	//连接字符串
strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=%s;PersistSecurityInfo=False",DatabaseName);
HRESULT		hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return1;				//连接成功!
else
return0;				//连接失败!
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ConnectDB()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return0;				//连接失败
}
catch(...){
TRACE("--CDatabaseAccess::ConnectDB()--不明错误\n");
return0;
}
}
}
BOOLCDatabaseAccess::ConnectDB(constchar*DatabaseName,char*PassWord)
{
//连接ACCESS数据库,带密码
if(!m_bIsOracle)
{
try
{
CString		strConnection;	//连接字符串
strConnection.Format("DSN=%s;PWD=%s",DatabaseName,PassWord);
HRESULT		hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return1;				//连接成功!
else
return0;				//连接失败!
}
catch(_com_error&e)
{
TRACE("--CDatabaseAccess::ConnectDB()--%s,%s\n",(char*)e.Description(),(char*)e.ErrorMessage());
return0;				//连接失败
}
catch(...){
TRACE("--CDatabaseAccess::ConnectDB()--不明错误\n");
return0;
}
}
}

intCDatabaseAccess::GetRecordSetCount(_RecordsetPtrm)
{
inti=0;
if(!(m->GetRecordCount()==0))
{
m->MoveFirst();
while(!m->adoEOF){
i++;
m->MoveNext();
}
}
returni;
}

2.在stfAfx.h文件中导入
#import"C:\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")
在APP()中定义CDatabaseAccessado;

3.在APP的Initlnstance()
中添加
BOOLCTextApp::InitInstance()
{

//Standardinitialization
if(!AfxOleInit())
{
//AfxMessageBox(IDP_OLE_INIT_FAILED);
returnFALSE;
}

ado.SetDatabaseType(false);
ado.ConnectDB("sa","root","172.20.3.23","1433","student");

AfxEnableControlContainer();

4.添加
voidCTextDlg::OnButton1()//添加
{
//TODO:Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
CStringstrSQL;
_variant_tvar;
_RecordsetPtrptr;

intindex=0;
intage=atoi(m_nAge);
intnScore=atoi(m_nScore);

strSQL.Format("insertintostudentvalues('%s','%s',%d,%d)",m_strID,m_strName,age,nScore);//添加语句

if(AfxMessageBox("你确定要添加这条记录吗?",MB_OKCANCEL,0)==IDOK)
{ //zhongdian
ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);//执行语句
}

}
5.删除记录
voidCTextDlg::OnButton2()//删除
{
//TODO:Addyourcontrolnotificationhandlercodehere
UpdateData(true);
CStringstrSQL;
_RecordsetPtrptr;//额外添加

intnitem;

strSQL.Format("deletefromstudentwhereID=%s",m_strID);
if(AfxMessageBox("你确定要添删除这条记录吗?",MB_OKCANCEL,0)==IDOK)
{
ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);//执行语句
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: