VC++使用ADO操作SQL Server数据库



VC++使用ADO连接SQL Server数据库:http://hi.baidu.com/zhaquanmin/blog/item/255584458b7dd345510ffe92.html

对于前面一篇VC++使用ADO连接SQL Server数据库,我们还需要做显示,添加,修改和删除等功能,实现对数据库执行一定操作。本文使用的数据库为前面数据库suntest中的表“仓库3”,用ADO实现对SQL Server数据库基本操作。

显示功能测试是否连接成功:
1. 在Dialog资源上加入一个ListControl控件。ListControl控件对应的变量m_grid。ListControl控件属性设置:选择Report报表显示,选择Single selection,Auto arrange、No label warp、Client edge等项。

2.添加数据库类ADOConn,在OnInitDialog函数中遍历记录集,通过ListControl控件显示。在OnInitDialog()函数中添加代码如下:
BOOL C***Dlg::OnInitDialog()
{
……
// FOR LIST CONTROL SET STYLE
m_grid.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP
   |LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);
// FOR LIST CONTROL SET TABLE HEAD
m_grid.InsertColumn(0,"仓库编号",LVCFMT_LEFT,100,0);
m_grid.InsertColumn(1,"仓库号",LVCFMT_LEFT,100,1);
m_grid.InsertColumn(2,"城市",LVCFMT_LEFT,100,2);
m_grid.InsertColumn(3,"面积",LVCFMT_LEFT,100,3);
AddToGrid();
……
return true;
}

3.写个单独函数AddToGrid(),目的更新ListControl控件的内容。
void C***Dlg::AddToGrid()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select * from 仓库3 order by 仓库编号 desc");
_RecordsetPtr m_pRecordset;
//打开记录集
m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
//遍历记录集

while(m_AdoConn.m_pRecordset->adoEOF == 0)
{
   m_grid.InsertItem(0,"");
   m_grid.SetItemText(0,0,(char *)(_bstr_t)m_pRecordset->GetCollect("仓库编号"));
   m_grid.SetItemText(0,1,(char *)(_bstr_t)m_pRecordset->GetCollect("仓库号"));
   m_grid.SetItemText(0,2,(char *)(_bstr_t)m_pRecordset->GetCollect("城市"));
   m_grid.SetItemText(0,3,(char *)(_bstr_t)m_pRecordset->GetCollect("面积"));

   m_pRecordset->MoveNext();
}
//断开数据库连接
m_AdoConn.ExitConnect();
}

4.这样运行,数据库信息能显示在CListControl中,连接成功。

添加功能:

1.增加一个添加button,还有"仓库编号"的Edit1,"仓库号"的Edit2,"城市"的Edit3,"面积"的Edit4;

2.各个Edit控件建立对应的变量m_strKeyNum,m_strNum,m_strCity,m_strArea;ListControl控件对应的变量m_grid;

3.为添加button建立响应函数,代码如下:
void CSqlServerDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_strKeyNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("城市不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("面积不能为空,必须填写!");
}

ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t sql;
sql = "select * from 仓库3";
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet(sql);
try
{
   m_pRecordset->AddNew();//add a new line
   m_pRecordset->PutCollect("仓库编号",(_bstr_t)m_strKeyNum);
   m_pRecordset->PutCollect("仓库号",(_bstr_t)m_strNum);
   m_pRecordset->PutCollect("城市",(_bstr_t)m_strCity);
   m_pRecordset->PutCollect("面积",(_bstr_t)m_strArea);
   m_pRecordset->Update();
   m_AdoConn.ExitConnect();
}
catch (...)
{
   MessageBox("操作失败");
    return;
}
MessageBox("保存成功");
m_grid.DeleteAllItems();
AddToGrid();
}

4.各个控件填写不为空,填好后点添加button,测试下。

修改功能:

1.增加一个修改Button,还有正修改的"仓库编号"的Edit5,属性设置为Disable,以及对应的控件变量m_strModifyKeynum;

2.CListControl控件响应LVN_ITEMCHANGED消息,ON_NOTIFY(LVN_ITEMCHANGED, IDC_LISTCONN, OnItemchangedListconn),建立响应函数OnItemchangedListconn。代码如下:

void CSqlServerDlg::OnItemchangedListconn(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//UpdateData(TRUE);

// 获取选中的位置
pos = -1;
CString str;
   for(int i=0; i<m_grid.GetItemCount(); i++)
   {
    if(m_grid.GetItemState(i, LVIS_SELECTED)==LVIS_SELECTED )//|| m_grid.GetCheck(i)
    pos = i;
   }

if (pos != -1) //获取选中Item的有关信息 显示在对应的Edit上
{
   UpdateData(TRUE);
  
   TCHAR szBuf[1024];
   LVITEM lvi;
   lvi.iItem = pos;
   lvi.iSubItem = 0;
   lvi.mask = LVIF_TEXT;
   lvi.pszText = szBuf;
   lvi.cchTextMax = 1024;
   m_grid.GetItem(&lvi);
   m_strKeyNum = lvi.pszText;
   m_strModifyKeynum = lvi.pszText;

   lvi.iSubItem = 1;
   m_grid.GetItem(&lvi);
   m_strNum = lvi.pszText;

   lvi.iSubItem = 2;
   m_grid.GetItem(&lvi);
   m_strCity = lvi.pszText;

   lvi.iSubItem = 3;
   m_grid.GetItem(&lvi);
   m_strArea = lvi.pszText;

   UpdateData(FALSE);
}

*pResult = 0;
}

3.为修改button建立响应函数,代码如下:
void CSqlServerDlg::OnBtnModify()
{
// TODO: Add your control notification handler code here
UpdateData(true);

if(m_strKeyNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("城市不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("面积不能为空,必须填写!");
}

ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t sql;
sql = "select * from 仓库3";
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet(sql);
try
{
   m_pRecordset->Move((long)pos,vtMissing);//move to the selected line
   m_pRecordset->PutCollect("仓库编号",(_bstr_t)m_strKeyNum);
   m_pRecordset->PutCollect("仓库号",(_bstr_t)m_strNum);
   m_pRecordset->PutCollect("城市",(_bstr_t)m_strCity);
   m_pRecordset->PutCollect("面积",(_bstr_t)m_strArea);
   m_pRecordset->Update();
   m_AdoConn.ExitConnect();
}
catch (...)
{
   MessageBox("操作失败");
    return;
}
MessageBox("修改成功");

m_grid.DeleteAllItems();

AddToGrid();
}

删除功能:

1.增加一个删除Button,为删除button建立响应函数,代码如下:

void CSqlServerDlg::OnBtnDelete()
{
// TODO: Add your control notification handler code here
   UpdateData(true);

if(m_strKeyNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strNum.IsEmpty())
{
   MessageBox("仓库编号不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("城市不能为空,必须填写!");
}
if(m_strCity.IsEmpty())
{
   MessageBox("面积不能为空,必须填写!");
}


ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t sql;
sql = "select * from 仓库3";
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet(sql);
try
{
   m_pRecordset->Move((long)pos,vtMissing);//
   m_pRecordset->Delete(adAffectCurrent);
   m_pRecordset->Update();
   m_AdoConn.ExitConnect();
}
catch (...)
{
   MessageBox("操作失败");
    return;
}
MessageBox("删除成功");
m_grid.DeleteAllItems();
AddToGrid();//刷新列表控件
}

2.单击一个CListControl中的选项,点删除Button,看是否删除成功。



http://hi.baidu.com/zhaquanmin/item/92a1a30ee90c91e2f45ba6a3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值