连接的基本方法
首先确认开发环境以及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++这两周真心是发现各种数据格式简直太多了。一时半会有点难以弄懂,慢慢接触,慢慢学习。