AdoConnection.cpp
上传用户:xutong0099
上传日期:2009-03-19
资源大小:29k
文件大小:28k
源码类别:

数据库系统

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "AdoConnection.h"
  3. #include <math.h>
  4. #ifdef _DEBUG
  5. #undef THIS_FILE
  6. static char THIS_FILE[]=__FILE__;
  7. #define new DEBUG_NEW
  8. #endif
  9. /*########################################################################
  10.   ------------------------------------------------
  11.     数值类型转换
  12.   ------------------------------------------------
  13.   ########################################################################*/
  14. COleDateTime vartodate(const _variant_t& var)
  15. {
  16. COleDateTime value;
  17. switch (var.vt) 
  18. {
  19. case VT_DATE:
  20. {
  21. value = var.date;
  22. }
  23. break;
  24. case VT_EMPTY:
  25. case VT_NULL:
  26. value.SetStatus(COleDateTime::null);
  27. break;
  28. default:
  29. value.SetStatus(COleDateTime::null);
  30. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  31. }
  32. return value;
  33. }
  34. COleCurrency vartocy(const _variant_t& var)
  35. {
  36. COleCurrency value;
  37. switch (var.vt) 
  38. {
  39. case VT_CY:
  40. value = (CURRENCY)var.cyVal;
  41. break;
  42. case VT_EMPTY:
  43. case VT_NULL:
  44. value.m_status = COleCurrency::null;
  45. break;
  46. default:
  47. value.m_status = COleCurrency::null;
  48. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  49. }
  50. return value;
  51. }
  52. bool vartobool(const _variant_t& var)
  53. {
  54. bool value = false;
  55. switch (var.vt)
  56. {
  57. case VT_BOOL:
  58. value = var.boolVal ? true : false;
  59. case VT_EMPTY:
  60. case VT_NULL:
  61. break;
  62. default:
  63. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  64. }
  65. return value;
  66. }
  67. BYTE vartoby(const _variant_t& var)
  68. {
  69. BYTE value = 0;
  70. switch (var.vt)
  71. {
  72. case VT_I1:
  73. case VT_UI1:
  74. value = var.bVal;
  75. break;
  76. case VT_NULL:
  77. case VT_EMPTY:
  78. value = 0;
  79. break;
  80. default:
  81. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  82. }
  83. return value;
  84. }
  85. short vartoi(const _variant_t& var)
  86. {
  87. short value = 0;
  88. switch (var.vt)
  89. {
  90. case VT_BOOL:
  91. value = var.boolVal;
  92. break;
  93. case VT_UI1:
  94. case VT_I1:
  95. value = var.bVal;
  96. break;
  97. case VT_I2:
  98. case VT_UI2:
  99. value = var.iVal;
  100. break;
  101. case VT_NULL:
  102. case VT_EMPTY:
  103. value = 0;
  104. break;
  105. default:
  106. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  107. }
  108. return value;
  109. }
  110. long vartol(const _variant_t& var)
  111. {
  112. long value = 0;
  113. switch (var.vt)
  114. {
  115. case VT_BOOL:
  116. value = var.boolVal;
  117. break;
  118. case VT_UI1:
  119. case VT_I1:
  120. value = var.bVal;
  121. break;
  122. case VT_UI2:
  123. case VT_I2:
  124. value = var.iVal;
  125. break;
  126. case VT_I4:
  127. case VT_UI4:
  128. value = var.lVal;
  129. break;
  130. case VT_INT:
  131. value = var.intVal;
  132. break;
  133. case VT_R4:
  134. value = (long)(var.fltVal + 0.5);
  135. break;
  136. case VT_R8:
  137. value = (long)(var.dblVal + 0.5);
  138. break;
  139. case VT_DECIMAL:
  140. value = (long)var;
  141. break;
  142. case VT_CY:
  143. value = (long)var;
  144. break;
  145. case VT_BSTR://字符串
  146. case VT_LPSTR://字符串
  147. case VT_LPWSTR://字符串
  148. value = atol((LPCTSTR)(_bstr_t)var);
  149. break;
  150. case VT_NULL:
  151. case VT_EMPTY:
  152. value = 0;
  153. break;
  154. default:
  155. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  156. }
  157. return value;
  158. }
  159. double vartof(const _variant_t& var)
  160. {
  161. double value = 0;
  162. switch (var.vt)
  163. {
  164. case VT_R4:
  165. value = var.fltVal;
  166. break;
  167. case VT_R8:
  168. value = var.dblVal;
  169. break;
  170. case VT_DECIMAL:
  171. value = (double)var;
  172. break;
  173. case VT_CY:
  174. value = (double)var;
  175. break;
  176. case VT_BOOL:
  177. value = var.boolVal;
  178. break;
  179. case VT_UI1:
  180. case VT_I1:
  181. value = var.bVal;
  182. break;
  183. case VT_UI2:
  184. case VT_I2:
  185. value = var.iVal;
  186. break;
  187. case VT_UI4:
  188. case VT_I4:
  189. value = var.lVal;
  190. break;
  191. case VT_INT:
  192. value = var.intVal;
  193. break;
  194. case VT_BSTR://字符串
  195. case VT_LPSTR://字符串
  196. case VT_LPWSTR://字符串
  197. value = atof((LPCTSTR)(_bstr_t)var);
  198. break;
  199. case VT_NULL:
  200. case VT_EMPTY:
  201. value = 0;
  202. break;
  203. default:
  204. value = 0;
  205. TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %dn"), __FILE__, __LINE__);
  206. }
  207. return value;
  208. }
  209. CString vartostr(const _variant_t &var)
  210. {
  211. CString strValue;
  212. switch (var.vt)
  213. {
  214. case VT_BSTR://字符串
  215. case VT_LPSTR://字符串
  216. case VT_LPWSTR://字符串
  217. strValue = (LPCTSTR)(_bstr_t)var;
  218. break;
  219. case VT_I1:
  220. case VT_UI1:
  221. strValue.Format("%d", var.bVal);
  222. break;
  223. case VT_I2://短整型
  224. strValue.Format("%d", var.iVal);
  225. break;
  226. case VT_UI2://无符号短整型
  227. strValue.Format("%d", var.uiVal);
  228. break;
  229. case VT_INT://整型
  230. strValue.Format("%d", var.intVal);
  231. break;
  232. case VT_I4: //整型
  233. strValue.Format("%d", var.lVal);
  234. break;
  235. case VT_I8: //长整型
  236. strValue.Format("%d", var.lVal);
  237. break;
  238. case VT_UINT://无符号整型
  239. strValue.Format("%d", var.uintVal);
  240. break;
  241. case VT_UI4: //无符号整型
  242. strValue.Format("%d", var.ulVal);
  243. break;
  244. case VT_UI8: //无符号长整型
  245. strValue.Format("%d", var.ulVal);
  246. break;
  247. case VT_VOID:
  248. strValue.Format("%8x", var.byref);
  249. break;
  250. case VT_R4://浮点型
  251. strValue.Format("%.4f", var.fltVal);
  252. break;
  253. case VT_R8://双精度型
  254. strValue.Format("%.8f", var.dblVal);
  255. break;
  256. case VT_DECIMAL: //小数
  257. strValue.Format("%.8f", (double)var);
  258. break;
  259. case VT_CY:
  260. {
  261. COleCurrency cy = var.cyVal;
  262. strValue = cy.Format();
  263. }
  264. break;
  265. case VT_BLOB:
  266. case VT_BLOB_OBJECT:
  267. case 0x2011:
  268. strValue = "[BLOB]";
  269. break;
  270. case VT_BOOL://布尔型
  271. strValue = var.boolVal ? "TRUE" : "FALSE";
  272. break;
  273. case VT_DATE: //日期型
  274. {
  275. DATE dt = var.date;
  276. COleDateTime da = COleDateTime(dt); 
  277. strValue = da.Format("%Y-%m-%d %H:%M:%S");
  278. }
  279. break;
  280. case VT_NULL://NULL值
  281. strValue = "";
  282. break;
  283. case VT_EMPTY://空
  284. strValue = "";
  285. break;
  286. case VT_UNKNOWN://未知类型
  287. default:
  288. strValue = "UN_KNOW";
  289. break;
  290. }
  291. return strValue;
  292. }
  293. /*########################################################################
  294.  ------------------------------------------------
  295. CAdoConnection class 构造/析构函数
  296.  ------------------------------------------------
  297.   ########################################################################*/
  298. CAdoConnection::CAdoConnection()
  299. {
  300. //创建 Connection 对象---------------------------
  301. m_pConnection.CreateInstance("ADODB.Connection");
  302. #ifdef _DEBUG
  303. if (m_pConnection == NULL)
  304. {
  305. AfxMessageBox("Connection 对象创建失败! 请确认是否初始化了COM环境rn");
  306. }
  307. #endif
  308. ASSERT(m_pConnection != NULL);
  309. }
  310. CAdoConnection::~CAdoConnection()
  311. {
  312. if (m_pConnection != NULL)
  313. {
  314. Release();
  315. }
  316. }
  317. /*========================================================================
  318. Name: 连接到数据源.
  319. -----------------------------------------------------
  320. Params: [lpszConnect]: 连接字符串, 包含连接信息.
  321. [lOptions]: 可选. 决定该方法是以同步还是异步的方式连接数据
  322. 源. 可以是如下某个常量:
  323. [常量] [说明] 
  324. ----------------------------------
  325. adConnectUnspecified (默认)同步方式打开连接. 
  326. adAsyncConnect 异步方式打开连接. Ado用 ConnectComplete 事
  327. 件来通知已经完成连接. 
  328. ==========================================================================*/
  329. BOOL CAdoConnection::Open(LPCTSTR lpszConnect, long lOptions)
  330. {
  331. ASSERT(m_pConnection != NULL);
  332. ASSERT(AfxIsValidString(lpszConnect));
  333. if (strcmp(lpszConnect, _T("")) != 0)
  334. {
  335. m_strConnect = lpszConnect;
  336. }
  337. if (m_strConnect.IsEmpty())
  338. {
  339. ASSERT(FALSE);
  340. return FALSE;
  341. }
  342. if (IsOpen()) Close();
  343. try
  344. {
  345. // 连接数据库 ---------------------------------------------
  346. return (m_pConnection->Open(_bstr_t(LPCTSTR(m_strConnect)), "", "", lOptions) == S_OK);
  347. }
  348. catch (_com_error e)
  349. {
  350. TRACE(_T("Warning: 连接数据库发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  351. TRACE(_T("%srn"), GetLastErrorText());
  352. return FALSE;
  353. catch (...)
  354. {
  355. TRACE(_T("Warning: 连接数据库时发生未知错误:"));
  356. }
  357. return FALSE;
  358. }
  359. /*========================================================================
  360. Name: 连接 SQL SERVER 数据库. 
  361. -----------------------------------------------------
  362. Params: [dbsrc]: SQL SERVER 服务器名.
  363. [dbname]: 默认的数据库名.
  364. [user]: 用户名.
  365. [pass]: 密码.
  366. ==========================================================================*/
  367. BOOL CAdoConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, long lOptions)
  368. {
  369. CString strConnect = _T("Provider=SQLOLEDB.1; Data Source=") + dbsrc + 
  370.  _T("; Initial Catalog=") + dbname  +
  371.  _T("; User ID=") + user + 
  372.  _T("; PWD=") + pass;
  373. return Open(LPCTSTR(strConnect), lOptions);
  374. }
  375. BOOL CAdoConnection::ConnectAccess(CString dbpath, CString pass, long lOptions)
  376. {
  377. CString strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=") + dbpath;
  378. if (pass != _T("")) 
  379. {
  380. strConnect += _T("Jet OLEDB:Database Password=") + pass + _T(";");
  381. }
  382. return Open(LPCTSTR(strConnect), lOptions);
  383. }
  384. /*========================================================================
  385. Name: 连接 Oracle 数据库. 
  386. -----------------------------------------------------
  387. Params: [server]: 服务器名.
  388. [name]: 访问用户名.
  389. [password]: 访问密码.
  390. ===========================================================================*/
  391. BOOL CAdoConnection::ConnectToOracle(CString server, CString name, CString password, long lOptions)
  392. {
  393. //Oracle 的连接:
  394. CString strConnection = "Provider=MSDAORA;Data Source=" + server +
  395. ";User ID=" + name + "; Password=" + password;
  396. return Open((_bstr_t)strConnection,lOptions);
  397. }
  398. /*========================================================================
  399. Name: 通过 udl 文件连接数据库. 
  400. -----------------------------------------------------
  401. Params: [strFileName]: UDL 数据库连接文件路径名.
  402. ==========================================================================*/
  403. BOOL CAdoConnection::OpenUDLFile(LPCTSTR strFileName, long lOptions)
  404. {
  405. CString strConnect = _T("File Name=");
  406. strConnect += strFileName;
  407. return Open(LPCTSTR(strConnect), lOptions);
  408. }
  409. /*========================================================================
  410. Name: 关闭与数据源的连接.
  411. -----------------------------------------------------
  412. Remarks: 使用 Close 方法可关闭 Connection 对象以便释放所有关联的系统资源. 
  413. ==========================================================================*/
  414. void CAdoConnection::Close()
  415. {
  416. try
  417. {
  418. if (m_pConnection != NULL && IsOpen()) 
  419. {
  420. m_pConnection->Close();
  421. }
  422. }
  423. catch (_com_error e)
  424. {
  425. TRACE(_T("Warning: 关闭数据库发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  426. }
  427. /*========================================================================
  428. Name: 关闭连接并释放对象.
  429. -----------------------------------------------------
  430. Remarks: 关闭连接并释放connection对象.
  431. ==========================================================================*/
  432. void CAdoConnection::Release()
  433. {
  434. if (IsOpen()) Close();
  435. m_pConnection.Release();
  436. }
  437. /*========================================================================
  438. Name: 执行指定的查询、SQL 语句、存储过程等.
  439.     ----------------------------------------------------------
  440. Remarks: 请参考 CAdoRecordSet 类的Open方法. 返回的 Recordset 对象始
  441. 终为只读、仅向前的游标.
  442. ==========================================================================*/
  443. _RecordsetPtr CAdoConnection::Execute(LPCTSTR lpszSQL, long lOptions)
  444. {
  445. ASSERT(m_pConnection != NULL);
  446. ASSERT(AfxIsValidString(lpszSQL));
  447. try
  448. {
  449. return m_pConnection->Execute(_bstr_t(lpszSQL), NULL, lOptions);
  450. }
  451. catch (_com_error e)
  452. {
  453. TRACE(_T("Warning: Execute 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  454. return FALSE;
  455. return FALSE;
  456. }
  457. /*========================================================================
  458. Remarks: 请参考 CAdoRecordSet 类 Cancel 方法.
  459. ==========================================================================*/
  460. BOOL CAdoConnection::Cancel()
  461. {
  462. ASSERT(m_pConnection != NULL);
  463. try
  464. {
  465. return m_pConnection->Cancel();
  466. }
  467. catch (_com_error e)
  468. {
  469. TRACE(_T("Warning: Cancel 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  470. return FALSE;
  471. return FALSE;
  472. }
  473. /*========================================================================
  474. Name: 取得最后发生的错误信息.
  475. ==========================================================================*/
  476. CString CAdoConnection::GetLastErrorText()
  477. {
  478. ASSERT(m_pConnection != NULL);
  479. CString strErrors = "";
  480. try
  481. {
  482. if (m_pConnection != NULL)
  483. {
  484. ErrorsPtr pErrors = m_pConnection->Errors;
  485. CString strError;
  486. for (long n = 0; n < pErrors->Count; n++)
  487. {
  488. ErrorPtr pError = pErrors->GetItem(n);
  489. strError.Format(_T("Description: %srnState: %s, Native: %d, Source: %srn"),
  490. (LPCTSTR)pError->Description,
  491. (LPCTSTR)pError->SQLState,
  492.  pError->NativeError,
  493. (LPCTSTR)pError->Source);
  494. strErrors += strError;
  495. }
  496. }
  497. return strErrors;
  498. }
  499. catch (_com_error e)
  500. {
  501. TRACE(_T("Warning: GetLastError 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  502. return strErrors;
  503. #ifdef _DEBUG
  504. return strErrors;
  505. #else
  506. return "数据操作错误";
  507. #endif
  508. }
  509. ErrorsPtr CAdoConnection::GetErrors()
  510. {
  511. ASSERT(m_pConnection != NULL);
  512. try
  513. {
  514. if (m_pConnection != NULL)
  515. {
  516. return m_pConnection->Errors;
  517. }
  518. return NULL;
  519. }
  520. catch (_com_error e)
  521. {
  522. TRACE(_T("Warning: GetErrors 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  523. return NULL;
  524. return NULL;
  525. }
  526. ErrorPtr CAdoConnection::GetError(long index)
  527. {
  528. ASSERT(m_pConnection != NULL);
  529. try
  530. {
  531. if (m_pConnection != NULL)
  532. {
  533. ErrorsPtr pErrors =  m_pConnection->Errors;
  534. if (index >= 0 && index < pErrors->Count)
  535. {
  536. return pErrors->GetItem(_variant_t(index));
  537. }
  538. }
  539. return NULL;
  540. }
  541. catch (_com_error e)
  542. {
  543. TRACE(_T("Warning: GetError 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  544. return NULL;
  545. return NULL;
  546. }
  547. /*========================================================================
  548. Name: 取得连接时间.
  549. ==========================================================================*/
  550. long CAdoConnection::GetConnectTimeOut()
  551. {
  552. ASSERT(m_pConnection != NULL);
  553. try
  554. {
  555. return m_pConnection->GetConnectionTimeout();
  556. }
  557. catch (_com_error e)
  558. {
  559. TRACE(_T("Warning: GetConnectTimeOut 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  560. return -1;
  561. return -1;
  562. }
  563. /*========================================================================
  564. Name: 设置连接时间.
  565. ==========================================================================*/
  566. BOOL CAdoConnection::SetConnectTimeOut(long lTime)
  567. {
  568. ASSERT(m_pConnection != NULL);
  569. try
  570. {
  571. m_pConnection->PutConnectionTimeout(lTime);
  572. return TRUE;
  573. }
  574. catch (_com_error e)
  575. {
  576. TRACE(_T("Warning: SetConnectTimeOut 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  577. return FALSE;
  578. }
  579. /*========================================================================
  580. Name: 取得默认数据库的名称.
  581. ==========================================================================*/
  582. CString CAdoConnection::GetDefaultDatabase()
  583. {
  584. ASSERT(m_pConnection != NULL);
  585. try
  586. {
  587. return CString(LPCTSTR(_bstr_t(m_pConnection->GetDefaultDatabase())));
  588. }
  589. catch (_com_error e)
  590. {
  591. TRACE(_T("Warning: GetDefaultDatabase 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  592. return CString(_T(""));
  593. }
  594. /*========================================================================
  595. Name: 取得 Connection 对象提供者的名称.
  596. ==========================================================================*/
  597. CString CAdoConnection::GetProviderName()
  598. {
  599. ASSERT(m_pConnection != NULL);
  600. try
  601. {
  602. return CString(LPCTSTR(_bstr_t(m_pConnection->GetProvider())));
  603. }
  604. catch (_com_error e)
  605. {
  606. TRACE(_T("Warning: GetProviderName 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  607. return CString(_T(""));
  608. }
  609. /*========================================================================
  610. Name: 取得 ADO 的版本号
  611. ==========================================================================*/
  612. CString CAdoConnection::GetVersion()
  613. {
  614. ASSERT(m_pConnection != NULL);
  615. try
  616. {
  617. return CString(LPCTSTR(_bstr_t(m_pConnection->GetVersion())));
  618. }
  619. catch (_com_error e)
  620. {
  621. TRACE(_T("Warning: GetVersion 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  622. return CString(_T(""));
  623. }
  624. /*========================================================================
  625. Name: 取得对象的状态(同 Recordset 对象的 GetState 方法).
  626. -----------------------------------------------------
  627. returns: 返回下列常量之一的长整型值.
  628. [常量] [说明] 
  629. ----------------------------------
  630. adStateClosed 指示对象是关闭的. 
  631. adStateOpen 指示对象是打开的. 
  632. -----------------------------------------------------
  633. Remarks: 可以随时使用 State 属性取得指定对象的当前状态.
  634. ==========================================================================*/
  635. long CAdoConnection::GetState()
  636. {
  637. ASSERT(m_pConnection != NULL);
  638. try
  639. {
  640. return m_pConnection->GetState();
  641. }
  642. catch (_com_error e)
  643. {
  644. TRACE(_T("Warning: GetState 发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  645. return -1;
  646. return -1;
  647. }
  648. /*========================================================================
  649. Name: 检测连接对象是否为打开状态.
  650. ==========================================================================*/
  651. BOOL CAdoConnection::IsOpen()
  652. {
  653. try
  654. {
  655. return (m_pConnection != NULL && (m_pConnection->State & adStateOpen));
  656. }
  657. catch (_com_error e)
  658. {
  659. TRACE(_T("Warning: IsOpen 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  660. return FALSE;
  661. return FALSE;
  662. }
  663. /*========================================================================
  664. Name: 取得在 Connection 对象中修改数据的可用权限.
  665.     ----------------------------------------------------------
  666. returns: 返回以下某个 ConnectModeEnum 的值.
  667. [常量]  [说明] 
  668. ----------------------------------
  669. adModeUnknown  默认值. 表明权限尚未设置或无法确定. 
  670. adModeRead  表明权限为只读. 
  671. adModeWrite  表明权限为只写. 
  672. adModeReadWrite  表明权限为读/写. 
  673. adModeShareDenyRead  防止其他用户使用读权限打开连接. 
  674. adModeShareDenyWrite 防止其他用户使用写权限打开连接. 
  675. adModeShareExclusive 防止其他用户打开连接. 
  676. adModeShareDenyNone  防止其他用户使用任何权限打开连接.
  677.     ----------------------------------------------------------
  678. Remarks: 使用 Mode 属性可设置或返回当前连接上提供者正在使用的访问权限.
  679. ==========================================================================*/
  680. ConnectModeEnum CAdoConnection::GetMode()
  681. {
  682. ASSERT(m_pConnection != NULL);
  683. try
  684. {
  685. return m_pConnection->GetMode();
  686. }
  687. catch (_com_error e)
  688. {
  689. TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  690. return adModeUnknown;
  691. return adModeUnknown;
  692. }
  693. /*========================================================================
  694. Name: 设置在 Connection 中修改数据的可用权限. 请参考 GetMode 方法.
  695.     ----------------------------------------------------------
  696. Remarks: 只能在关闭 Connection 对象时方可设置 Mode 属性.
  697. ==========================================================================*/
  698. BOOL CAdoConnection::SetMode(ConnectModeEnum mode)
  699. {
  700. ASSERT(m_pConnection != NULL);
  701. ASSERT(!IsOpen());
  702. try
  703. {
  704. m_pConnection->PutMode(mode);
  705. }
  706. catch (_com_error e)
  707. {
  708. TRACE(_T("Warning: SetMode 发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  709. return FALSE;
  710. return TRUE;
  711. }
  712. /*========================================================================
  713.     Name: 从数据源获取数据库信息.
  714. -----------------------------------------------------
  715. Params: QueryType  所要运行的模式查询类型,可以为下列任意常量.
  716. adSchemaAsserts CONSTRAINT_CATALOG
  717. CONSTRAINT_SCHEMA
  718. CONSTRAINT_NAME 
  719. adSchemaCatalogs CATALOG_NAME 
  720. adSchemaCharacterSets CHARACTER_SET_CATALOG
  721. CHARACTER_SET_SCHEMA
  722. CHARACTER_SET_NAME 
  723. adSchemaCheckConstraints CONSTRAINT_CATALOG
  724. CONSTRAINT_SCHEMA
  725. CONSTRAINT_NAME 
  726. adSchemaCollations  COLLATION_CATALOG
  727. COLLATION_SCHEMA
  728. COLLATION_NAME 
  729. adSchemaColumnDomainUsage DOMAIN_CATALOG
  730. DOMAIN_SCHEMA
  731. DOMAIN_NAME
  732. COLUMN_NAME 
  733. adSchemaColumnPrivileges TABLE_CATALOG
  734. TABLE_SCHEMA
  735. TABLE_NAME
  736. COLUMN_NAME
  737. GRANTOR
  738. GRANTEE 
  739. adSchemaColumns TABLE_CATALOG
  740. TABLE_SCHEMA
  741. TABLE_NAME
  742. COLUMN_NAME 
  743. adSchemaConstraintColumnUsage TABLE_CATALOG
  744. TABLE_SCHEMA
  745. TABLE_NAME
  746. COLUMN_NAME 
  747. adSchemaConstraintTableUsage TABLE_CATALOG
  748. TABLE_SCHEMA
  749. TABLE_NAME 
  750. adSchemaForeignKeys PK_TABLE_CATALOG
  751. PK_TABLE_SCHEMA
  752. PK_TABLE_NAME
  753. FK_TABLE_CATALOG
  754. FK_TABLE_SCHEMA
  755. FK_TABLE_NAME 
  756. adSchemaIndexes TABLE_CATALOG
  757. TABLE_SCHEMA
  758. INDEX_NAME
  759. TYPE
  760. TABLE_NAME 
  761. adSchemaKeyColumnUsage CONSTRAINT_CATALOG
  762. CONSTRAINT_SCHEMA
  763. CONSTRAINT_NAME
  764. TABLE_CATALOG
  765. TABLE_SCHEMA
  766. TABLE_NAME
  767. COLUMN_NAME 
  768. adSchemaPrimaryKeys PK_TABLE_CATALOG
  769. PK_TABLE_SCHEMA
  770. PK_TABLE_NAME 
  771. adSchemaProcedureColumns PROCEDURE_CATALOG
  772. PROCEDURE_SCHEMA
  773. PROCEDURE_NAME
  774. COLUMN_NAME 
  775. adSchemaProcedureParameters PROCEDURE_CATALOG
  776. PROCEDURE_SCHEMA
  777. PROCEDURE_NAME
  778. PARAMTER_NAME 
  779. adSchemaProcedures PROCEDURE_CATALOG
  780. PROCEDURE_SCHEMA
  781. PROCEDURE_NAME
  782. PROCEDURE_TYPE 
  783. adSchemaProviderSpecific  参见说明 
  784. adSchemaProviderTypes DATA_TYPE
  785. BEST_MATCH 
  786. adSchemaReferentialConstraints CONSTRAINT_CATALOG
  787. CONSTRAINT_SCHEMA
  788. CONSTRAINT_NAME 
  789. adSchemaSchemata CATALOG_NAME
  790. SCHEMA_NAME
  791. SCHEMA_OWNER 
  792. adSchemaSQLLanguages <无> 
  793. adSchemaStatistics TABLE_CATALOG
  794. TABLE_SCHEMA
  795. TABLE_NAME 
  796. adSchemaTableConstraints CONSTRAINT_CATALOG
  797. CONSTRAINT_SCHEMA
  798. CONSTRAINT_NAME
  799. TABLE_CATALOG
  800. TABLE_SCHEMA
  801. TABLE_NAME
  802. CONSTRAINT_TYPE 
  803. adSchemaTablePrivileges TABLE_CATALOG
  804. TABLE_SCHEMA
  805. TABLE_NAME
  806. GRANTOR
  807. GRANTEE 
  808. adSchemaTables TABLE_CATALOG
  809. TABLE_SCHEMA
  810. TABLE_NAME
  811. TABLE_TYPE 
  812. adSchemaTranslations TRANSLATION_CATALOG
  813. TRANSLATION_SCHEMA
  814. TRANSLATION_NAME 
  815. adSchemaUsagePrivileges OBJECT_CATALOG
  816. OBJECT_SCHEMA
  817. OBJECT_NAME
  818. OBJECT_TYPE
  819. GRANTOR
  820. GRANTEE 
  821. adSchemaViewColumnUsage VIEW_CATALOG
  822. VIEW_SCHEMA
  823. VIEW_NAME 
  824. adSchemaViewTableUsage VIEW_CATALOG
  825. VIEW_SCHEMA
  826. VIEW_NAME 
  827. adSchemaViews TABLE_CATALOG
  828. TABLE_SCHEMA
  829. TABLE_NAME 
  830. -----------------------------------------------------
  831. returns: 返回包含数据库信息的 Recordset 对象. Recordset 将以只读、静态
  832. 游标打开.
  833. -----------------------------------------------------
  834. Remarks: OpenSchema方法返回与数据源有关的信息,例如关于服务器上的表
  835. 以及表中的列等信息, 上述数据仅供参考, 视具体的数据源可能会有不同。
  836. ==========================================================================*/
  837. _RecordsetPtr CAdoConnection::OpenSchema(SchemaEnum QueryType)
  838. {
  839. ASSERT(m_pConnection != NULL);
  840. try
  841. {
  842. return m_pConnection->OpenSchema(QueryType, vtMissing, vtMissing);
  843. }
  844. catch(_com_error e)
  845. {
  846. TRACE(_T("Warning: OpenSchema方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  847. return NULL;
  848. return NULL;
  849. }
  850. /*########################################################################
  851.   ------------------------------------------------
  852. 事务处理
  853.   ------------------------------------------------
  854.   ########################################################################*/
  855. /*========================================================================
  856.     Name: 开始新事务.
  857. -----------------------------------------------------
  858. returns: 对于支持嵌套事务的数据库来说, 在已打开的事务中调用 BeginTrans 
  859. 方法将开始新的嵌套事务. 返回值将指示嵌套层次: 返回值为 1 表示已打开顶层
  860. 事务 (即事务不被另一个事务所嵌套), 返回值为 2 表示已打开第二层事务(嵌套
  861. 在顶层事务中的事务), 依次类推.
  862. -----------------------------------------------------
  863. Remarks: 一旦调用了 BeginTrans 方法, 在调用 CommitTrans 或 RollbackTrans
  864. 结束事务之前, 数据库将不再立即提交所作的任何更改.
  865. ==========================================================================*/
  866. long CAdoConnection::BeginTrans()
  867. {
  868. ASSERT(m_pConnection != NULL);
  869. try
  870. {
  871. return m_pConnection->BeginTrans();
  872. }
  873. catch (_com_error e)
  874. {
  875. TRACE(_T("Warning: BeginTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  876. return -1;
  877. return -1;
  878. }
  879. /*########################################################################
  880.   ------------------------------------------------
  881. 事务处理
  882.   ------------------------------------------------
  883. BeginTrans - 开始新事务。
  884. CommitTrans - 保存任何更改并结束当前事务。它也可能启动新事务。
  885. RollbackTrans - 取消当前事务中所作的任何更改并结束事务。它也可能启动
  886. 新事务。
  887. 一旦调用了 BeginTrans 方法,在调用 CommitTrans 或 RollbackTrans 结
  888. 束事务之前,数据库将不再立即提交所作的任何更改。
  889. 对于支持嵌套事务的数据库来说,在已打开的事务中调用 BeginTrans 方法
  890. 将开始新的嵌套事务。返回值将指示嵌套层次:返回值为 1 表示已打开顶层事务
  891. (即事务不被另一个事务所嵌套),返回值为 2 表示已打开第二层事务(嵌套
  892. 在顶层事务中的事务),依次类推。调用 CommitTrans 或 RollbackTrans 只影
  893. 响最新打开的事务;在处理任何更高层事务之前必须关闭或回卷当前事务。
  894. 调用 CommitTrans 方法将保存连接上打开的事务中所做的更改并结束事务。
  895. 调用 RollbackTrans方法还原打开事务中所做的更改并结束事务。在未打开事务
  896. 时调用其中任何一种方法都将引发错误。
  897. 取决于 Connection 对象的 Attributes 属性,调用 CommitTrans 或 
  898. RollbackTrans 方法都可以自动启动新事务。如果 Attributes 属性设置为 
  899. adXactCommitRetaining,数据库在 CommitTrans 调用后会自动启动新事务。
  900. 如果 Attributes 属性设置为 adXactAbortRetaining,数据库在调用 
  901. RollbackTrans 之后将自动启动新事务。
  902.   ########################################################################*/
  903. /*========================================================================
  904.     Name: 保存任何更改并结束当前事务.
  905. -----------------------------------------------------
  906. Remarks: 调用 CommitTrans 或 RollbackTrans 只影响最新打开的事务; 在
  907. 处理任何更高层事务之前必须关闭或回卷当前事务.
  908. ==========================================================================*/
  909. BOOL CAdoConnection::CommitTrans()
  910. {
  911. ASSERT(m_pConnection != NULL);
  912. try
  913. {
  914. return SUCCEEDED(m_pConnection->CommitTrans());
  915. }
  916. catch (_com_error e)
  917. {
  918. TRACE(_T("Warning: CommitTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  919. return FALSE;
  920. return FALSE;
  921. }
  922. /*========================================================================
  923.     Name: 取消当前事务中所作的任何更改并结束事务.
  924. ==========================================================================*/
  925. BOOL CAdoConnection::RollbackTrans()
  926. {
  927. ASSERT(m_pConnection != NULL);
  928. try
  929. {
  930. return SUCCEEDED(m_pConnection->RollbackTrans());
  931. }
  932. catch (_com_error e)
  933. {
  934. TRACE(_T("Warning: RollbackTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %dn"), e.ErrorMessage(), __FILE__, __LINE__);
  935. return FALSE;
  936. return FALSE;
  937. }