0%

C++通过ADO连接ORACLE数据库

连接的基本方法

首先确认开发环境以及oracle的位数要统一才能连接。
自己花了半天没成功的原因就在于,电脑是64位系统,oracle装的时64位的,然而在写C++程序的时候选择了X86的方式编译,导致编译过但程序报错无法连接。重新装32位oracle之后问题解决。

基本的连接程序如下,需要智能指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//conn.h
/注意标识no_namepace,否则需要添加 using namespace ADODB
//这里引用微软的ADO数据连接dll
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
#include <cstring>
#include <atlstr.h>

_ConnectionPtr m_conn;
_RecordsetPtr m_rec;
HRESULT hr;

bool AdoOpen(_bstr_t);
_RecordsetPtr AdoExecute(CString);
void GetRecordSet(CString);
bool AdoClose();
void AdoQuery(CString);
bool AdoAdd();
bool AdoUpdate();
bool AdoDelete();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//conn.cpp
#include "conn.h"
#include <iostream>
using namespace std;

void main()
{
_bstr_t ConStr = "Provider = OraOLEDB.Oracle;Data Source = orcl;User id=scott;Password = root;";
AdoOpen(ConStr);
CString SQLCommend = "SELECT * FROM DEPT;";
AdoQuery(SQLCommend);
cout<<"========================="<<endl;
AdoAdd();
AdoQuery(SQLCommend);
AdoClose();
int a;
cin>>a;
}

bool AdoOpen(_bstr_t ConStr)
{
//初始化COM
hr = CoInitialize(NULL);
hr = m_conn.CreateInstance("ADODB.Connection");
//hr = m_conn.CreateInstance(__uuidof(Connection));
try
{
hr = m_conn->Open(ConStr,"","",NULL);
cout<<"链接成功!" <<endl;
}
catch(_com_error e)
{
cout<<e.ErrorMessage();
}
return true;
}

void GetRecordSet(CString SQL)
{
try{
m_rec.CreateInstance(__uuidof(Recordset));
m_rec->Open(_bstr_t(SQL),m_conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
cout<<e.ErrorMessage()<<endl;
}
}

//此示例中未用此方法,但是一般的语句可以通过这个函数执行
_RecordsetPtr AdoExecute(CString sqlStr)
{
try
{
if(m_conn=NULL)
{
cout<<"请先链接数据库!";
return NULL;
}
_variant_t RecordAff;
_RecordsetPtr PRecord;
PRecord = m_conn->Execute(_bstr_t(sqlStr),&RecordAff,adCmdText);
return PRecord;
}
catch(_com_error e)
{
return false;
}
}

void AdoQuery(CString SQL)
{
GetRecordSet(SQL);
//查询方法1
variant_t no,name,loc;
try
{
m_rec->MoveFirst();
while(m_rec->adoEOF==VARIANT_FALSE)
{
no = m_rec->GetCollect("DEPTNO");
name = m_rec->GetCollect("DNAME");
loc =m_rec->GetCollect("LOC");
std::cout<<"DeptNO:"<<(LPCTSTR)_bstr_t(no)<<std::endl;
std::cout<<"Name:"<<(LPCTSTR)_bstr_t(name)<<std::endl;
std::cout<<"Loc:"<<(LPCTSTR)_bstr_t(loc)<<std::endl;
m_rec->MoveNext();
}
}
//查询方法2
/*try
{
m_rec->MoveFirst();
while (m_rec->adoEOF==VARIANT_FALSE)
{
cout<<(char*)(_bstr_t)(m_rec->Fields->GetItem(_variant_t("DEPTNO"))->Value)<<" ";
cout<<(char*)(_bstr_t)(m_rec->Fields->GetItem(_variant_t("DNAME"))->Value)<<" ";
cout<<(char*)(_bstr_t)(m_rec->Fields->GetItem(_variant_t("LOC"))->Value)<<" ";
cout<<endl;
m_rec->MoveNext();
}
}*/
catch(_com_error e)
{
cout<<e.ErrorMessage()<<endl;
}
}
bool AdoAdd()
{
m_rec->AddNew();
//插入方法1
//m_rec->Fields->GetItem(_variant_t("DEPTNO"))->Value =_bstr_t ("50");
//m_rec->Fields->GetItem(_variant_t("DNAME"))->Value =_bstr_t ("zsf");
//m_rec->Fields->GetItem(_variant_t("LOC"))->Value =_bstr_t ("china");
//插入方法2
m_rec->PutCollect(_variant_t("DEPTNO"),_variant_t(60));
m_rec->PutCollect(_variant_t("DNAME"),_variant_t("ZC"));
m_rec->PutCollect(_variant_t("LOC"),_variant_t("CHINA"));
m_rec->Update();
return true;
}
//未添加
bool AdoDelete()
{
return true;
}
bool AdoClose()
{
if(m_conn!=NULL)
{
m_rec->Close();
m_rec=NULL;
m_conn->Close();
m_conn=NULL;
return true;
}
if(m_conn=NULL)
{
return true;
}
else
{
return false;
}
}

数据库传值格式问题

由于采用的是COM方式打开的数据库,因此基本的数据格式是_bsrt_t``LPCTSTR格式,在传入的时候要转换成这个两个格式。
在研究C++这两周真心是发现各种数据格式简直太多了。一时半会有点难以弄懂,慢慢接触,慢慢学习。