⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adooperation.cpp

📁 VC++和ACCESS使用ADO连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return TRUE;
}

/*********************************************************************
函数说明:	   读取当前记录指定域的值,并返回该值
函数参数:	   字段名 、 数据类型 、 指向返回值的指针
*********************************************************************/
BOOL CADOOperation::GetItemContentStr(CString strField, DWORD dwType, void *Variable)
{
	ASSERT(!strField.IsEmpty());	// 字段名不能为空
	_variant_t variant;
	try
	{
		if (dwType != ADO_TYPE_BITMAP_HANDLE && dwType != ADO_TYPE_TEXT)
		{
			variant = GetSubItemField(strField);			// 读出指定字段的值
			ChangeTypeTo(variant, dwType, Variable, 0);		// 转换为需要的类型
			return TRUE;
		}

		// 位图类型的文件类型的处理方式与其他类型不同,要注意
		if (dwType == ADO_TYPE_BITMAP_HANDLE || dwType == ADO_TYPE_TEXT)
		{
			long lBits;

			lBits = m_pRecordset->GetFields()->GetItem(_bstr_t(strField))->ActualSize;	// 得到内容大小
			if (lBits <= 0)
			{
				return TRUE;
			}
			variant = m_pRecordset->GetFields()->GetItem(_bstr_t(strField))->GetChunk(lBits);	// 读出内容
			ChangeTypeTo(variant, dwType, Variable, lBits);
		}
	}
	catch (_com_error e)
	{
		ShowError(e.Description());
		return FALSE;
	}

	return TRUE;
}

/*********************************************************************
函数说明:	  添加 
函数参数:	  void
*********************************************************************/
HRESULT CADOOperation::AddNew()
{
	return m_pRecordset->AddNew();
}

/*********************************************************************
函数说明:	   更新
函数参数:	   void
*********************************************************************/
BOOL CADOOperation::UpdateData()
{
	try
	{
		  m_pRecordset->Update();
	}
	catch(_com_error e)
	{
		ShowError(e.Description());
		return FALSE;
	}

	return  TRUE;
}

/*********************************************************************
函数说明:	   关闭由 OpenRecordset 结果记录集
函数参数:	   void
*********************************************************************/
void CADOOperation::CloseRecorset()
{
	try
	{
		if(adStateOpen == m_pRecordset->GetState())
		{
			m_pRecordset->Close();
		}
	}
	catch(_com_error e)
	{
		return ;
	}
}

/*********************************************************************
函数说明:	   判断是否有数据
函数参数:	   void
*********************************************************************/
BOOL CADOOperation::IsLastRow()
{
	if(m_pRecordset->adoEOF)
	{
		return TRUE;
	}
	
	return FALSE;
}


/*********************************************************************
函数说明:	   
函数参数:	   
*********************************************************************/
BOOL CADOOperation::ExportToWord(CString &strFile)
{
	Fields *fields = NULL;
	long   lCount = 0;					// 表头元素个数

	m_pRecordset->get_Fields(&fields);
	lCount = fields->Count;				// 得到表头元素个数
	
	// 以下为 word 应用对象的初始化过程
	_Application_Word application;	// 创建一个 Word 应用对象
	_Document_Word	  document;		// 文档对象
	Documents_Word	  documents;		// 文档集对象
	Tables_Word		  tables;
	Range_Word		  range;
	_Document_Word	  saveDoc;
	Selection_Word	  selection;
	COleVariant       colevariant;

	// 关键部分
	CComVariant FileFormat(0);
	CComVariant LockComments(FALSE);
	CComVariant Password(_T(""));

	CComVariant AddToRecentFiles(true);
	CComVariant WritePassword("");

	CComVariant ReadOnlyRecommended(false);
	CComVariant EmbedTrueTypeFonts(false);

	CComVariant SaveNativePictureFormat(false);
	CComVariant SaveFormsData(false);

	CComVariant SaveAsAOCELetter(false);
	
	CComVariant FileName("");		//保存的位置	

	CComVariant Template(_T(""));
	CComVariant NewTemplate(false);
	CComVariant DocumentType(0);
	CComVariant Visible(true);

	application.CreateDispatch("Word.Application");
	documents.AttachDispatch(application.GetDocuments());
	document.AttachDispatch(documents.Add(&Template,	//无模板
										  &NewTemplate,	//不是新建模板
										  &DocumentType,//无类型
										  &Visible));	//初始不可见

	range.AttachDispatch(document.GetContent());		// 把边界附加到文档中
	tables.AttachDispatch(document.GetTables());		// 把表类附加到文档中

	tables.Add(range, GetRecordCount(),					//记录数
				lCount, colevariant, colevariant);		//添加表格

	selection.AttachDispatch(application.GetSelection());	// 把光标附加到应用程序上

	CString strText;
	BSTR bstr;

	_variant_t varField[20];
	for(long num = 0; num < lCount; num++)
	{
		strText.Format("%d", num);
		(fields->Item[(long)num])->get_Name(&bstr);		// 得到字段名
		varField[num] = bstr;
		
		selection.TypeText((char*)(_bstr_t)bstr);		//插入数据
		// 向右移动一个位置
		selection.MoveRight((COleVariant)"1", (COleVariant)"1", (COleVariant)"0");		
	}

	if(!m_pRecordset->adoBOF)		// 判断当前数据表是否有数据
	{
		m_pRecordset->MoveFirst();
	}
	else
	{
		goto end;
	}

	while(!m_pRecordset->adoEOF)
	{
		for(long num = 0; num < (m_pRecordset->GetFields())->GetCount(); num++)
		{
			strText.Format("%d", num);
			//把对应表头的相关信息输入到Word的表中
			selection.TypeText((char *)(_bstr_t)m_pRecordset->GetCollect(varField[num]));	
			selection.MoveRight((COleVariant)"1", (COleVariant)"1", (COleVariant)"0");	//移动光标
		}
		m_pRecordset->MoveNext();
	}
	
	//保存代码,以下为向 Word 写数据的过程
	saveDoc = application.GetActiveDocument();	//得到ActiveDocument	
	if(strFile.IsEmpty())
	{
		FileName = GetProgramPath();
		// FileName = "C:\\DataBaseTable.doc";		// 默认的保存位置
	}
	else
	{
		FileName = strFile;
	}
	
	saveDoc.SaveAs(&FileName, &FileFormat, &LockComments, &Password, 
				   &AddToRecentFiles, &WritePassword, &ReadOnlyRecommended, 
				   &EmbedTrueTypeFonts, &SaveNativePictureFormat, 
				   &SaveFormsData,&SaveAsAOCELetter);	
	
	//设置Word窗口可见并释放应用程序的资源
	application.SetVisible(TRUE);
	
end:
	tables.ReleaseDispatch();
	selection.ReleaseDispatch();
	documents.ReleaseDispatch();
	document.ReleaseDispatch();
	application.ReleaseDispatch();
	return TRUE;
}

/*********************************************************************
函数说明:	   
函数参数:	   
*********************************************************************/
DWORD CADOOperation::GetRecordCount()
{
	DWORD dwCount = 1;
	if (m_pRecordset->adoEOF)
	{
		return 0;
	}
	
	m_pRecordset->MoveFirst();
	do
	{
		dwCount++;
		m_pRecordset->MoveNext();
	}
	while (!m_pRecordset->adoEOF);
	
	return dwCount;
}

/*********************************************************************
函数说明:	   当前所选记录集在表里的位置
函数参数:	   通过编号和身份证号来确定
*********************************************************************/
DWORD CADOOperation::GetCurrentRecordIndex(int nID, CString strIDCard)
{
	DWORD dwCurIndex = 1;
	try
	{
		_variant_t RecordsAffected;
        m_pRecordset =m_pConnection->Execute("SELECT * FROM Employee_BasicInfor_Table",
			&RecordsAffected, adCmdText);

		m_pRecordset->MoveFirst();
        long lID = (long)nID;
		_variant_t vCount;

		while(!m_pRecordset->adoEOF)
		{
			vCount = m_pRecordset->GetCollect("employee_ID");
			long lIDCom = vCount.lVal;

			vCount = m_pRecordset->GetCollect("employee_IDCard");
			CString strIDCardCom =(LPCSTR)_bstr_t(vCount);

			if(nID == lID && strIDCard == strIDCardCom)
			{
				return dwCurIndex;
			}
			dwCurIndex++;
            m_pRecordset->MoveNext();
		}
        m_pRecordset->MoveFirst();
		return 0;
	}
	catch(_com_error e)
	{
		ShowError(e.Description());
		return FALSE;
	}
}

/*********************************************************************
函数说明:	   移动到第一条记录
函数参数:	   void
*********************************************************************/
HRESULT CADOOperation::MoveFirst()
{
	return m_pRecordset->MoveFirst();
}

/*********************************************************************
函数说明:	   移动到下一条
函数参数:	   void
*********************************************************************/
HRESULT CADOOperation::MoveNext()
{
	return m_pRecordset->MoveNext();
}

/*********************************************************************
函数说明:	   移动到最后一条记录
函数参数:	   
*********************************************************************/
HRESULT CADOOperation::MoveLast()
{
	return m_pRecordset->MoveLast();
}

/*********************************************************************
函数说明:	   
函数参数:	   
*********************************************************************/
BOOL CADOOperation::MoveTo(DWORD dwIndex)
{
	try
	{
		m_pRecordset->Move(dwIndex);
		m_CurrentRecord = dwIndex;
	}
	catch (_com_error e)
	{
		ShowError(e.Description());
		return FALSE;
	}

	return TRUE;	
}


/*********************************************************************
函数说明:	   
函数参数:	   
*********************************************************************/
void CADOOperation::SetClientDC(HDC hDC)
{
	m_hDC = hDC;
}

/*********************************************************************
函数说明:	   获得程序所在绝对路径
函数参数:	   
*********************************************************************/
CString CADOOperation::GetProgramPath()
{
	CString sPath;
	CString strFile;
	int nPos = 0;

	GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	sPath.ReleaseBuffer ();	
	nPos=sPath.ReverseFind ('\\');
	sPath=sPath.Left (nPos);
	strFile = sPath + "\\人事管理导出报表.doc";

	return strFile;
}

/*********************************************************************
函数说明:	   获取当前最大的编号
函数参数:	   
*********************************************************************/
int CADOOperation::GetMaxID()
{
	_variant_t RecordsAffected;
	m_pRecordset = m_pConnection->Execute("SELECT MAX(employee_ID) FROM Employee_BasicInfor_Table", 
		&RecordsAffected, adCmdText);
	_variant_t vIndex = (long)0;
	_variant_t vCount = m_pRecordset->GetCollect(vIndex);

	return vCount.lVal;
}

/*********************************************************************
函数说明:	   获取记录集 指定字段的值,当 bGetAll 为 TRUE 时,strFields 参数无效
函数参数:	   指定的字段集、字段个数、返回的字段值集合、是否获取全部字段
*********************************************************************/
void CADOOperation::GetFieldsValue(CString strFields[], int nLen, CString strRetValue[], BOOL bGetAll)
{
	_variant_t varIndex; 
	_variant_t strVal; 
	CString strInfo;

	if (m_pRecordset->adoEOF)			// 判断当前是否有记录,没有则返回
	{
		return;
	}

	if (bGetAll)	// 全部查询
	{
		for (int j = 0; j < nLen; j++)
		{
			varIndex = _variant_t((long)(j)); 
			strVal= m_pRecordset->GetCollect(&varIndex); 
			strInfo.Format("%s", (const char *)_bstr_t(strVal)); 
			strRetValue[j] = strInfo;
		}		
	}
	else
	{
		for (int j = 0; j < nLen; j++)
		{
			strRetValue[j] = (const char *)_bstr_t(m_pRecordset->GetCollect(_variant_t(strFields[j])));		
		}
	}	
}

/*********************************************************************
函数说明:	   获取记录集 指定字段的值
函数参数:	   
*********************************************************************/
void CADOOperation::GetFieldsToShow(CString strFields[], int nLen, CListCtrl* CListShow)
{
	int i = 0;
	CListShow->DeleteAllItems();
	if (m_pRecordset->adoEOF)			
	{
		return;
	}

	do 
	{		
		for (int j = 0; j < nLen; j++)
		{
			CString *strTemp = new CString[nLen];
			strTemp[j] = (const char *)_bstr_t(m_pRecordset->GetCollect(_variant_t(strFields[j])));
			if (j == 0)
			{
				CListShow->InsertItem(i, strTemp[j]);
			}
			else
			{
				CListShow->SetItemText(i, j, strTemp[j]);
			}
		}
		m_pRecordset->MoveNext();		
		i++;
	} 
	while (!m_pRecordset->adoEOF);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -