Ado 实现C对象的存取_第1页
Ado 实现C对象的存取_第2页
Ado 实现C对象的存取_第3页
Ado 实现C对象的存取_第4页
Ado 实现C对象的存取_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Ado 实现C+对象的存取作者:江上飞鸟下载源代码其实我最讨厌写东西了,最近忙死了,呵呵,前一段时间在做一个图形程序时,需要把C+对象保存到数据库里,刚开始真让我头疼啊,琢磨了一个下午,终于给做出来了,废话不说了,还是把自己的一些体会与各位同任一起分享!一、新建一个继承于 CObject 的子类 CLine;头文件:Line.h class CLine : public CObject?private :LOGPEN m_logPen; /画笔COLORREF m_crBackColor;CArray<CPoint, CPoint &> m_PointArray; /标记类

2、对应框public:int GetSize();CPoint GetPoint(int pos);void DrawLine(CDC *pDC,CPoint pt1,CPoint pt2,CRect rc);void DrawBackGround(CDC *pDC,CRect rect);void DrawPoint(CDC *pDC, CRect rect);void SetWidth(int iWidth);COLORREF GetColor();void SetColor(COLORREF color);COLORREF GetBkColor();void SetBkColor(COLO

3、RREF color);void AddPoint(CPoint point);void Clear();CLine();virtual CLine();virtual void Serialize(CArchive &ar);CLine& operator=(CLine &src);DECLARE_SERIAL(CLine)?; 实现文件:Line.cpp / Line.cpp: implementation of the CLine class./#include "stdafx.h"#include "TestAdo.h"#

4、include "Line.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifIMPLEMENT_SERIAL(CLine,CObject,1)CLine:CLine()Clear();CLine:CLine()/重写 =CLine& CLine:operator=(CLine &src)if(this!=&src)m_logPen = src.m_logPen;m_crBackColor = src.m_crBackColor

5、;return *this;?/串行化操作void CLine:Serialize(CArchive &ar)if (ar.IsStoring()ar << DWORD(m_crBackColor);ar.Write(&m_logPen, sizeof(LOGPEN);elseDWORD dw;ar >> dw; m_crBackColor = COLORREF(dw);ar.Read(&m_logPen, sizeof(LOGPEN);m_PointArray.Serialize(ar);void CLine:Clear()m_crBackCo

6、lor = RGB(255,255,255);m_logPen.lopnStyle = PS_SOLID;m_logPen.lopnColor = RGB(0, 0, 0);m_PointArray.RemoveAll();void CLine:AddPoint(CPoint point)m_PointArray.Add(point);void CLine:SetColor(COLORREF color)m_logPen.lopnColor = color;COLORREF CLine:GetColor()return m_logPen.lopnColor;void CLine:SetBkCo

7、lor(COLORREF color)m_crBackColor = color;COLORREF CLine:GetBkColor()return m_crBackColor;void CLine:SetWidth(int iWidth)/绘线条void CLine:DrawPoint(CDC *pDC, CRect rect)int len = m_PointArray.GetSize();if (len <=0) return;CPen pen;pen.CreatePenIndirect(&m_logPen);CPen *pOldPen = pDC->SelectOb

8、ject(&pen);CPoint pt = m_PointArray.GetAt(0);pDC->MoveTo(pt);for (int i=1; i< len; i+)pt = m_PointArray.GetAt(i);pDC->LineTo(pt);pDC->SelectObject(pOldPen);pOldPen = NULL;pen.DeleteObject();void CLine:DrawBackGround(CDC *pDC, CRect rect)CBrush brushCtl;brushCtl.CreateSolidBrush(GetBk

9、Color();pDC->Rectangle(rect);pDC->FillRect(rect,&brushCtl) ;brushCtl.DeleteObject();void CLine:DrawLine(CDC *pDC,CPoint pt1, CPoint pt2, CRect rc)CPen pen;pen.CreatePenIndirect(&m_logPen);CPen *pOldPen = pDC->SelectObject(&pen);pDC->MoveTo(pt1);pDC->LineTo(pt2);pDC->Sel

10、ectObject(pOldPen);pOldPen = NULL;pen.DeleteObject();CPoint CLine:GetPoint(int pos)if (pos>=0 && pos<m_PointArray.GetSize()?return m_PointArray.GetAt(pos);return CPoint(0,0);int CLine:GetSize()return m_PointArray.GetSize(); 二、用Ado接口打开数据库BOOL CTestAdoDlg:OpenDb(CString filename)HRESULT

11、hr=S_OK;hr=m_pCon.CreateInstance("ADODB.Connection");if (hr!=S_OK)return FALSE;try_bstr_t sCon;sCon=_bstr_t(filename); /路径名hr=m_pCon->Open(sCon,"","",adModeUnknown);if (hr!=S_OK)return FALSE;/hr=m_pSet.CreateInstance("ADODB.Recordset");if (hr!=S_OK)return F

12、ALSE;m_pSet->CursorLocation=adUseClient;hr=m_pSet->Open("SELECT * FROM object_table",_variant_t(IDispatch*)m_pCon,TRUE),adOpenStatic,adLockOptimistic,adCmdText);if (hr!=S_OK)return FALSE;return TRUE;/catch(_com_error &e)CString errorMessage;errorMessage.Format("连接数据库失败!错误信息:

13、%s",e.ErrorMessage();return FALSE;return FALSE; (注意:在StdAfx.h中要加入:#import "C:Program FilesCommon FilesSYSTEMADOmsado15.dll" no_namespace rename("EOF","adoEOF") 来引入ado库,还有在 BOOL CTestAdoApp:InitInstance() 加入 AfxOleInit();/初始化COM库)三、CLine对象的保存void CTestAdoDlg:OnButto

14、nSave()/m_Listif (!m_bState) return;UpdateData();trym_pSet->AddNew();m_pSet->PutCollect("name", _variant_t(m_sName);/保存图形对象CMemFile memFile;CArchive ar(&memFile, CArchive:store);m_Line.Serialize(ar);ar.Close();DWORD dwSize = memFile.GetLength();LPBYTE lpInfo = memFile.Detach();VA

15、RIANT varBLOB;SAFEARRAY *psa;SAFEARRAYBOUND rgsabound1;rgsabound0.lLbound = 0;rgsabound0.cElements = dwSize;psa = SafeArrayCreate(VT_UI1, 1, rgsabound);for (long i = 0; i < (long)dwSize; i+)SafeArrayPutElement (psa, &i, lpInfo+);varBLOB.vt = VT_ARRAY | VT_UI1;varBLOB.parray = psa;m_pSet->G

16、etFields()->GetItem("object")->AppendChunk(varBLOB);m_pSet->Update();m_List.AddString(m_sName);catch(_com_error &e)CString str=(char *)e.Description();MessageBox(str+"r保存数据库出问题!","提示",MB_OK|MB_ICONWARNING);return ;四、CLine对象的读取 void CTestAdoDlg:OnSelchangeLi

17、stData()int iPos = m_List.GetCurSel();if (iPos<0) return ;m_pSet->MoveFirst();int i=0;while (i< iPos)m_pSet->MoveNext();i+;long lDataSize = m_pSet->GetFields()->GetItem(_variant_t("object")->ActualSize;if(lDataSize <= 0) return;_variant_t varBLOB;VariantInit (&v

18、arBLOB);varBLOB = m_pSet->GetFields()->GetItem(_variant_t("object")->GetChunk(lDataSize);if(varBLOB.vt = (VT_ARRAY | VT_UI1)BYTE *pBuf = new BYTElDataSize + 1;if(pBuf)SafeArrayAccessData(varBLOB.parray,(void *)&pBuf);SafeArrayUnaccessData (varBLOB.parray);CMemFile memfile;memfile.A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论