#include "stdafx.h" #include "UIIImpADORXServer.h" #include "UIIVariantUtility.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif CUIIImpADORXServer::CUIIImpADORXServer() { //初始化COM调用 if(FAILED(::CoInitialize(NULL))) { AfxMessageBox(_T("初始化Com失败!")); } m_bSuccessState = FALSE; m_ConPtr = NULL; m_sConnection = _T(""); m_sDatabase = _T(""); } CUIIImpADORXServer::~CUIIImpADORXServer() { if(m_ConPtr != NULL && m_bSuccessState) { m_ConPtr->Close(); } m_bSuccessState = FALSE; } //建立连接、连接数据库,打开数据库[access本地] BOOL CUIIImpADORXServer::InitADOServer(LPCTSTR pszDbFileName) { if (pszDbFileName == NULL) return FALSE; //如果打开则初始化 if(m_bSuccessState) { CloseAll(); } //初始化数据库连接 if(FAILED(m_ConPtr.CreateInstance(__uuidof(Connection)))) { return FALSE; } HRESULT hr = 0; try { //示例 //mdb : sDbFileName="DRIVER={Microsoft Access Driver (*.mdb)};" //"DBQ=c:\\mydata.mdb;UID=sa;PWD="; //xls : Driver={Microsoft Excel Driver (*.xls)};" //"DBQ=c:\\mydata.xls;ReadOnly=false;" /* //https://www.microsoft.com/zh-cn/download/details.aspx?id=54920 * 使用 ODBC 连接到 Microsoft Office Access 数据的应用程序开发人员,请将连接字符串设置为 “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file” 使用 ODBC 连接到 Microsoft Office Excel 数据的应用程序开发人员,请将连接字符串设置为 “Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file” */ CString sExt,sConnect = pszDbFileName; CString sDbFileName = pszDbFileName; sDbFileName.MakeLower(); if (sDbFileName.GetLength() > 4) { int nPos = sDbFileName.ReverseFind(_T('.')); if (nPos != -1) { sExt = sDbFileName.Mid(nPos); } if (sExt.CompareNoCase( _T(".mdb")) == 0 || sExt.CompareNoCase( _T("*.accdb")) == 0 ) { #ifdef _WIN64 sConnect.Format(_T("DRIVER={Microsoft Access Driver (*.mdb,*.accdb)};") _T("DBQ=%s;UID='';PWD=''"), sDbFileName); #else sConnect.Format(_T("DRIVER={Microsoft Access Driver (*.mdb)};") _T("DBQ=%s;UID=;PWD="), sDbFileName); #endif } else if (sExt.Find(_T(".xls")) != -1)//xls xlsx xlsm xlsb { #ifdef _WIN64 //sConnect.Format(_T("DRIVER={Microsoft Excel Driver (*.xls,*.xlsx,*.xlsm,*.xlsb)};") // _T("DBQ=%s;UID='';PWD=''"), sDbFileName); sConnect.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=%s;Extended Properties='Excel 12.0; HDR=YES; IMEX=3'"), sDbFileName); #else sConnect.Format(_T("DRIVER={Microsoft Excel Driver (*.xls)};") _T("DBQ=%s;UID=;PWD="), sDbFileName); #endif } else { m_ConPtr.Release(); m_ConPtr = NULL; return FALSE; } } m_ConPtr->ConnectionTimeout = 60; hr = m_ConPtr->Open(_bstr_t(sConnect),_T(""),_T(""),adModeUnknown); } catch(_com_error &er) { //进行异常捕捉 DisplayADOException(er); AfxMessageBox(er.ErrorMessage()); m_bSuccessState = FALSE; m_ConPtr.Release(); m_ConPtr = NULL; return FALSE; } m_sConnection = pszDbFileName; m_bSuccessState = TRUE; return TRUE; } BOOL CUIIImpADORXServer::InitADOServer(LPCTSTR pszConnection,bool bDisplayException,ConnectOptionEnum OptionEnum) { if (pszConnection == NULL) return FALSE; //如果打开则初始化 if(m_bSuccessState) { CloseAll(); } //初始化数据库连接 if(FAILED(m_ConPtr.CreateInstance(__uuidof(Connection)))) { return FALSE; } //示例: //_bstr_t strCnn("Provider=sqloledb;Data Source=MyServer;" //"Initial Catalog=pubs;User Id=sa;Password=;"); try { //以数据源方式连接数据库 m_ConPtr->Open(_bstr_t(pszConnection),_T(""),_T(""),OptionEnum); } catch(_com_error &er) { //进行异常捕捉 if( bDisplayException ) { DisplayADOException(er,true); } m_bSuccessState = FALSE; m_ConPtr.Release(); m_ConPtr = NULL; return FALSE; } m_sConnection = pszConnection; m_bSuccessState = TRUE; return TRUE; } BOOL CUIIImpADORXServer::InitADOServer(LPCTSTR pszDSN,LPCTSTR pszUserID,LPCTSTR pszPassword,ConnectModeEnum eMode,CursorTypeEnum eCursor) { if (pszDSN == NULL || pszUserID == NULL) return FALSE; if (pszPassword == NULL) pszPassword = _T(""); //如果打开则初始化 if(m_bSuccessState) { CloseAll(); } //初始化数据库连接 if(FAILED(m_ConPtr.CreateInstance(__uuidof(Connection)))) { return FALSE; } //示例: //_bstr_t strCnn("DSN=CAPP;UID=sa;PWD=" //定义连接描述 CString sXTCAPPDescr; sXTCAPPDescr.Format(_T("DSN=%s; UID=%s; PWD=%s"),pszDSN,pszUserID,pszPassword); m_ConPtr->Mode = eMode; try { //以数据源方式连接数据库 m_ConPtr->Open(_bstr_t(sXTCAPPDescr),_T(""),_T(""),eCursor); } catch(_com_error &er) { //进行异常捕捉 DisplayADOException(er); AfxMessageBox(er.ErrorMessage()); m_bSuccessState = FALSE; return FALSE; m_ConPtr.Release(); m_ConPtr = NULL; } m_sConnection = sXTCAPPDescr; m_bSuccessState = TRUE; return TRUE; } void CUIIImpADORXServer::AppendAssocDatabase(LPCTSTR pszKey,LPCTSTR pszAssocDb) { m_mapAssocDb.SetAt(pszKey,pszAssocDb); } BOOL CUIIImpADORXServer::AssocDatabase(LPCTSTR pszKey,CString& sAssocDb) { return m_mapAssocDb.Lookup(pszKey,sAssocDb); } BOOL CUIIImpADORXServer::IsSQLSrvTableExist(LPCTSTR pszTableName,LPCTSTR pszDbName) { CString sSQL; sSQL.Format(_T("SELECT name FROM %s.dbo.sysobjects WHERE name = '%s'"),pszDbName,pszTableName); CStringArray arValue; this->GetSelData(sSQL,arValue); if(arValue.GetSize() == 1) { return TRUE; } return FALSE; } BOOL CUIIImpADORXServer::CreateOLEDBTable(LPCTSTR pszTableName,Ttable& arFields,LPCTSTR pszDbName) { if (pszTableName == NULL) return FALSE; //1.先判断要创建的表是否存在[外部判断] CString strSQL,sTemp; int i; int nSize = (int)arFields.GetSize(); CUIITableField fieldInfo; CString keyStr = _T(""),sFormat; //创建标题明细数据库 if (pszDbName == NULL) { strSQL.Format(_T("CREATE TABLE %s ("),pszTableName); } else { strSQL.Format(_T("CREATE TABLE [%s].[dbo].[%s] ("),pszDbName,pszTableName); } for( i=0; i 0) { strSQL += sTemp; } sTemp = _T(""); } int nlen = strSQL.GetLength(); if(nlen > 0) { strSQL.SetAt(nlen - 1, _T(')')); } else { return FALSE; } BOOL bSuccess = FALSE; try { bSuccess = ExecuteSQL(strSQL); } catch(_com_error &er) { DisplayADOException(er); return bSuccess; } return bSuccess; } BOOL CUIIImpADORXServer::CreateSQLSrvTable(LPCTSTR pszTableName,Ttable &arFields,LPCTSTR pszDbName) { //1.先判断要创建的表是否存在 BOOL bIsExist = this->IsSQLSrvTableExist(pszTableName,pszDbName); if(bIsExist) { return FALSE; } return CreateOLEDBTable(pszTableName,arFields,pszDbName); } //获取表的结构信息 BOOL CUIIImpADORXServer::GetSQLSrvTableStru(LPCTSTR pszTableName,Ttable &arFields,LPCTSTR pszDbName) { CString sSQL,sName; if(pszDbName == NULL)//当前数据库 { sSQL.Format(_T("SELECT name, xtype, length FROM syscolumns WHERE id = ") _T("(SELECT id FROM sysobjects WHERE name = '%s') ORDER BY colid"),pszTableName); } else { sSQL.Format(_T("SELECT name, xtype, length FROM %s.dbo.syscolumns WHERE id = ") _T("(SELECT id FROM %s.dbo.sysobjects WHERE name = '%s') ORDER BY colid"),pszDbName,pszDbName,pszTableName); } CUIIValueTable table; this->GetSelData(sSQL,table); if(pszDbName == NULL) { sSQL = _T("SELECT xtype,name from systypes"); } else { sSQL.Format(_T("SELECT xtype,name from %s.dbo.systypes"),pszDbName); } CMapStringToString mapNametype; this->GetSelData(sSQL,mapNametype); int i = 0; CUIITableField field; CStringArray arValue; int nSize = table.GetTableLogicSize(); for(i = 0;i 0; } //获取表的结构信息 BOOL CUIIImpADORXServer::GetSQLSrvTableStru(LPCTSTR pszTableName,CStringList &listField,LPCTSTR pszDbName) { if (pszTableName == NULL) return FALSE; CString sSQL; if(pszDbName = NULL) { sSQL.Format(_T("SELECT name FROM syscolumns WHERE id = ") _T("(SELECT id FROM sysobjects WHERE name = '%s') ORDER BY colid"),pszTableName); } else { sSQL.Format(_T("SELECT name FROM %s.dbo.syscolumns WHERE id = ") _T("(SELECT id FROM %s.dbo.sysobjects WHERE name = '%s') ORDER BY colid"),pszDbName,pszDbName,pszTableName); } this->GetSelData(sSQL,listField); return TRUE; } //获取表的结构信息 BOOL CUIIImpADORXServer::GetTableStructInfoEx(LPCTSTR pszTableName,Ttable& arFields) { if (pszTableName == NULL) return FALSE; _bstr_t _bstr_Cnn = m_ConPtr->GetConnectionString(); _RecordsetPtr pRecord = NULL; HRESULT hr = pRecord.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) { return FALSE; } hr = pRecord->Open( _bstr_t(pszTableName), _bstr_Cnn, adOpenForwardOnly, adLockReadOnly, adCmdTable); if(FAILED(hr)) { return FALSE; } int nSize = pRecord->Fields->Count; CUIITableField strufield; FieldPtr pFld = NULL; int nLen = 0; CString sSQLType; for (short iIndex = 0; iIndex < nSize;iIndex++) { pFld = pRecord->Fields->GetItem(iIndex); strufield.m_sFieldName.Format(_T("%s"),(LPCTSTR)pFld->GetName()); strufield.m_sFieldType = GetFieldType(pFld->GetType()); strufield.m_nSize = (long)pFld->GetDefinedSize(); nLen = ConverToSQLType(strufield.m_sFieldType,strufield.m_nSize,sSQLType); strufield.m_sFieldType = sSQLType; strufield.m_nSize = nLen; arFields.Add(strufield); } return TRUE; } //类型: 字符型 : varchar 文本 : text 字节 : varbinary // ole型 : image 长整型: int 实数型: float // double型: real 短整型: smallint // 时间 : datetime int CUIIImpADORXServer::ConverToSQLType(LPCTSTR pszType,int nDefSize,CString& sSQLType) { if (pszType == NULL) return nDefSize; int nLen = 50; sSQLType = _T("varchar"); CString sType = pszType; if(sType.CompareNoCase(_T("adVarChar")) == 0) { sSQLType = _T("varchar"); return nDefSize; } else if(sType.CompareNoCase(_T("adLongVarChar")) == 0) { sSQLType = _T("text"); return 16; } else if(sType.CompareNoCase(_T("adVarbinary")) == 0) { sSQLType = _T("varbinary"); return 50; } else if(sType.CompareNoCase(_T("adLongVarBinary")) == 0) { sSQLType = _T("image"); return 16; } else if(sType.CompareNoCase(_T("adInteger")) == 0) { sSQLType = _T("int"); return 4; } else if(sType.CompareNoCase(_T("adDouble")) == 0) { sSQLType = _T("float"); return 8; } else if(sType.CompareNoCase(_T("adSingle")) == 0) { sSQLType = _T("real"); return 4; } else if(sType.CompareNoCase(_T("adSmallInt")) == 0) { sSQLType = _T("smallint"); return 2; } else if(sType.CompareNoCase(_T("adDBTimeStamp")) == 0) { sSQLType = _T("datetime"); return 8; } return nLen; } CString CUIIImpADORXServer::GetFieldType(int propType) { CString strMsg; switch(propType) { case adBigInt: strMsg = _T("adBigInt"); break; case adBinary: strMsg = _T("adBinary"); break; case adBoolean: strMsg = _T("adBoolean"); break; case adBSTR: strMsg = _T("adBSTR"); break; case adChapter: strMsg = _T("adChapter"); break; case adChar: strMsg = _T("adChar"); break; case adCurrency: strMsg = _T("adCurrency"); break; case adDate: strMsg = _T("adDate"); break; case adDBDate: strMsg = _T("adDBDate"); break; case adDBTime: strMsg = _T("adDBTime"); break; case adDBTimeStamp: strMsg = _T("adDBTimeStamp"); break; case adDecimal: strMsg = _T("adDecimal"); break; case adDouble: strMsg = _T("adDouble"); break; case adEmpty: strMsg = _T("adEmpty"); break; case adError: strMsg = _T("adError"); break; case adFileTime: strMsg = _T("adFileTime"); break; case adGUID: strMsg = _T("adGUID"); break; case adIDispatch: strMsg = _T("adIDispatch"); break; case adInteger: strMsg = _T("adInteger"); break; case adIUnknown: strMsg = _T("adIUnknown"); break; case adLongVarBinary: strMsg = _T("adLongVarBinary"); break; case adLongVarChar: strMsg = _T("adLongVarChar"); break; case adLongVarWChar: strMsg = _T("adLongVarWChar"); break; case adNumeric: strMsg = _T("adNumeric"); break; case adPropVariant: strMsg = _T("adPropVariant"); break; case adSingle: strMsg = _T("adSingle"); break; case adSmallInt: strMsg = _T("adSmallInt"); break; case adTinyInt: strMsg = _T("adTinyInt"); break; case adUnsignedBigInt: strMsg = _T("adUnsignedBigInt"); break; case adUnsignedInt: strMsg = _T("adUnsignedInt"); break; case adUnsignedSmallInt: strMsg = _T("adUnsignedSmallInt"); break; case adUnsignedTinyInt: strMsg = _T("adUnsignedTinyInt"); break; case adUserDefined: strMsg = _T("adUserDefined"); break; case adVarBinary: strMsg = _T("adVarBinary"); break; case adVarChar: strMsg = _T("adVarChar"); break; case adVariant: strMsg = _T("adVariant"); break; case adVarNumeric: strMsg = _T("adVarNumeric"); break; case adVarWChar: strMsg = _T("adVarWChar"); break; case adWChar: // Unicode: Leaving as char type strMsg = _T("adWChar"); break; default: strMsg = _T("*UNKNOWN*"); break; } return strMsg; } BOOL CUIIImpADORXServer::DeleteTable(LPCTSTR pszTableName) { if (pszTableName == NULL) return FALSE; CString strSQL; strSQL.Format(_T("DROP TABLE [%s]"),pszTableName); ExecuteSQL(strSQL); return TRUE; } BOOL CUIIImpADORXServer::DeleteTable(CStringArray &arTableNames) { int nSize = (int)arTableNames.GetSize(); int i; for(i = 0;iGetSelData(sSQL,arTables); } //获得数据库中所有的表名 void CUIIImpADORXServer::GetSQLSrvTableNames(CStringList &listTables,LPCTSTR pszDbName) { if (pszDbName == NULL) return; CString sSQL; sSQL.Format(_T("SELECT name FROM %s.dbo.sysobjects where xtype='U'"),pszDbName,pszDbName); this->GetSelData(sSQL,listTables); } //获得数据库中所有的表名 void CUIIImpADORXServer::GetOLDBTableNameList(CStringList &listTables,LPCTSTR pszTableType /*= _T("TABLE")*/) { CString sTableText,sTabType,sTableType; _RecordsetPtr pRstSchema = NULL; if (pszTableType == NULL) pszTableType = _T("TABLE"); //指定连接的数据库 if(m_ConPtr == NULL) { AfxMessageBox(_T("数据库未正常连接...")); return; } try { pRstSchema = m_ConPtr->OpenSchema(adSchemaTables); while(!(pRstSchema->EndOfFile)) { _bstr_t table_name = pRstSchema->Fields->GetItem(_T("TABLE_NAME"))->Value.bstrVal; _bstr_t table_type = pRstSchema->Fields->GetItem(_T("TABLE_TYPE"))->Value.bstrVal; sTableText.Format(_T("%s"),(LPCTSTR) table_name); sTabType.Format(_T("%s"),(LPCTSTR) table_type); if(sTabType.CompareNoCase(pszTableType) == 0) { sTableText.TrimRight(); listTables.AddTail(sTableText); } pRstSchema->MoveNext(); } pRstSchema->Close(); } catch (_com_error &er) { DisplayADOException(er); } } //获得数据库中所有的表名 void CUIIImpADORXServer::GetOLDBTableNameArray(CStringArray &arTables,LPCTSTR pszTableType /*= _T("TABLE")*/) { CString sTableText,sTabType; _RecordsetPtr pRstSchema = NULL; if (pszTableType == NULL) pszTableType = _T("TABLE"); //指定连接的数据库 if(m_ConPtr == NULL) { AfxMessageBox(_T("数据库未正常连接...")); return; } try { pRstSchema = m_ConPtr->OpenSchema(adSchemaTables); while(!(pRstSchema->EndOfFile)) { _bstr_t table_name = pRstSchema->Fields->GetItem(_T("TABLE_NAME"))->Value.bstrVal; _bstr_t table_type = pRstSchema->Fields->GetItem(_T("TABLE_TYPE"))->Value.bstrVal; sTableText.Format(_T("%s"),(LPCTSTR) table_name); sTabType.Format(_T("%s"),(LPCTSTR) table_type); if(sTabType.CompareNoCase(pszTableType) == 0) { sTableText.TrimRight(); arTables.Add(sTableText); } pRstSchema->MoveNext(); } pRstSchema->Close(); } catch (_com_error &er) { DisplayADOException(er); } } //获得数据库中所有的表名 void CUIIImpADORXServer::GetTableNameArray(CStringArray &arTables,LPCTSTR pszTableType) { CString sTableText,sTabType; _RecordsetPtr pRstSchema = NULL; if (pszTableType == NULL) pszTableType = _T("TABLE"); //指定连接的数据库 if(m_ConPtr == NULL) { AfxMessageBox(_T("数据库未正常连接...")); return; } try { pRstSchema = m_ConPtr->OpenSchema(adSchemaTables); while(!(pRstSchema->EndOfFile)) { _bstr_t table_name = pRstSchema->Fields->GetItem(_T("TABLE_NAME"))->Value.bstrVal; _bstr_t table_type = pRstSchema->Fields->GetItem(_T("TABLE_TYPE"))->Value.bstrVal; sTableText.Format(_T("%s"),(LPCTSTR) table_name); sTabType.Format(_T("%s"),(LPCTSTR) table_type); if(sTabType.CompareNoCase(pszTableType) == 0) { sTableText.TrimRight(); arTables.Add(sTableText); } pRstSchema->MoveNext(); } pRstSchema->Close(); } catch (_com_error &er) { DisplayADOException(er); } } BOOL CUIIImpADORXServer::ExecuteSQL(LPCTSTR pstrSQL) { //命令智能接口指针 _CommandPtr pCommand(_T("ADODB.Command")); //选择集智能接口指针 _RecordsetPtr rs; //指定连接的数据库 if(m_ConPtr == NULL) { AfxMessageBox(_T("数据库未正常连接...")); return FALSE; } pCommand->ActiveConnection = m_ConPtr; pCommand->CommandText = _bstr_t(pstrSQL); pCommand->CommandType = adCmdText; CString sEr; //执行并返回选择集 try { //执行SQL语句 rs = pCommand->Execute(NULL, NULL, adCmdUnknown); } catch(_com_error &er) { DisplayADOException(er); #ifdef _DEBUG sEr.Format(_T("执行出错的SQL语句: %s\n") ,pstrSQL); AfxMessageBox(sEr); #endif return FALSE; } return TRUE; } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CString& sValue) { if (psztrSQL == NULL) return -1; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; long lNumFields = 0l,lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; int nRows = 0; if (pRec->EndOfFile != -1) { if(lNumFields > 0) { CUIIVariantUtility::Variant2String(pRec->GetFields()->GetItem(lIndex)->GetValue(),sValue); return 1; } } } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } BOOL CUIIImpADORXServer::IsSelEmpty(LPCTSTR pszStrSQL) { if (pszStrSQL == NULL ) return FALSE; _bstr_t strSQLAdo(pszStrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo,NULL, adCmdText); if (pRec == NULL || pRec->EndOfFile == -1) { return TRUE; } return FALSE; } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CStringArray &arStrValue) { if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo,NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l,lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; int nRows = 0; while (!pRec->EndOfFile) { for(lIndex = 0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); arStrValue.Add(sText); } pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CStringArray &arStrValue,int nFr,int nTo) { if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo,NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l,lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; int nRows = 0; pRec->Move(nFr); while (!pRec->EndOfFile) { for(lIndex=0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); arStrValue.Add(sText); } if (nRows >= (nTo - nFr)) break; pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL, std::vector& arStrValue) { if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l, lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if (FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if (FAILED(hr)) return -1; int nRows = 0; while (!pRec->EndOfFile) { for (lIndex = 0; lIndex < lNumFields; lIndex++) { CUIIVariantUtility::Variant2String(pRec->GetFields()->GetItem(lIndex)->GetValue(), sText); arStrValue.push_back(sText); } pRec->MoveNext(); nRows++; } return nRows; } catch (_com_error& er) { DisplayADOException(er); return -1; } return -1; } //把获得相应的信息填到链表中 int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CStringList &listStrValue,BOOL bMakeLower) { if (psztrSQL == NULL ) return -1; try { CStringArray arStrValue; int nResult = GetSelData(psztrSQL,arStrValue); if(nResult > -1) { CString sText; int nSize = (int)arStrValue.GetSize(); int i; for(i = 0;i -1) { CString sText; int nSize = (int)arStrValue.GetSize(); int i; for(i = 0;iExecute(strSQLAdo, NULL, adCmdText); if (pRec == NULL ) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l,lIndex = 0l,i = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; CStringArray arStrValue,arLable; for( i=0; iGetFields()->GetItem(i)->GetName(),sText); arLable.Add(sText); } //设置标题记录 if(bUpdateLable) { valueTable.SetLableRecord(arLable); } int nRows = 0; while (!pRec->EndOfFile) { arStrValue.RemoveAll(); for(lIndex = 0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); arStrValue.Add(sText); } valueTable.AddValueRecord(arStrValue); pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CUIIValueTable &valueTable,int nFr,int nTo,BOOL bUpdateLable) { if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL ) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l,lIndex = 0l,i = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; CStringArray arStrValue,arLable; for( i=0; iGetFields()->GetItem(i)->GetName(),sText); arLable.Add(sText); } //设置标题记录 if(bUpdateLable) { valueTable.SetLableRecord(arLable); } int nRows = 0; pRec->Move(nFr); while (!pRec->EndOfFile) { arStrValue.RemoveAll(); for(lIndex=0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); arStrValue.Add(sText); } valueTable.AddValueRecord(arStrValue); if (nRows >= (nTo - nFr)) break; pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } //选取两列,一个为Key,一个为Value建map int CUIIImpADORXServer::GetSelData(LPCTSTR pszKey_ValueSQL,CMapStringToString &mapKey_Value) { if (pszKey_ValueSQL == NULL) return -1; try { _bstr_t strSQLAdo(pszKey_ValueSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sKey,sText,sValue; long lNumFields = 0l,lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; if(lNumFields < 2) return -1; int nRows = 0; while (!pRec->EndOfFile) { for(lIndex = 0;lIndex<2;lIndex++) { CUIIVariantUtility::Variant2String(pRec->GetFields()->GetItem(lIndex)->GetValue(),sText); if(lIndex == 0) { sKey = sText; } else { sValue = sText; } mapKey_Value.SetAt(sKey,sValue); } pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } int CUIIImpADORXServer::GetSelData(LPCTSTR pszKey_ValueSQL, std::map& mapKey_Value) { if (pszKey_ValueSQL == NULL) return -1; try { _bstr_t strSQLAdo(pszKey_ValueSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sKey, sText, sValue; long lNumFields = 0l, lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if (FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if (FAILED(hr)) return -1; if (lNumFields < 2) return -1; int nRows = 0; while (!pRec->EndOfFile) { for (lIndex = 0; lIndex < 2; lIndex++) { CUIIVariantUtility::Variant2String(pRec->GetFields()->GetItem(lIndex)->GetValue(), sText); if (lIndex == 0) { sKey = sText; } else { sValue = sText; } mapKey_Value.insert(std::make_pair(sKey, sValue)); } pRec->MoveNext(); nRows++; } return nRows; } catch (_com_error &er) { DisplayADOException(er); return -1; } return -1; } //选取一行,获得Field到对应数据的映射 int CUIIImpADORXServer::GetSelDataEx(LPCTSTR pszSelectSQL,CMapStringToString &mapFieldToValue) { if (pszSelectSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(pszSelectSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sKey,sText,sValue; long lNumFields = 0l,lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; if(lNumFields < 2) return -1; int nRows = 0; if(!pRec->EndOfFile) { for(lIndex = 0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); CUIIVariantUtility::bstr_t2String(pRec->GetFields()->GetItem(lIndex)->GetName(),sKey); mapFieldToValue.SetAt(sKey,sText); } nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return -1; } int CUIIImpADORXServer::GetSelDataEx(LPCTSTR psztrSQL, std::vector>& datas) { datas.clear(); if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL ) { return -1; } FieldsPtr pFields; CString sText; long lNumFields = 0l,lIndex = 0l,i = 0l; HRESULT hr = pRec->get_Fields(&pFields); if(FAILED(hr)) return -1; //列 hr = pFields->get_Count(&lNumFields); if(FAILED(hr)) return -1; int nRows = 0; while (!pRec->EndOfFile) { datas.push_back(std::vector()); for(lIndex = 0;lIndexGetFields()->GetItem(lIndex)->GetValue(),sText); datas.rbegin()->push_back( sText ); } pRec->MoveNext(); nRows ++; } return nRows; } catch(_com_error &er) { DisplayADOException(er); return -1; } return (int)datas.size(); } int CUIIImpADORXServer::GetSelDataEx(LPCTSTR psztrSQL, std::vector> &datas) { datas.clear(); if (psztrSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(psztrSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sText, sKey; long lNumFields = 0l, lIndex = 0l, i = 0l; HRESULT hr = pRec->get_Fields(&pFields); if (FAILED(hr)) return -1; //列 hr = pFields->get_Count(&lNumFields); if (FAILED(hr)) return -1; int nRows = 0; while (!pRec->EndOfFile) { datas.push_back(std::map()); for (lIndex = 0; lIndexGetFields()->GetItem(lIndex)->GetValue(), sText); CUIIVariantUtility::bstr_t2String(pRec->GetFields()->GetItem(lIndex)->GetName(), sKey); datas.rbegin()->insert(std::make_pair(sKey, sText)); } pRec->MoveNext(); nRows++; } return nRows; } catch (_com_error &er) { DisplayADOException(er); return -1; } return (int)datas.size(); } int CUIIImpADORXServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::map& mapFieldToValue) { if (pszSelectSQL == NULL) return FALSE; try { _bstr_t strSQLAdo(pszSelectSQL); _RecordsetPtr pRec = m_ConPtr->Execute(strSQLAdo, NULL, adCmdText); if (pRec == NULL) { return -1; } FieldsPtr pFields; CString sKey, sText, sValue; long lNumFields = 0l, lIndex = 0l; HRESULT hr = pRec->get_Fields(&pFields); if (FAILED(hr)) return -1; hr = pFields->get_Count(&lNumFields); if (FAILED(hr)) return -1; if (lNumFields < 2) return -1; int nRows = 0; if (!pRec->EndOfFile) { for (lIndex = 0; lIndex < lNumFields; lIndex++) { CUIIVariantUtility::Variant2String(pRec->GetFields()->GetItem(lIndex)->GetValue(), sText); CUIIVariantUtility::bstr_t2String(pRec->GetFields()->GetItem(lIndex)->GetName(), sKey); mapFieldToValue.insert(std::make_pair(sKey, sText)); } nRows++; } return nRows; } catch (_com_error &er) { DisplayADOException(er); return -1; } return -1; } void CUIIImpADORXServer::CloseAll() { if(m_ConPtr != NULL) { try { m_ConPtr->Close(); ::CoUninitialize(); } catch(_com_error &er) { DisplayADOException(er); } m_bSuccessState = FALSE; m_ConPtr = NULL; } } BOOL CUIIImpADORXServer::IsDatabaseOpen() { return m_bSuccessState; } _ConnectionPtr CUIIImpADORXServer::GetConnectionPtr() { return m_ConPtr; } void CUIIImpADORXServer::FromConnectionPtr(_ConnectionPtr pConPtr) { if(m_ConPtr != NULL && m_bSuccessState) { m_ConPtr->Close(); m_ConPtr = NULL; } m_ConPtr = pConPtr; m_bSuccessState = TRUE; } void CUIIImpADORXServer::DisplayADOException(_com_error &e,bool bDisplay) { _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); CString sError; sError.Format(_T("Error:\n") _T("\tCode = %08lx\n") _T("\tCode meaning = %s\n") _T("\tSource = %s\n") _T("\tDescription = %s\n"), e.Error(), e.ErrorMessage(), (LPCTSTR) bstrSource, (LPCTSTR) bstrDescription); if (bDisplay) { AfxMessageBox(sError); } } int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,_variant_t &vResults,long &lAdoRow,long &lAdoCol) { if (psztrSQL == NULL) return -1; try { _RecordsetPtr rs(_T("ADODB.Recordset")); //rs.CreateInstance(__uuidof(Recordset)); _bstr_t strSQLAdo(psztrSQL); try { rs->Open(strSQLAdo, m_ConPtr.GetInterfacePtr(), adOpenForwardOnly,adLockReadOnly, adCmdText); if(rs->EndOfFile == -1 || rs->BOF) { return 0; } vResults=rs->GetRows(adGetRowsRest); } catch(_com_error &er) { DisplayADOException(er); return -1; } SafeArrayGetUBound(vResults.parray,2,&lAdoRow); SafeArrayGetUBound(vResults.parray,1,&lAdoCol); lAdoRow++; lAdoCol++; rs->Close(); } catch(_com_error &er) { DisplayADOException(er); return -1; } return 1; }