近来在做一个东西练习,因为学习了数据库就感觉要做点东西巩固一下,于是就有了下面这个东西,主要讲一下利用ODBC与数据交互,

odbc链接sql server10054 odbc sql server_SQL

这里用的是CDatabase,与CRecordset进行管理,其实用到的就主要是这些东西。

下面就讲讲如何实现其中用到的东西;

对于数据库的操作除非就是增、删、改、查,而这些操作都可以用我们的sql语句来代替而Cdatabase 类的ExecuteSQL这个函数就可以执行我们的sql语句,而CRecordset这个类对我们的数据操作更是灵活,当我们要对我们的数据进行操作的时候直接继承一个这个类然后就是AddNew,还有Edit这些函数进行数据操作了,最后还记得要调用一下Update方法把我们的数据写入数据库,这里我写的一个方法给个Demo

void AddGongFangDlg::OnBnClickedOk()
 {
  UpdateData();
  //这里实现添加功能
  CDataRowsetGoFang m_recodset(m_db);
  m_recodset.Open(CRecordset::dynaset,"dbo.供方表");
  if (m_recodset.CanUpdate())
  {
   m_recodset.AddNew();
   CString commder;
   m_com.GetLBText(m_com.GetCurSel(),commder);
   m_recodset.column1=m_id;
   m_recodset.column2=m_money;
   m_recodset.column3=m_number;
   m_recodset.column4=m_addr;
   m_recodset.column5=commder;
   if (!m_recodset.Update())
   {
    MessageBox("插入数据失败!");
   }
   else
   {
    MessageBox("插入数据成功!");
    m_recodset.Close();
    CDialogEx::EndDialog(0);
   } }
}

上面的都比较基础,下面就说说如何获得通过dobc数据源获得所有表;
利用sql语句"Select Name FROM SysObjects Where XType='U' orDER BY Name";
直接上代码:
BOOL LogonDlg::OnInitDialog()
 {
  CDialogEx::OnInitDialog();
  InitOdbc();
  //获取所有表
  CString strSql = "Select Name FROM SysObjects Where XType='U' orDER BY Name";
  CRecordset recordset(&m_db);
  recordset.Open(AFX_DB_USE_DEFAULT_TYPE, strSql);//这两句应该没问题,备注略
  CString strTableName;
  recordset.GetFieldValue("Name", strTableName); //将Name保存到strTableName这里有个名子是系统表我们先过滤一下
  recordset.MoveNext();//移动到下一个值
  //设置clisttree 和clistctrl的扩展模式
  m_detaillist.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_REPORT);//设置报告方式显示并且含有表格单行选中一行;
  m_tabletree.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASLINES);
  HTREEITEM hRootItem=m_tabletree.InsertItem("东汽招投标管理表",TVI_ROOT);
  while(!recordset.IsEOF())//当记录集recordset后面还有值
  {
   recordset.GetFieldValue("Name", strTableName); //将Name保存到strTableName
   //我们自己的代码,(例如列出表名:m_listBox.AddString(strTableName))
   recordset.MoveNext();//移动到下一个值
   m_tabletree.InsertItem(strTableName,hRootItem);
  }
  //m_tabletree.SelectItem(hRootItem);//设置默认选中
  m_tabletree.Expand(hRootItem,TVE_EXPAND);//展开树
  return TRUE;  // return TRUE unless you set the focus to a control

 }获取表的列个数、列名字并显示表里面的数据;
/*
 函数名:UpdateView
 功能:更新界面
 参数:tableName 表名子
 返回值:无
 */
 void LogonDlg::UpdateView(CString tableName)
 {
  while(m_detaillist.DeleteColumn(0));//删除全部的列
  m_detaillist.DeleteAllItems();
  CRecordset recordset(&m_db);
  CString sql;
  sql.Format("select  *from dbo.%s",tableName);//获取这张表的全部信息
  recordset.Open(CRecordset::dynaset,sql);
  CODBCFieldInfo odbcfileinfo;//利用这个结构体可以获得表的列明
  CStringW  tempTabelListName;
  int count=recordset.GetODBCFieldCount();//获取列的个数
  for(int i=0;i<count;i++)
  {//插入表列命
   recordset.GetODBCFieldInfo(i,odbcfileinfo);
   tempTabelListName=odbcfileinfo.m_strName;
   m_detaillist.InsertColumn(i,(CString)tempTabelListName,LVCFMT_LEFT,80);
   
  }
  int nitem=0;
  while(!recordset.IsEOF())//这里是把表里面的数据显示在一个clistctrl里面
  {
   m_detaillist.InsertItem(nitem,"");
   for(int i=0;i<count;i++)//插入一行
   {  
    recordset.GetFieldValue(i,tempTabelListName);
    tempTabelListName.TrimRight();
    m_detaillist.SetItemText(nitem,i,(CString)tempTabelListName);
   }
   nitem++;
   recordset.MoveNext();
  }
  recordset.Close();
 }