1 //rename作用:解决EOF重定义问题,dll中定义的EOF和程序定义的EOF冲突
2 /*no_namespace作用:
3 #import msado15.dll 生成文件 msado15.tlh,默认是有namespace ADODB {},
4 所有内容都包在这个名字空间中,访问时需要输入命名空间;
5 用了no_namespace 生成的头文件中没有namespace,所有内容是全局的,方便访问。
6 也可以使用 using namespace ADODB。
7 */
8 #import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" rename("EOF", "adoEOF") no_namespace
9 //using namespace ADODB;
10
11 /*CONNSTRING生成过程:
12 新建一个记事本文件,后缀改为udl,然后双击打开,配置好后用记事本打开,即可得到CONNSTRING
13 */
14 #define CONNSTRING "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=."
15
16
17 void CMy2014_09_11Dlg::OnBtnSelect()
18 {
19 //清空listview
20 m_ctrlResult.DeleteAllItems();
21
22 //COM初始化
23 CoInitialize(NULL);
24
25 //定义连接对象的智能指针
26 _ConnectionPtr conn;
27 //定义记录集对象的智能指针
28 _RecordsetPtr rs;
29
30 try
31 {
32 HRESULT hr;
33
34 //创建连接对象(智能指针初始化,. 表示调用智能指针的成员函数)
35 //{00000514-0000-0010-8000-00AA006D2EA4}
36 hr = conn.CreateInstance("ADODB.Connection");
37
38 //连接数据库(-> 表示调用智能指针指向对象的成员函数,即调用连接对象的成员函数)
39 hr = conn->Open(CONNSTRING, "", "", adConnectUnspecified);
40
41 //构造查询语句
42 UpdateData(TRUE);
43 CString strSQL = "select * from t_student where 1 = 1";
44 if (m_strSno.Compare("*") != 0)
45 {
46 CString strChild = " and sno = '"+ m_strSno +"'";
47 strSQL += strChild;
48 }
49 if (m_strSname.Compare("*") != 0)
50 {
51 CString strChild = " and sname = '"+ m_strSname +"'";
52 strSQL += strChild;
53 }
54 if (m_strSex.Compare("*") != 0)
55 {
56 CString strChild = " and sex = '"+ m_strSex +"'";
57 strSQL += strChild;
58 }
59 if (m_strBirthday.Compare("*") != 0)
60 {
61 CString strChild = " and birthday = '"+ m_strBirthday +"'";
62 strSQL += strChild;
63 }
64
65 //执行命令
66 rs = conn->Execute(strSQL.GetBuffer(0), NULL, adOptionUnspecified);
67
68 //获取字段数量
69 int nCount = rs->Fields->GetCount();
70
71 //获取并输出数据
72 HWND hList = m_ctrlResult.GetSafeHwnd();
73 LVITEM lvi = {0};
74 lvi.mask = LVIF_TEXT;
75 while(!rs->adoEOF)
76 {
77 int nIndex = 0;
78 for (int i = 0; i < nCount; i++)
79 {
80 if (i == 0)
81 {
82 lvi.iItem = nIndex;
83 //发送LVM_INSERTITEM消息时,subitem必须为0
84 lvi.iSubItem = i;
85 CString strTmp = (char*)(_bstr_t)rs->Fields->Item[(long)i]->Value;
86 lvi.pszText = strTmp.GetBuffer(0);
87 //返回值为item的索引
88 nIndex = ::SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&lvi);
89 }
90 else
91 {
92 lvi.iItem = nIndex;
93 lvi.iSubItem = i;
94 CString strTmp = (char*)(_bstr_t)rs->Fields->Item[(long)i]->Value;
95 lvi.pszText = strTmp.GetBuffer(0);
96 ::SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvi);
97 }
98 }
99
100 rs->MoveNext();
101 }
102
103 }
104 catch (_com_error e)
105 {
106 MessageBox(e.Description());
107 }
108
109 //关闭连接
110 conn->Close();
111
112 //COM反初始化
113 CoUninitialize();
114 }