上一篇文章介绍了Visual C++ 2010对SQL SERVER 2008进行连接,我们建立了一个MFC程序,其中把基类CView替换成了CListView,这篇文章小菜进行数据获取和访问。
1:首先我们对客户区进行修改,使其具有类似Excel的数据格网风格
我们对OnInitialUpdate()进行修改
void CADOView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& m_list = GetListCtrl(); //得到内置的listctrl引用
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE); //获取当前窗口风格
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置报表风格
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); //设置窗口风格
DWORD dwStyle = m_list.GetExtendedStyle();
//选中某行使整行高亮(只适用于报表风格的listctrl)
dwStyle |= LVS_EX_FULLROWSELECT;
dwStyle |= LVS_EX_GRIDLINES; //网格线(只适用与报表风格的listctrl)
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
m_list.SetBkColor(RGB(200, 200, 200)); //设置背景颜色
m_list.SetTextBkColor(RGB(200, 200, 200)); //设置文本背景颜色
m_list.SetTextColor(RGB(10, 10, 80)); //设置文本颜色
CRect rectWindow;
this->GetWindowRect(&rectWindow); // 获取客户区窗口大小
int width = (rectWindow.right - rectWindow.left)/10; // 设置列宽 ,在客户区只能显示10列
for(int i=0;i<10;i++)
{
m_list.InsertColumn(i,L"",LVCFMT_CENTER,width);
}
this->ConnectSQL(L"EX3",L"FREE",L"523715");
}
2.然后根据自己的功能,实现函数即可,如果需要对CListCtrl进行操作,只需要调用CListView的成员函数GetListCtrl()即可以获得内置CListCtrl对象的引用。
3.数据获取,下面代码演示了显示数据库学生表中,学号和姓名的全部数据
void CADOView::OnShowstu()
{
_variant_t vSname,vSID; //变量声明
CString str;
m_recordset.CreateInstance(__uuidof( Recordset )); //创建实例
//执行SQL语句,得到记录集, connection必须已和数据库连接
m_recordset->Open("SELECT * FROM 学生",m_connection.GetInterfacePtr(),
adOpenStatic,adLockOptimistic,adCmdText);
CListCtrl& list = this->GetListCtrl();//得到listview内置listctrl的引用
int nRow = list.InsertItem(0, L"学号");
list.SetItemText(nRow, 1, L"姓名");
while(!m_recordset->EndOfFile) // no_namespace rename("EOF","EndOfFile") 这是在导入DLL时指定的
{
nRow = list.InsertItem(list.GetItemCount(),str); // 获取当前所在行数
vSID = m_recordset->GetCollect("学号"); //取得username字段的值
str = (TCHAR*)(_bstr_t)vSID;
list.SetItemText(nRow, 0,str ); // 数据输出nRow行,0列
vSname = m_recordset->GetCollect("姓名"); //取得username字段的值
str = (TCHAR*)(_bstr_t)vSname;
list.SetItemText(nRow, 1,str );
m_recordset->MoveNext(); // 获得下一个数据
}
}
Open方法的原型是这样的:
HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection,
enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )
①Source是数据查询字符串
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
enum CursorTypeEnum
{
adOpenUnspecified = -1,///不作特别指定
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这
种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的
操作对你是可见的。
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操
作对你的记录集来说是不可见的。
};
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
enum LockTypeEnum
{
adLockUnspecified = -1,///未指定
adLockReadOnly = 1,///只读记录集
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数
据的更新、插入、删除等动作
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式
下完成。
};
5.option可以取以下值
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知