Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1780 lines
38 KiB
C++

#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<nSize; i++ )
{
fieldInfo = arFields.GetAt(i);
if( fieldInfo.m_sFieldType == _T("nvarchar") ||
fieldInfo.m_sFieldType == _T("varchar"))
{
sFormat = _T("[%s] %s (%d) ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType, fieldInfo.m_nSize);
}
else if(fieldInfo.m_sFieldType == _T("char") )
{
sFormat = _T("[%s] %s (%d) ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType, fieldInfo.m_nSize);
}
else if(fieldInfo.m_sFieldType.CompareNoCase(_T("int")) == 0 ||
fieldInfo.m_sFieldType.CompareNoCase(_T("smallint")) == 0)
{
sFormat = _T("[%s] int ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
//sFormat += _T("NOT NULL,");
sFormat += _T("IDENTITY (1,1) PRIMARY KEY NOT NULL,");//标识递增1
//sFormat += _T("IDENTITY (1,1) NOT NULL,");//标识递增1
//sFormat += _T("PRIMARY KEY NOT NULL,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if( fieldInfo.m_sFieldType == _T("float") )
{
sFormat = _T("[%s] float ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("image"))
{
sFormat = _T("[%s] image NULL,");
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("binary"))
{
sFormat = _T("[%s] binary (%d) NULL,");
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_nSize);
}
else if(fieldInfo.m_sFieldType == _T("datetime"))
{
sFormat = _T("[%s] datetime DEFAULT GETDATE(),");
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("text") ||
fieldInfo.m_sFieldType == _T("ntext"))
{
sFormat = _T("[%s] %s NULL,");
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType);
}
else if(fieldInfo.m_sFieldType == _T("real") ||
fieldInfo.m_sFieldType == _T("double") )
{
sFormat = _T("[%s] real ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
if(sTemp.GetLength() > 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<nSize;i++)
{
arValue.RemoveAll();
table.GetValueRecord(i,arValue);
if(arValue.GetSize() == 3)
{
field.m_sFieldName = arValue.GetAt(0);
field.m_sFieldName.TrimLeft(_T('['));
field.m_sFieldName.TrimRight(_T(']'));
mapNametype.Lookup(arValue.GetAt(1),sName);
field.m_sFieldType = sName;
field.m_nSize = _ttoi(arValue.GetAt(2));
arFields.Add(field);
}
}
return arFields.GetSize() > 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;i<nSize;i++)
{
DeleteTable(arTableNames.GetAt(i));
}
return TRUE;
}
BOOL CUIIImpADORXServer::DeleteTableFields(LPCTSTR pszTableName,CStringArray &arFields,LPCTSTR pszDbName)
{
if (pszTableName == NULL) return FALSE;
int nSize = (int)arFields.GetSize();
int i;
for(i = 0;i<nSize;i++)
{
DeleteTableFields(pszTableName,arFields.GetAt(i),pszDbName);
}
return TRUE;
}
BOOL CUIIImpADORXServer::DeleteTableFields(LPCTSTR pszTableName,LPCTSTR pszFields,LPCTSTR pszDbName)
{
if (pszTableName == NULL ||
pszFields == NULL ||
pszDbName == NULL)
return FALSE;
CString strSQL;
strSQL.Format(_T("ALTER TABLE [%s.dbo.%s] DROP COLUMN [%s]"),pszDbName,pszTableName,pszFields);
ExecuteSQL(strSQL);
return TRUE;
}
BOOL CUIIImpADORXServer::AppendTableFields(LPCTSTR pszTableName,Ttable &arFields,LPCTSTR pszDbName)
{
if (pszTableName == NULL) return FALSE;
int nSize = (int)arFields.GetSize();
int i;
for(i = 0;i<nSize;i++)
{
AppendTableFields(pszTableName,arFields.GetAt(i),pszDbName);
}
return TRUE;
}
BOOL CUIIImpADORXServer::AppendTableFields(LPCTSTR pszTableName, CUIITableField& arFields,LPCTSTR pszDbName)
{
if (pszTableName == NULL) return FALSE;
CString strSQL,sFieldType;
sFieldType = arFields.m_sFieldType;
if(sFieldType.CompareNoCase(_T("varchar")) == 0 ||
sFieldType.CompareNoCase(_T("nvarchar")) == 0)
{
strSQL.Format(_T("ALTER TABLE [%s.dbo.%s] ADD [%s] %s(%d)"),pszDbName,pszTableName,arFields.m_sFieldName,
arFields.m_sFieldType,arFields.m_nSize);
}
else
{
strSQL.Format(_T("ALTER TABLE [%s.dbo.%s] ADD [%s] %s"),pszDbName,pszTableName,arFields.m_sFieldName,
arFields.m_sFieldType);
}
ExecuteSQL(strSQL);
return TRUE;
}
//获得数据库中所有的表名
void CUIIImpADORXServer::GetSQLSrvTableNames(CStringArray &arTables,LPCTSTR pszDbName)
{
if (pszDbName == NULL) return;
CString sSQL;
sSQL.Format(_T("SELECT name FROM %s.dbo.sysobjects where xtype='U'"),pszDbName);
this->GetSelData(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;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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<CString>& 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<nSize;i++)
{
sText = arStrValue.GetAt(i);
//小写
if(bMakeLower)
{
sText.MakeLower();
}
listStrValue.AddTail(sText);
}
return nSize;
}
}
catch(_com_error &er)
{
DisplayADOException(er);
return -1;
}
return -1;
}
int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CStringList &listStrValue,int nFr,int nTo,BOOL bMakeLower)
{
if (psztrSQL == NULL ) return -1;
try
{
CStringArray arStrValue;
int nResult = GetSelData(psztrSQL,arStrValue,nFr,nTo);
if(nResult > -1)
{
CString sText;
int nSize = (int)arStrValue.GetSize();
int i;
for(i = 0;i<nSize;i++)
{
sText = arStrValue.GetAt(i);
//小写
if(bMakeLower)
{
sText.MakeLower();
}
listStrValue.AddTail(sText);
}
return nSize;
}
}
catch(_com_error &er)
{
DisplayADOException(er);
return -1;
}
return -1;
}
int CUIIImpADORXServer::GetSelData(LPCTSTR psztrSQL,CUIIValueTable &valueTable,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; i<lNumFields; i++ )
{
CUIIVariantUtility::bstr_t2String(pRec->GetFields()->GetItem(i)->GetName(),sText);
arLable.Add(sText);
}
//设置标题记录
if(bUpdateLable)
{
valueTable.SetLableRecord(arLable);
}
int nRows = 0;
while (!pRec->EndOfFile)
{
arStrValue.RemoveAll();
for(lIndex = 0;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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; i<lNumFields; i++ )
{
CUIIVariantUtility::bstr_t2String(pRec->GetFields()->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;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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<CString, CString>& 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;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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<std::vector<CString>>& 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<CString>());
for(lIndex = 0;lIndex<lNumFields;lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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<std::map<CString, CString>> &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<CString, CString>());
for (lIndex = 0; lIndex<lNumFields; lIndex++)
{
CUIIVariantUtility::Variant2String(pRec->GetFields()->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<CString, CString>& 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;
}