ADO 读取 ACCESS

  1 #pragma once
  2 #include <vector>
  3 // 加入ADO支持库,
  4 #import "C:\Program Files\Common Files\System\ado\msado15.dll"   5     no_namespace   6     rename ("EOF", "adoEOF")
  7
  8 template<typename stDBDATA>
  9 class CADO
 10 {
 11 public:
 12     CADO();
 13     virtual ~CADO();
 14 public:
 15     static void dump_com_error(_com_error &e);
 16     bool Init();
 17     bool Start();
 18     void Uninit();
 19 public:
 20     void OnWrite(char* name, int age);
 21     void OnRead();
 22     void OnDelete();
 23     void OnModify();
 24     void OnExcute();
 25
 26 private:
 27
 28     _ConnectionPtr    m_pConnection;
 29
 30     _CommandPtr        m_pCommand;
 31     _RecordsetPtr    m_pRecordset;
 32     _RecordsetPtr    m_pRecordset1;
 33     char*            m_strCommand;
 34
 35 };
 36
 37 template<class stDBDATA>
 38 CADO<stDBDATA>::CADO()
 39 {
 40     Init();
 41 }
 42
 43 template<class stDBDATA>
 44 CADO<stDBDATA>::~CADO()
 45 {
 46     Uninit();
 47 }
 48
 49 template<class stDBDATA>
 50 void CADO<stDBDATA>::dump_com_error(_com_error &e)
 51 {
 52     char ErrorStr[MAX_PATH];
 53
 54     _bstr_t bstrSource(e.Source());
 55     _bstr_t bstrDescription(e.Description());
 56     sprintf_s(ErrorStr, "\n\tADO Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n\n",
 57         e.Error(), e.ErrorMessage(), (LPCTSTR)bstrSource, (LPCTSTR)bstrDescription);
 58     printf(ErrorStr);
 59 }
 60
 61 template<class stDBDATA>
 62 bool CADO<stDBDATA>::Init()
 63 {
 64     // 初始化COM,创建ADO连接等操作
 65     int S_Result = OleInitialize(NULL);
 66     HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
 67     /*HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");*/
 68     if(FAILED(hr))
 69     {
 70         printf("m_pConnection.CreateInstance调用失败\n");
 71         return false;
 72     }
 73     try
 74     {
 75         // 打开本地Access库Demo.mdb
 76         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
 77     }
 78     catch(_com_error& e)
 79     {
 80         dump_com_error(e);
 81         return false;
 82     }
 83
 84     return true;
 85 }
 86
 87 template<class stDBDATA>
 88 bool CADO<stDBDATA>::Start()
 89 {
 90     // 使用ADO创建数据库记录集
 91     m_pRecordset.CreateInstance(__uuidof(Recordset));
 92     try
 93     {
 94         m_pRecordset->Open("SELECT * FROM USERTABLE",                // 查询User表中所有字段
 95             m_pConnection.GetInterfacePtr(),     // 获取库接库的IDispatch指针
 96             adOpenDynamic,
 97             adLockOptimistic,
 98             adCmdText);
 99     }
100     catch(_com_error& e)
101     {
102         dump_com_error(e);
103         return false;
104     }
105
106     return true;
107 }
108
109 template<class stDBDATA>
110 void CADO<stDBDATA>::Uninit()
111 {
112     // 关闭ADO连接状态
113     if(m_pConnection->State)
114     {
115         m_pConnection->Close();
116         m_pConnection= NULL;
117     }
118
119     if(m_pRecordset->State)
120     {
121         m_pRecordset->Close();
122         m_pRecordset.Release();
123         m_pRecordset = NULL;
124     }
125 }
126
127 template<class stDBDATA>
128 void CADO<stDBDATA>::OnWrite(char* name, int age)
129 {
130     long age_l = age;
131     try
132     {
133         // 写入各字段值
134         m_pRecordset->AddNew();
135         m_pRecordset->PutCollect("Name", LPSTR(name));
136         m_pRecordset->PutCollect("Age", age_l);
137         m_pRecordset->Update();
138     }
139     catch(_com_error& e)
140     {
141         dump_com_error(e);
142     }
143 }
144
145 template<class stDBDATA>
146 void CADO<stDBDATA>::OnRead()
147 {
148     _variant_t var;
149
150     char strName[MAX_PATH];
151     int age;
152
153     try
154     {
155         if(!m_pRecordset->BOF)
156         {
157             m_pRecordset->MoveFirst();
158         }
159         else
160         {
161             printf("表内数据为空\n");
162             return;
163         }
164
165         while(!m_pRecordset->adoEOF)
166         {
167             var = m_pRecordset->GetCollect("Name");
168             if(var.vt != VT_NULL)
169             {
170                 strcpy_s(strName, _bstr_t(var));
171             }
172             var = m_pRecordset->GetCollect("Age");
173             if(var.vt != VT_NULL)
174             {
175                 age = atol(_bstr_t(var));
176             }
177
178             stDBDATA data(strName, age);
179             data.print();
180
181             m_pRecordset->MoveNext();
182         }
183     }
184     catch(_com_error& e)
185     {
186         dump_com_error(e);
187     }
188 }
189
190 template<class stDBDATA>
191 void CADO<stDBDATA>::OnDelete()
192 {
193     try
194     {
195         m_pRecordset->MovePrevious();
196         // 删除当前行记录
197         m_pRecordset->Delete(adAffectCurrent);
198         m_pRecordset->Update();
199
200     }
201     catch(_com_error& e)
202     {
203         dump_com_error(e);
204     }
205 }
206
207 template<class stDBDATA>
208 void CADO<stDBDATA>::OnModify()
209 {
210     char m_Name[MAX_PATH] = "fffff";
211     long m_Age = 25;
212
213     // 修改当前记录的字段值
214     try
215     {
216         m_pRecordset->PutCollect("Name", _variant_t(m_Name));
217         m_pRecordset->PutCollect("Age", m_Age);
218         m_pRecordset->Update();
219     }
220     catch(_com_error& e)
221     {
222         dump_com_error(e);
223     }
224 }
225
226 template<class stDBDATA>
227 void CADO<stDBDATA>::OnExcute()
228 {
229     _CommandPtr        m_pCommand;
230     m_strCommand = "delete from USERTABLE where Name = ‘fffff‘";
231
232     m_pCommand.CreateInstance(__uuidof(Command));
233     m_pCommand->ActiveConnection = m_pConnection;  // 将库连接赋于它
234     m_pCommand->CommandText = _bstr_t((LPCTSTR)m_strCommand);  // SQL语句
235     try
236     {
237         // 执行SQL语句,返回记录集,此记录不能做插入操作
238         // 故为了不和m_pRecordset相冲突, 放入新定义的m_pRecordset1
239         m_pRecordset1 = m_pCommand->Execute( NULL, NULL, adCmdText);
240     }
241     catch(_com_error& e)
242     {
243         dump_com_error(e);
244     }
245 }

 

 1 #include "ado.h"
 2
 3 struct stDB
 4 {
 5     char name[MAX_PATH];
 6     int age;
 7
 8     stDB()
 9     {
10
11     }
12
13     stDB(char* _name, int _age)
14     {
15         strcpy_s(name,MAX_PATH, _name);
16         age = _age;
17     }
18
19     void print()
20     {
21         printf("Name:%s------Age:%d\n", name, age);
22     }
23 };
24
25 int main()
26 {
27     CADO<stDB> ado;
28     ado.Start();
29     ado.OnRead();
30     ado.OnWrite("q1", 10);
31     ado.OnModify();
32     ado.OnDelete();
33     ado.OnExcute();
34     ado.OnRead();
35     system("pause");
36     return 0;
37 }
时间: 2024-11-05 22:58:35

ADO 读取 ACCESS的相关文章

ADO访问Access数据库错误解决

最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010; Access2000~Access2003连接串建立数据库连接. 关键数据库操作代码 BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vec

ACCESS(VBA)上的一个小项目 —— 2、读取ACCESS表数据到TreeView和ListView

有人问我能不能做一个程序的时候,我第一反应都说“能”. --这次在ACCESS中,借助TreeView和ListView做了一个数据联动的模型. 简析过程: 1)从网上找了一份TreeView学习教程<三小时学会树控件>,了解了TreeView的建立以及节点的使用方法: 2)把数据表中的某列按一定规则生成的数据再按一种规则解析成TreeView中的树结构(VPPS): 3)通过遍历TreeView中节点的折叠状态,通过上述一定规则生成的数据(唯一性)把数据表中的内容读取到ListView中:

PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

PHP使用UTF8编码读取ACCESS的乱码问题解决方案 http://it.xwstudy.com/readnews.php?id=627 来源:本站编辑 发布日期:2013-05-27 已有 1790 人浏览过此信息 PHP搭配ACCESS是一个非常冷的话题,但是却有很多实用性,特别是从ASP转过来的程序员,对ACCESS有特殊的理解.学文培训在实际PHP培训中也会讲到ACCESS配合PHP的系统开发.那我们今天就来分享一下PHP+ACCESS的在实战开发中通常会遇到的UTF-8编码问题的解

ADO访问Access数据库错误解决心得随笔

最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~Access2003连接串建立数据库连接. 关键数据库操作代码 BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vec

解决delphi的 dbgrid在读取access文本型字段显示TWideMemoField的问题

原文:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9F%A5%E8%AF%86%E5%BA%93/22028.shtml "解决delphi的 dbgrid在读取access文本型字段显示TWideMemoField的问题": 关键词:解决 delphi dbgrid 读取 access 文本 型 字段 显示 twidememofield 问题 如题:delphi 的dbgrid在读取access文本型字段会显示twi

Python小程序,读取ACCESS数据库,然后list数据

曾经做过的一个Python小程序,读取ACCESS数据库,然后list数据 # -*- coding: cp936 -*-import wximport wx.libimport sys,glob,randomimport win32com.clientreload(sys)sys.setdefaultencoding('utf-8')class DemoFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u"安

c# ADO连接Access 执行Open后程序自动退出

今天利用ADO连接Access数据库的时候遇到了前所未见的问题,Access数据库连接串,OleDbConnection,open的时候,系统就会自动关闭所有调试. 我就很纠结了,这个AccessHelp是从以前写过的程序中拷贝过来的(不想引用太多的DLL,看着烦),调试以前的一切正常. 也想到了是不是版本的问题,access2003的连接串 “Provider=Microsoft.Jet.OLEDB.4.0”: access2007的连接串“Provider=Microsoft.ACE.OLE

MFC通过ADO操作Access数据库

我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章--"直接通过ODBC读.写Excel表格文件"和"直接通过DAO读.写Access文件",先后给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法.ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础

【.Net】Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx Acess数据库读取 https://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbdatareader(v=vs.80).aspx 代码实现: using System; using System.Runtime.InteropSer