ADOConn.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:19k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "ADOConn.h"
  3. //功能:构造函数
  4. //strData:数据库的名字
  5. CString CADOConn::GetAppPath()
  6. {
  7. char lpFileName[MAX_PATH];
  8. GetModuleFileName(AfxGetInstanceHandle(),lpFileName,MAX_PATH);
  9. CString strFileName = lpFileName;
  10. int nIndex = strFileName.ReverseFind ('\');
  11. CString strPath;
  12. if (nIndex > 0)
  13. strPath = strFileName.Left (nIndex);
  14. else
  15. strPath = "";
  16. return strPath;
  17. }
  18. CADOConn::CADOConn(CString strData)
  19. {
  20. CString strValue;
  21. strData.TrimLeft();
  22. strData.TrimRight();
  23. m_strData=_bstr_t(strData);
  24. strValue=strData.Right(3);
  25. if(strValue=="mdb") m_DataType=1;
  26. if(strValue=="xls") m_DataType=2;
  27. }
  28. CADOConn::CADOConn()
  29. {
  30. m_DataType=3;
  31. }
  32. //功能:析构函数
  33. CADOConn::~CADOConn()
  34. {
  35. }
  36. //功能:初始化数据库连接
  37. void  CADOConn::OnInitCADOConn()
  38. {
  39. // 初始化OLE/COM库环境
  40. ::CoInitialize(NULL);
  41.   try
  42. {
  43. //初始化指针
  44. m_pConnection=NULL;
  45. //初始化指针
  46. m_pRecordset=NULL;
  47. // 创建Connection对象
  48. m_pConnection.CreateInstance("ADODB.Connection");
  49. // 设置连接字符串,必须是BSTR型或者_bstr_t类型
  50. _bstr_t strConnect;
  51. switch(m_DataType)
  52. {
  53. case 1://ACCESS
  54. strConnect=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;");
  55. strConnect=strConnect+_bstr_t("Data Source=");
  56. strConnect=strConnect+_bstr_t(GetAppPath())+_bstr_t("\");
  57. strConnect=strConnect+m_strData;
  58. break;
  59. case 2://EXCEL
  60. strConnect=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;");
  61. strConnect=strConnect+_bstr_t("Data Source=");
  62. strConnect=strConnect+_bstr_t(GetAppPath())+_bstr_t("\");
  63. strConnect=strConnect+m_strData;
  64. strConnect=strConnect+";Extended Properties=Excel 8.0";
  65. break;
  66. case 3://SQLSERVER
  67. strConnect=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;");
  68. strConnect=strConnect+_bstr_t("Data Source=D:\FECG\");
  69. strConnect=strConnect+";Extended Properties=Excel 8.0";
  70. break;
  71. }
  72. m_pConnection->Open(strConnect,_bstr_t(""),_bstr_t(""),adModeUnknown);
  73. }
  74. // 捕捉异常
  75. catch(_com_error e)
  76. {
  77. // 显示错误信息
  78. AfxMessageBox(e.Description());
  79. }
  80. ASSERT(m_pConnection != NULL);
  81. }
  82. //功能:执行查询
  83. //返回值:字段集的指针
  84. _RecordsetPtr&  CADOConn::GetRecordSet(CString strSQL)
  85. {
  86. try
  87. {
  88. // 连接数据库,如果Connection对象为空,则重新连接数据库
  89. if(m_pConnection==NULL)OnInitCADOConn();
  90. strSQL.TrimLeft();
  91. strSQL.TrimRight();
  92. // 创建记录集对象
  93. m_pRecordset.CreateInstance(__uuidof(Recordset));
  94. // 取得表中的记录
  95. m_pRecordset->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  96. }
  97. // 捕捉异常
  98. catch(_com_error e)
  99. {
  100. // 显示错误信息
  101. AfxMessageBox(e.Description());
  102. }
  103. ASSERT(m_pRecordset!= NULL);
  104. // 返回记录集
  105. return m_pRecordset;
  106. }
  107. //功能:打开字符集
  108. //返回值:TRUE:成功 FALSE:失败
  109. BOOL CADOConn::Open(CString strSQL)
  110. {
  111. try
  112. {
  113. // 连接数据库,如果Connection对象为空,则重新连接数据库
  114. if(m_pConnection==NULL) OnInitCADOConn();
  115. strSQL.TrimLeft();
  116. strSQL.TrimRight();
  117. // 创建记录集对象
  118. m_pRecordset.CreateInstance(__uuidof(Recordset));
  119. // 取得表中的记录
  120. m_pRecordset->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  121. }
  122. // 捕捉异常
  123. catch(_com_error e)
  124. {
  125. // 显示错误信息
  126. AfxMessageBox(e.Description());
  127. return FALSE;
  128. }
  129. // 返回记录集
  130. ASSERT(m_pRecordset!= NULL);
  131. return TRUE;
  132. }
  133. //功能:记录集移向开头
  134. //返回值:TRUE:成功 FALSE:失败
  135. BOOL CADOConn::MoveFirst()
  136. {
  137. if(m_pRecordset==NULL) 
  138. return FALSE;
  139. else
  140. {
  141. m_pRecordset->MoveFirst();
  142. return TRUE;
  143. }
  144. }
  145. //功能:记录集向下移动
  146. //返回值:TRUE:成功 FALSE:失败
  147. BOOL CADOConn::MoveNext()
  148. {
  149. if(m_pRecordset==NULL) 
  150. return FALSE;
  151. else
  152. {
  153. if (!m_pRecordset->adoEOF)
  154. {
  155. m_pRecordset->MoveNext();
  156. return TRUE;
  157. }
  158. else
  159. return FALSE;
  160. }
  161. }
  162. //功能:取得字段中的字符串
  163. //index:字段集中的索引
  164. //strSum:返回的字符的长度(<=实际:代表全部返回,>实际:左补空格)
  165. CString CADOConn::GetValueString(int index,int strSum)
  166. {
  167. _variant_t vValue;//var型返回值
  168. _variant_t vIndex;//索引
  169. CString strValue,strType,str;//strValue:初始返回值 strType:格式化字符串 str:最终返回值
  170. vIndex.vt=VT_I2;
  171. vIndex.iVal=index;
  172. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  173. switch(vValue.vt)
  174. {
  175. case VT_NULL:
  176. str="";
  177. break;
  178. case VT_ERROR:
  179. str="";
  180. break;
  181. case VT_EMPTY:
  182. str="";
  183. break;
  184. default:
  185. str=(LPCSTR)_bstr_t(vValue);
  186. }
  187. strType.Format("%d",strSum);
  188. strType="%"+strType+"s";
  189. strValue.Format(strType,str);
  190. return strValue;
  191. }
  192. //功能:取得字段中的字节型整数
  193. //index:字段集中的索引
  194. byte CADOConn::GetValueByte(int index)
  195. {
  196. _variant_t vValue;//var型返回值
  197. _variant_t vIndex;//索引
  198. byte bValue;//数值返回值
  199. vIndex.vt=VT_I2;
  200. vIndex.iVal=index;
  201. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  202. switch(vValue.vt)
  203. {
  204. case VT_NULL:
  205. bValue=0;
  206. break;
  207. case VT_ERROR:
  208. bValue=0;
  209. break;
  210. case VT_EMPTY:
  211. bValue=0;
  212. break;
  213. default:
  214. bValue=vValue.bVal;
  215. }
  216. return bValue;
  217. }
  218. //功能:取得字段中的字节型整数的字符串形式
  219. //index:字段集中的索引
  220. //strSum:返回的字符的长度(<=实际:代表全部返回,>实际:左补空格)
  221. CString CADOConn::GetValueByteStr (int index,int strSum)
  222. {
  223. _variant_t vValue;//var型返回值
  224. _variant_t vIndex;//索引
  225. byte bValue;//数值返回值
  226. CString strValue,strType;//strValue:字符串返回值 strType:格式化字符串
  227. vIndex.vt=VT_I2;
  228. vIndex.iVal=index;
  229. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  230. switch(vValue.vt)
  231. {
  232. case VT_NULL:
  233. bValue=0;
  234. break;
  235. case VT_ERROR:
  236. bValue=0;
  237. break;
  238. case VT_EMPTY:
  239. bValue=0;
  240. break;
  241. default:
  242. bValue=vValue.bVal;
  243. }
  244. strType.Format("%d",strSum);
  245. strType="%"+strType+"d";
  246. strValue.Format(strType,bValue);
  247. return strValue;
  248. }
  249. //功能:取得字段中的短整型整数
  250. //index:字段集中的索引
  251. int CADOConn::GetValueInt(int index)
  252. {
  253. _variant_t vValue;//var型返回值
  254. _variant_t vIndex;//索引
  255. int iValue;//数值返回值
  256. vIndex.vt=VT_I2;
  257. vIndex.iVal=index;
  258. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  259. switch(vValue.vt)
  260. {
  261. case VT_NULL:
  262. iValue=0;
  263. break;
  264. case VT_ERROR:
  265. iValue=0;
  266. break;
  267. case VT_EMPTY:
  268. iValue=0;
  269. break;
  270. default:
  271. iValue=vValue.iVal;
  272. }
  273. return iValue;
  274. }
  275. //功能:取得字段中的短整型整数的字符串形式
  276. //index:字段集中的索引
  277. //strSum:返回的字符的长度(<=实际:代表全部返回,>实际:左补空格)
  278. CString CADOConn::GetValueIntStr(int index,int strSum)
  279. {
  280. _variant_t vValue;//var型返回值
  281. _variant_t vIndex;//索引
  282. int iValue;//数值返回值
  283. CString strValue,strType;//strValue:字符串返回值 strType:格式化字符串
  284. vIndex.vt=VT_I2;
  285. vIndex.iVal=index;
  286. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  287. switch(vValue.vt)
  288. {
  289. case VT_NULL:
  290. iValue=0;
  291. break;
  292. case VT_ERROR:
  293. iValue=0;
  294. break;
  295. case VT_EMPTY:
  296. iValue=0;
  297. break;
  298. default:
  299. iValue=vValue.iVal;
  300. }
  301. strType.Format("%d",strSum);
  302. strType="%"+strType+"d";
  303. strValue.Format(strType,iValue);
  304. return strValue;
  305. }
  306. //功能:取得字段中的双精度浮点数
  307. //index:字段集中的索引
  308. double CADOConn::GetValueDouble(int index)
  309. {
  310. _variant_t vValue;//var型返回值
  311. _variant_t vIndex;//索引
  312. double dValue;//数值返回值
  313. vIndex.vt=VT_I2;
  314. vIndex.iVal=index;
  315. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  316. switch(vValue.vt)
  317. {
  318. case VT_NULL:
  319. dValue=0;
  320. break;
  321. case VT_ERROR:
  322. dValue=0;
  323. break;
  324. case VT_EMPTY:
  325. dValue=0;
  326. break;
  327. default:
  328. dValue=vValue.dblVal;
  329. }
  330. return dValue;
  331. }
  332. //功能:取得字段中的双精度浮点数的字符串形式
  333. //index:字段集中的索引
  334. //strLSum(整数部分):返回的整数部分的长度(<=实际:代表全部返回,>实际:左补空格)
  335. //strRSum(小数部分):返回的小数部分的长度(<=实际:代表全部返回,>实际:右补空格)
  336. CString CADOConn::GetValueDoubleStr(int index,int strLSum,int strRSum)
  337. {
  338. _variant_t vValue;//var型返回值
  339. _variant_t vIndex;//索引
  340. double dValue;//数值返回值
  341. CString strValue,strType;//strValue:字符串返回值 strType:格式化字符串
  342. vIndex.vt=VT_I2;
  343. vIndex.iVal=index;
  344. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  345. switch(vValue.vt)
  346. {
  347. case VT_NULL:
  348. dValue=0;
  349. break;
  350. case VT_ERROR:
  351. dValue=0;
  352. break;
  353. case VT_EMPTY:
  354. dValue=0;
  355. break;
  356. default:
  357. dValue=vValue.dblVal;
  358. }
  359. strType.Format("%d.%d",strLSum,strRSum);
  360. strType="%"+strType+"f";
  361. strValue.Format(strType,dValue);
  362. return strValue;
  363. }
  364. //功能:取得字段中的单精度浮点数
  365. //index:字段集中的索引
  366. float CADOConn::GetValueFloat(int index)
  367. {
  368. _variant_t vValue;//var型返回值
  369. _variant_t vIndex;//索引
  370. float fValue;//数值返回值
  371. vIndex.vt=VT_I2;
  372. vIndex.iVal=index;
  373. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  374. switch(vValue.vt)
  375. {
  376. case VT_NULL:
  377. fValue=0;
  378. break;
  379. case VT_ERROR:
  380. fValue=0;
  381. break;
  382. case VT_EMPTY:
  383. fValue=0;
  384. break;
  385. default:
  386. fValue=vValue.fltVal;
  387. }
  388. return fValue;
  389. }
  390. //功能:取得字段中的单精度浮点数的字符串形式
  391. //index:字段集中的索引
  392. //strLSum(整数部分):返回的整数部分的长度(<=实际:代表全部返回,>实际:左补空格)
  393. //strRSum(小数部分):返回的小数部分的长度(<=实际:代表全部返回,>实际:右补空格)
  394. CString CADOConn::GetValueFloatStr(int index,int strLSum,int strRSum)
  395. {
  396. _variant_t vValue;//var型返回值
  397. _variant_t vIndex;//索引
  398. float fValue;//数值返回值
  399. CString strValue,strType;//strValue:字符串返回值 strType:格式化字符串
  400. vIndex.vt=VT_I2;
  401. vIndex.iVal=index;
  402. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  403. switch(vValue.vt)
  404. {
  405. case VT_NULL:
  406. fValue=0;
  407. break;
  408. case VT_ERROR:
  409. fValue=0;
  410. break;
  411. case VT_EMPTY:
  412. fValue=0;
  413. break;
  414. default:
  415. fValue=vValue.fltVal;
  416. }
  417. strType.Format("%d.%d",strLSum,strRSum);
  418. strType="%"+strType+"f";
  419. strValue.Format(strType,fValue);
  420. return strValue;
  421. }
  422. //功能:取得字段中的长整型整数的字符串
  423. //index:字段集中的索引
  424. long CADOConn::GetValueLong(int index)
  425. {
  426. _variant_t vValue;//var型返回值
  427. _variant_t vIndex;//索引
  428. long lValue;//数值返回值
  429. vIndex.vt=VT_I2;
  430. vIndex.iVal=index;
  431. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  432. switch(vValue.vt)
  433. {
  434. case VT_NULL:
  435. lValue=0;
  436. break;
  437. case VT_ERROR:
  438. lValue=0;
  439. break;
  440. case VT_EMPTY:
  441. lValue=0;
  442. break;
  443. default:
  444. lValue=vValue.lVal;
  445. }
  446. return lValue;
  447. }
  448. //功能:取得字段中的长整型整数的字符串形式
  449. //index:字段集中的索引
  450. //strSum:返回的字符的长度(<=实际:代表全部返回,>实际:左补空格)
  451. CString CADOConn::GetValueLongStr(int index,int strSum)
  452. {
  453. _variant_t vValue;//var型返回值
  454. _variant_t vIndex;//索引
  455. long lValue;//数值返回值
  456. CString strValue,strType;//strValue:字符串返回值 strType:格式化字符串
  457. vIndex.vt=VT_I2;
  458. vIndex.iVal=index;
  459. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  460. switch(vValue.vt)
  461. {
  462. case VT_NULL:
  463. lValue=0;
  464. break;
  465. case VT_ERROR:
  466. lValue=0;
  467. break;
  468. case VT_EMPTY:
  469. lValue=0;
  470. break;
  471. default:
  472. lValue=vValue.lVal;
  473. }
  474. strType.Format("%d",strSum);
  475. strType="%"+strType+"d";
  476. strValue.Format(strType,lValue);
  477. return strValue;
  478. }
  479. //返回时间型值
  480. //数据库中存的格式为字符串(yyyy-mm-dd HH-MM-SS)
  481. CTime CADOConn::GetValueDate(int index)
  482. {
  483. _variant_t vValue;//var型返回值
  484. _variant_t vIndex;//索引
  485. CString strValue;//数值返回值
  486. vIndex.vt=VT_I2;
  487. vIndex.iVal=index;
  488. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  489. switch(vValue.vt)
  490. {
  491. case VT_NULL:
  492. strValue="1980-08-08";
  493. break;
  494. case VT_ERROR:
  495. strValue="1980-08-08";
  496. break;
  497. case VT_EMPTY:
  498. strValue="1980-08-08";
  499. break;
  500. default:
  501. strValue=(LPCSTR)_bstr_t(vValue);
  502. break;
  503. }
  504. CString strYear,strMonth,strDay,strHour,strMin,strSec;
  505. strYear=strValue.Mid(0,4);
  506. strMonth=strValue.Mid(5,2);
  507. strDay=strValue.Mid(8,2);
  508. if(strValue.GetLength()>10)
  509. {
  510. strHour=strValue.Mid(11,2);
  511. strMin=strValue.Mid(14,2);
  512. strSec=strValue.Mid(17,2);
  513. }
  514. else
  515. {
  516. strHour="0";
  517. strMin="0";
  518. strSec="0";
  519. }
  520. CTime TValue(atoi(strYear),atoi(strMonth),atoi(strDay),atoi(strHour),atoi(strMin),atoi(strSec));
  521. return TValue;
  522. }
  523. //返回时间型值的字符串
  524. //数据库中存的格式为字符串(yyyy-mm-dd HH-MM-SS)
  525. CString CADOConn::GetValueDateStr(int index,CString strType)
  526. {
  527. _variant_t vValue;//var型返回值
  528. _variant_t vIndex;//索引
  529. CString strValue="";//数值返回值
  530. vIndex.vt=VT_I2;
  531. vIndex.iVal=index;
  532. vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;
  533. switch(vValue.vt)
  534. {
  535. case VT_NULL:
  536. strValue="1980-08-08";
  537. break;
  538. case VT_ERROR:
  539. strValue="1980-08-08";
  540. break;
  541. case VT_EMPTY:
  542. strValue="1980-08-08";
  543. break;
  544. default:
  545. strValue=(LPCSTR)_bstr_t(vValue);
  546. break;
  547. }
  548. CString strYear,strMonth,strDay,strHour,strMin,strSec;
  549. strYear=strValue.Mid(0,4);
  550. strMonth=strValue.Mid(5,2);
  551. strDay=strValue.Mid(8,2);
  552. if(strValue.GetLength()>10)
  553. {
  554. strHour=strValue.Mid(11,2);
  555. strMin=strValue.Mid(14,2);
  556. strSec=strValue.Mid(17,2);
  557. }
  558. else
  559. {
  560. strHour="0";
  561. strMin="0";
  562. strSec="0";
  563. }
  564. CTime TValue(atoi(strYear),atoi(strMonth),atoi(strDay),atoi(strHour),atoi(strMin),atoi(strSec));
  565. CString str=TValue.Format(strType);
  566. return str;
  567. }
  568. //功能:执行SQL语句(Insert Update delete)
  569. //strSQL:SQL语句
  570. //返回值:TRUE:成功 FALSE:失败
  571. BOOL CADOConn::ExecuteSQL(CString strSQL)
  572. {
  573. try
  574. {
  575. // 是否已经连接数据库
  576. if(m_pConnection == NULL) OnInitCADOConn();
  577. strSQL.TrimLeft();
  578. strSQL.TrimRight();
  579. m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);
  580. return TRUE;
  581. }
  582. catch(_com_error e)
  583. {
  584. AfxMessageBox(e.Description());
  585. return FALSE;
  586. }
  587. }
  588. //功能:退出连接
  589. void CADOConn::ExitConnect()
  590. {
  591. try
  592. {
  593. if (m_pRecordset !=NULL) m_pRecordset->Close();
  594. if (m_pConnection !=NULL) m_pConnection->Close();
  595. // 释放环境
  596. ::CoUninitialize();
  597. }
  598. catch (_com_error e) 
  599. {
  600. AfxMessageBox(e.Description());
  601. }
  602. }
  603. //功能:向一表中添加一行数据
  604. //strTable:表名
  605. //strSum:表中字段集的数目
  606. //pszText...:strSum个数据字符串
  607. //返回值:TRUE:成功 FALSE:错误
  608. BOOL CADOConn::AddItem(CString strTable,int strSum,LPCTSTR pszText, ... )
  609. {
  610. strTable.TrimLeft();
  611. strTable.TrimRight();
  612. CString strSQL="select * from "+strTable;
  613. CString strFirst=pszText;
  614. LPTSTR* arrpsz = new LPTSTR[strSum];//初始化一列表存放数据
  615. arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
  616. (void)lstrcpy( arrpsz[ 0 ], pszText );
  617.   va_list list;
  618. va_start( list, pszText );//向列表填充数据
  619. Open(strSQL);//字符集类型的查找
  620. strSQL="insert into "+strTable+" values(";
  621. int iType;
  622. iType=GetValueType(0);
  623. if (iType==ado_Field_Str||iType==ado_Field_Text||iType==ado_Field_Date)
  624. strSQL=strSQL+"'"+strFirst+"',";//字符型
  625. else
  626. {
  627. if(strFirst=="") strFirst="0";
  628. strSQL=strSQL+strFirst+",";//数字型
  629. }
  630. for( int iColumn = 1; iColumn <strSum; iColumn++ )
  631. {
  632. pszText = va_arg( list, LPCTSTR );
  633. ASSERT_VALID_STRING( pszText );
  634. iType=GetValueType(iColumn);
  635. if (iType==ado_Field_Str||iType==ado_Field_Text||iType==ado_Field_Date)
  636. strSQL=strSQL+"'"+pszText+"',";
  637. else
  638. {
  639. CString strValue=pszText;
  640. if(strValue=="") strValue="0";
  641. strSQL=strSQL+strValue+",";
  642. }
  643. arrpsz[ iColumn ] = new TCHAR[ lstrlen( pszText ) + 1 ];
  644. (void)lstrcpy( arrpsz[ iColumn ], pszText );
  645. }
  646. va_end( list );
  647. //开始执行
  648. strSQL=strSQL.Left(strSQL.GetLength()-1)+")";
  649. try
  650. {
  651. //执行插入操作
  652. m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);
  653. return TRUE;
  654. }
  655. catch(_com_error e)
  656. {
  657. AfxMessageBox(e.Description());
  658. return FALSE;
  659. }
  660. }
  661. //功能:返回索引为Index时的数据的类型
  662. //返回值:数据类型
  663. int CADOConn::GetValueType(int index)
  664. {
  665. _variant_t vIndex;
  666. int Tpye;
  667. vIndex.vt=VT_I2;
  668. vIndex.iVal=index;
  669. Tpye=m_pRecordset->Fields->GetItem(vIndex)->GetType();
  670. return Tpye;
  671. }
  672. //功能:判断字段集是否结束
  673. //返回值:TRUE:结束 FALSE:未结束
  674. BOOL CADOConn::adoEOF()
  675. {
  676. if(m_pRecordset->adoEOF)
  677. return TRUE;
  678. else
  679. return FALSE;
  680. }
  681. //功能:填充列表
  682. //listMain:列表指针 ColOpenEnd:代表展开多少列
  683. //返回值:TRUE:成功 FALSE:失败
  684. BOOL CADOConn::FillList(CListCtrl *listMain,int ColOpenEnd)
  685. {
  686. int i,iType,iRow=0,listWidth=0;//iType:字段集的数据类型 listWidth:列表中列的宽度
  687. long lMax=0;
  688. _variant_t vIndex;
  689. lMax=m_pRecordset->Fields->Count;
  690. vIndex.vt=VT_I2;
  691. listMain->SetExtendedStyle( LVS_EX_FULLROWSELECT);
  692. listMain->DeleteAllItems();
  693. for(i=0;i<100;i++)
  694. listMain->DeleteColumn(i);
  695. for(i=0;i<lMax;i++)
  696. {
  697. CString strTitle="";
  698. vIndex.iVal=i;
  699. strTitle=(LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName();
  700. listMain->InsertColumn(i,strTitle,LVCFMT_CENTER,100,0);
  701. }
  702. if(!m_pRecordset->adoEOF)
  703. {
  704. MoveFirst();
  705. while (!m_pRecordset->adoEOF)
  706. {
  707. for (i=0;i<lMax;i++)
  708. {
  709. CString strValue="";
  710. vIndex.iVal=i;
  711. iType=m_pRecordset->Fields->GetItem(vIndex)->GetType();
  712. switch(iType)
  713. {
  714. case ado_Field_Str:
  715. case ado_Field_Text:
  716. strValue=GetValueString(i,0);
  717. break;
  718. case ado_Field_Long:
  719. strValue=GetValueLongStr(i,0);
  720. break;
  721. case ado_Field_Int:
  722. strValue=GetValueIntStr(i,0);
  723. break;
  724. case ado_Field_Float:
  725. strValue=GetValueFloatStr(i,0,2);
  726. break;
  727. case ado_Field_Double:
  728. strValue=GetValueDoubleStr(i,0,2);
  729. break;
  730. case ado_Field_Byte:
  731. strValue=GetValueByteStr(i,0);
  732. break;
  733. case ado_Field_Date:
  734. strValue=GetValueString(i,0);
  735. break;
  736. default:
  737. strValue="";
  738. break;
  739. }
  740. if(m_DataType==2)
  741. strValue=GetValueString(i,0);
  742. if(i==0)
  743. listMain->InsertItem(iRow,strValue,0);
  744. else
  745. listMain->SetItemText(iRow,i,strValue);
  746. }
  747. m_pRecordset->MoveNext();
  748. iRow=iRow+1;
  749. }
  750. //移向开头
  751. MoveFirst();
  752. }
  753. if(listMain->GetItemCount()>0)
  754. {
  755. if(ColOpenEnd>0)
  756. {
  757. for(int i=0;i<ColOpenEnd;i++)
  758. {
  759. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE);
  760. listWidth=listMain->GetColumnWidth(i);
  761. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
  762. if(listWidth<listMain->GetColumnWidth(i))
  763. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
  764. }
  765. }
  766. else
  767. {
  768. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
  769. }
  770. }
  771. else
  772. {
  773. for(i=0;i<lMax;i++)
  774. {
  775. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
  776. listWidth=listWidth+listMain->GetColumnWidth(i);
  777. }
  778. RECT rectList;
  779. listMain->GetWindowRect(&rectList);
  780. if(listWidth<(rectList.right-rectList.left))
  781. {
  782. listWidth=(rectList.right-rectList.left-listWidth)/11;
  783. listMain->SetColumnWidth(i,listMain->GetColumnWidth(i)+listWidth);
  784. }
  785. }
  786. return TRUE;
  787. }
  788. //功能:初始化自动排列列表
  789. //CListCtrl:列表指针;colSum:列表中已经存在列数
  790. BOOL CADOConn::InitList(CListCtrl *listMain,int colSum)
  791. {
  792. int intWidth=0;
  793. int i;
  794. for(i=0;i<colSum;i++)
  795. {
  796. listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);
  797. intWidth=intWidth+listMain->GetColumnWidth(i);
  798. }
  799. RECT rectList;
  800. listMain->GetWindowRect(&rectList);
  801. if(intWidth<(rectList.right-rectList.left))
  802. {
  803. intWidth=(rectList.right-rectList.left-intWidth)/colSum;
  804. listMain->SetColumnWidth(i,listMain->GetColumnWidth(i)+intWidth);
  805. }
  806. return TRUE;
  807. }