Visual C++ 2010获取SQL SERVER 2008数据并显示

来源:互联网 发布:手机淘宝如何消除差评 编辑:程序博客网 时间:2024/05/16 07:43

      上一篇文章介绍了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:未知

原创粉丝点击