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);//执行语句
}
}
相关文章推荐
- SQL server 数据库ADO操作技术之2
- SQL server 数据库之ADO操作技术1
- ADO对SQL Server 2008数据库的基础操作
- SQL SERVER 2005 分区表实际操作( 2008-03-03 16:25:30| 分类: 数据库技术 )
- 使用ADO操作SQL SERVER 通过'OLE DB 访问 ACCESS 数据库 ,实现数据交换
- 使用ADO技术操作数据库
- visual c++与sql server 2000数据库进行ADO后台链接的操作
- SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法
- ADO.NET数据库连接、操作SQL举例
- VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法
- C# ADO.NET数据库操作
- VC ADO 数据库操作 SQL语句执行
- 游戏服务器中的数据库异步操作技术和游戏数据的保存机制
- sql server操作2:查询数据库语句大全【转】
- 淘宝内部php操作数据库处理类技术含量极高
- SQL server学习(一)数据库的基本知识、基本操作和基本语法
- SQL Server 数据库操作
- 我封装的ADO.NET对数据库操作经典类
- 用ADO操作数据库的方法步骤(ZT)
- 如何对SQL Server数据表和数据库进行迭代操作