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 }

 

posted @ 2015-04-24 16:10  felove  阅读(837)  评论(0编辑  收藏  举报