数据库

ODBC动态添加数据库:Lhwy工程
   
  CDatabase类
  public:
   CDatabase m_DB;
  extern CLhwyApp theApp;
  
  #include <odbcinst.h>
  //由于 VC的缺省库文件中不包含 SQLConfigDataSource()函数,因此使用该函数之前需要将 odbcinst.h文件包含在工程的头文件中
  
  BOOL CLhwyApp::InitInstance()
  {
   //在VC中动态加载ODBC的方法
   if (!AfxSocketInit())
   {
   AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
   return FALSE;
   }
  
   CString sPath;//数据库存放路径
   GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('\\');
   sPath=sPath.Left (nPos);
   nPos=sPath.ReverseFind('\\');
   sPath=sPath.Left (nPos);
   CString lpszFile = sPath + "\\lhwy.mdb";
   
   
   char* szDesc;
   int mlen;
   szDesc=new char[256];
    sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","lhwy",lpszFile,sPath);
  
  
  
   mlen = strlen(szDesc);
   for (int i=0; i<mlen; i++)
   {
   if (szDesc[i] == '?')
   szDesc[i] = '\0';
   }
  //Windows系统子目录中的动态链接库 Odbcinst.dll提供了一个可以动态地增加、修改和删除数据源的函数 SQLConfigDataSource()。
  //
   if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))
   AfxMessageBox("SQLConfigDataSource Failed");
   
  
   try
   {
   CString strConnect;
   strConnect.Format("DSN=lhwy;");//指定odbc连接的字符串:数据源的名称和其他//一些选项信息
   if(!m_DB.OpenEx(strConnect,CDatabase::useCursorLib))//装载ODBC光标库DLL,如果想直接从Crecordset类得到对象而不是派生得到,就不应该装载光标库/
  //要使程序与数据源建立联系,需用CDateBase::OpenEx()或CDatabase::Open()函数来进行初始化。数据库对象必须在使用它构造记录集对象之前初始化。
   {
   AfxMessageBox("Unable to Connect to the Specified Data Source");
   return FALSE ;
   }
   }
   catch(CDBException *pE)
   {
   pE->ReportError();
   pE->Delete();
   return FALSE;
   }
  
   AfxEnableControlContainer();
   //SetDialogBkColor(RGB(140,130,210),RGB(255,0,0));
   SetDialogBkColor (RGB (140, 180, 220), RGB ( 255 ,0 , 0 ) );//背景色
  连接数据表
  CDRecordset m_Set(&theApp.m_DB);// &theApp.m_DB为CDatabase类型
  CBRecordset m_bSet(&theApp.m_DB);
  CTRecordset m_tSet(&theApp.m_DB);
  CRecordset类
  数据成员
  m_nFields:记录集中的字段数目,类型为UINT.
  m_strFilter:CString对象,包含一个SOL的WHERE字句,作为过滤器对那些满足一定条件的记录进行选择。
  m_strSort: CString对象,包含一个SOL的ORDER BY字句,用于控制记录排序的方式。
  GetODBCFieldInfo------返回记录集中字段的特定种类的信息。
  记录导向操作
  MoveFirst------设置记录集的当前记录为第一个记录,此前应调用IsBOF测 试。
  记录更新操作
  Edit-------准备对当前记录的更改,编辑,调用Update()完成编辑。
  AddNew----准备增加一个新记录,调用Update()完成。
  Delete------从记录中删除当前记录,在删除之后必须滚动到下一个记录。
  操作应用:
  打开数据表m_Set.Open(AFX_DB_USE_DEFAULT_TYPE,"[NO2STUDENT]");// [NO2STUDENT为数据表名

用ADO连接数据库
  ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
  库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
   _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。 使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同CDatabase一样,使用它创建一个数据连接,然后使用其它对象执 行数据输入输出操作。
  _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用 _CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一 次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建 一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
  _RecordsetPtr是一个记录集对象。与以上两种对象 相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个 连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同 Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
  程序中通过_variant_t和_bstr_t转换COM对象和C++类型的数据, _variant_t类封装了OLE自治VARIANT数据类型。在C++中使用_variant_t类要比直接使用VARIANT数据类型容易得多。
  在stdafx.h 文件中添加:
  #include 〈comdef.h〉//头文件comdef.h使我们的应用程序能够使用Visual C++中的一些特殊COM支持类,这些类使得处//理OLE自治更为容易一些,OLE自治是ADO使用的数据类型。
  #import "msado15.dll" no_namespace rename("EOF","adoEOF")
  //#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  
  #if !defined CATCH_ERROR
  #define CATCH_ERROR \
   { \
   CString strComError; \
   strComError.Format("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %s", \
   e.Error(), \
   e.ErrorMessage(), \
   (LPCSTR) e.Source(), \
   (LPCSTR) e.Description()); \
   ::MessageBox(NULL,strComError,"错误",MB_ICONEXCLAMATION); \
   }
  #endif
  
  连接数据库:
   打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。
   _ConnectionPtr m_pConnection;//public
  
   BOOL CCcApp::InitInstance()
   {
   AfxOleInit();//初始化COM库
  AfxEnableControlContainer();//系统生成
  // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
  // 因为它有时会经常出现一些意想不到的错误。
   try
   {
   
   m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  //m_pConnection.CreateInstance(__uuidof(Connection));
   m_pConnection->ConnectionTimeout=3;///设置超时时间为3秒
   
   m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data 
   Source=data.mdb;","","",adModeUnknown);//Data是数据类型
   }
   catch(_com_error e)///捕捉异常
   {
   CATCH_ERROR;
   return false;
   }
  、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
  、、、、、、、、、、、、、、、、、、、、、、、
  关闭一个库连接 如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示:
  
   if(m_pConnection->State)
   m_pConnection->Close();
   m_pConnection= NULL;
  _RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
  _RecordsetPtr m_pRecordset;
   m_pRecordset.CreateInstance("ADODB.Recordset"); //查询数据库,看是否有此用户和密码 m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  /* m_pRecordset->Open("SELECT * FROM DemoTable", // 
   查询DemoTable表中所有字段
   theApp.m_pConnection.GetInterfacePtr(), // 
   获取库接库的IDispatch指针
   adOpenDynamic,
   adLockOptimistic,
   adCmdText);
   } */
  具体操作:
   附加
   #define CATCH_ERROR \
   catch (_com_error e) \
   { \
   CString strComError; \
   strComError.Format("错误编号: %08lx\r\n\r\n错误信息: %s\r\n\r\n错误源: %s\r\n\r\n错误描述: %s", \
   e.Error(), \
   e.ErrorMessage(), \
   (LPCSTR) e.Source(), \
   (LPCSTR) e.Description()); \
   SetDlgItemText(IDC_MESSAGE,strComError); \
   }
  #define SET_TEXT SetDlgItemText(IDC_MESSAGE,"!\r\n\r\n\r\n\r\n\t\t操作成功完成!");
  读取表内数据 
    将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。如果没有遇到表结束标志adoEOF,则用 GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取 当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。
  插入记录 
   可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。
  _variant_t RecordsAffected;
   theApp.m_strSQL="INSERT INTO Records (Name,YorN,College,date1,date2,Reason,Remark,Flag) values('"+m_strName+"','"+YorN+"','"+m_strCollege+"','"+m_date1+"','"+m_date2+"','"+m_strReason+"','"+m_strRemark+"','"+strNowTime+"')";
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);
  移动记录指针 
    移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动 到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用 Move(记录号)方法来实现,注意: 
   Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。
  改记录中字段值 
   可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。
  theApp.m_strSQL="update Records set Name='"+m_strName+
   "',YorN='"+YorN+
   "',College='"+m_strCollege+
   "',Reason='"+m_strReason+
   "',date1='"+m_date1+
   "',date2='"+m_date2+
   "',Remark='"+m_strRemark+
   "' where Flag='"+m_strFlag+"'";
   
   _variant_t RecordsAffected;
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);
  删除记录 
   删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。
  登陆窗口连接数据库
   BOOL LogonDlg::OnInitDialog() //初始化登陆窗口
  {
   CDialog::OnInitDialog();
   
   // TODO: Add extra initialization here
   try
   {
   m_pRecordset.CreateInstance("ADODB.Recordset");//创建对象
    m_pRecordset->Open((_variant_t)"SELECT * FROM Admin",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
   
   if(!m_pRecordset->adoEOF)
   {
   theApp.g_Admin=((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("AdminName"));
   SetDlgItemText(IDC_Use,theApp.g_Admin);
   } 
   m_pRecordset->Close();
   }
  
   catch (_com_error e) 
   { 
   CATCH_ERROR; 
   return false;
   }
   return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
  }
  void LogonDlg::OnOK() //当点击确定按钮时,所作的操作,成功弹出主界面
  {
   // TODO: Add extra validation here
  UpdateData(); 
   if(m_Use.IsEmpty() || m_Pass.IsEmpty()) 
   {
   AfxMessageBox("请输入用户名和密码!");
   }
   else
   {
   CString sql="SELECT * FROM Admin where AdminName='"+theApp.g_Admin+"' and pwd='"+m_Pass+"'";
   try
   { //创建Recordset对象的实例 
   m_pRecordset.CreateInstance("ADODB.Recordset"); //查询数据库,看是否有此用户和密码
    m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
   
   if(m_pRecordset->adoEOF) //如果没有此用户和密码
   {
   MessageBox("请输入正确的用户名和密码!","错误",MB_ICONASTERISK );
   SetDlgItemText(IDC_Use,"");
   GetDlgItem(IDC_Use)->SetFocus();
   }
   else
   {
   theApp.g_Admin=m_Use;
   theApp.g_Pass=m_Pass;
   CDialog::OnOK();
   }
   }
   catch (_com_error e) 
   { 
   CATCH_ERROR;
   return;
   }
   } 
   
  // CDialog::OnOK();
  }
  void LogonDlg::OnCancel() //
  {
   // TODO: Add extra cleanup here
  //((CCcDlg*)AfxGetMainWnd()):取得主界面的指针
   ((CCcDlg*)AfxGetMainWnd())->EndDialog(IDOK);//当点击取消按钮时不弹出主界面
   CDialog::OnCancel();
  }
  显示所查内容
  extern CCcApp theApp;
  void CCcDlg::List(CString sql) //将SQL语句查询的结果显示在列表框中
  {
   m_list.DeleteAllItems(); 
   
   int nItem=0;
   try
   {
   m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
   if(!m_pRecordset->adoEOF) //如果记录不为空
   { 
   while(!m_pRecordset->adoEOF)
   { 
   if(strcmp((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("YorN"),"Y")==0) //是否批准
   nItem=m_list.InsertItem(0xffff,"Y",0);//0代表正确的图标 0xffff可用数字代替
   else
   nItem=m_list.InsertItem(0xffff,"N",1);//1代表错误的图标 
   m_list.SetItemText(nItem,1,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Name"));
   m_list.SetItemText(nItem,2,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("College"));
   m_list.SetItemText(nItem,3,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Reason"));
   m_list.SetItemText(nItem,4,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("date1"));
   m_list.SetItemText(nItem,5,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("date2"));
   m_list.SetItemText(nItem,6,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Remark"));
   m_pRecordset->MoveNext();
   }
   }
   m_pRecordset->Close();
   }
   catch (_com_error e)
   { 
   CATCH_ERROR;
   return;
   }
   
   
   CString strTitle; 
   strTitle.Format("学生请假管理系统 共有%d条记录",nItem+1);
   SetWindowText(strTitle);
  }
  
  删除一条记录
  
  void CCcDlg::OnButtonDel() //删除一条记录
  {
   try
   {
   POSITION pos = m_list.GetFirstSelectedItemPosition();
   if(pos) //如果选中一行,则生成动态的sql语句
   {
   if(MessageBox("你确定要删除此记录吗?","警告",MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2)==IDYES)
   {
   int nItem = m_list.GetNextSelectedItem(pos);
   theApp.m_strSQL="DELETE FROM Records WHERE name='"
   +m_list.GetItemText(nItem,1)+"' and College='"
   +m_list.GetItemText(nItem,2)+"' and Reason='"
   +m_list.GetItemText(nItem,3)+"' and date1='"
   +m_list.GetItemText(nItem,4)+"' and date2='"
   +m_list.GetItemText(nItem,5)+"' and Remark='"
   +m_list.GetItemText(nItem,6)+"'";
   _variant_t RecordsAffected;
   
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText); //执行此sql语句
   List("SELECT * FROM Records");
   }
   }
   else
   AfxMessageBox("请选择一行数据!");
   }
   catch(_com_error e)
   {
   CATCH_ERROR;
   }
  }
  1. 建表
   void CADlg::OnCreatetTable() 
  {
   try
   { 
   m_pConnection->Execute("CREATE TABLE new(ID INTEGER,username TEXT,old INTEGER)",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  2. 删除数据表
   void CADlg::OnDropTable() 
  { 
   try
   {
   m_pConnection->Execute("DROP TABLE new",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  void CADlg::OnAddItem() 
  {
   try
   { 
   m_pConnection->Execute("ALTER TABLE new ADD newcolumn1 INTEGER",NULL,adCmdText); 
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnDelItem() 
  {
   try
   {
   m_pConnection->Execute("ALTER TABLE new ADD newcolumn1 INTEGER", NULL,adCmdText); 
   SET_TEXT;
   }
   CATCH_ERROR;
   
  }
  
  void CADlg::OnAddRecords() 
  {
   try
   {
   for(int i = 1;i < 10; i ++)
   {
   CString strSQL;
   strSQL.Format("INSERT INTO new(ID,username,old) VALUES (%d, '程红秀',%d)",i,i*3);
   m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText); 
   
   SET_TEXT; 
   }
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnOldAdd1() 
  { 
   try
   {
   m_pConnection->Execute("UPDATE new SET old = old+1", NULL,adCmdText); 
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnSum() 
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   
   m_pRecordset =m_pConnection->Execute("SELECT COUNT(*) FROM new where ID > 0",&RecordsAffected,adCmdText);
   
   _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)0); //取得第一个字段的值放入vCount变量
   
   
   CString str;
   str.Format("!\r\n\r\n\r\n\t\t\t共有%d条记录",vCount.lVal);
   SetDlgItemText(IDC_MESSAGE,str);
   
   m_pRecordset->Close(); 
   }
   CATCH_ERROR;
   
  }
  
  void CADlg::OnSetIdIndex() 
  {
   try
   {
   m_pConnection->Execute("CREATE UNIQUE INDEX id ON new(ID)",NULL,adCmdText); 
   SET_TEXT;
   }
   CATCH_ERROR;
   
  }
  
  void CADlg::OnOldSum() 
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   m_pRecordset =m_pConnection->Execute("select MAX(old) from new",&RecordsAffected,adCmdText);
   
   _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)0);
   
  
   m_pRecordset->Close();
   m_pRecordset.Release();
  
   CString Message;
   Message.Format("!\r\n\r\n\r\n\t\t\t最大值是%d",vCount.lVal);
   SetDlgItemText(IDC_MESSAGE,Message);
   }
   CATCH_ERROR; 
  }
  
  void CADlg::OnOldSum2() 
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   
   m_pRecordset =m_pConnection->Execute("select SUM(old) from new",&RecordsAffected,adCmdText);
   _variant_t vIndex = (long)0;
   _variant_t vCount = m_pRecordset->GetCollect(vIndex);
   
  
   m_pRecordset->Close();
   m_pRecordset.Release();
   CString Message;
   Message.Format("!\r\n\r\n\r\n\t\t\t总和是%d",(long)vCount);
   SetDlgItemText(IDC_MESSAGE,Message);
   }
   CATCH_ERROR;
  }
  
  
  void CADlg::OnOldAverage() 
  {
   
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   m_pRecordset =m_pConnection->Execute("select AVG(old) from new",&RecordsAffected,adCmdText);
   _variant_t vIndex = (long)0;
   _variant_t vCount = m_pRecordset->GetCollect(vIndex);
   
  
   m_pRecordset->Close();
   m_pRecordset.Release();
   CString Message;
   Message.Format("!\r\n\r\n\r\n\t\t\t平均值是%d",(long)vCount);
   SetDlgItemText(IDC_MESSAGE,Message);
   
   }
   CATCH_ERROR;
  }
   
  //
  DAO访问ACCESS数据库
  CDaoRecordSet类
  类成员:
  数据成员:m_nFields(),m_strFilter(),m_strSort()
   m_pSet->m_strFilter=filter;
   m_pSet->Requery();
  . 属性成员函数:CanUpdate()
  。记录操作函数: AddNew()
  动态连接数据库:
  #include <afxdao.h>
  private:
   CString m_DataSource;
   //动态连接数据库
   char path[ MAX_PATH ] = { '\0' };
   GetCurrentDirectory( MAX_PATH, path );
   m_DataSource.Format( "%s", path );
   m_DataSource += "\\MagicWord.mdb";//数据库名
  CString CWordDaoSet::GetDefaultDBName()
  {
   return _T( m_DataSource );//数据源的路径 m_DataSource不加引号
  }
  //实例化
   m_pSet = new CWordDaoSet();
  在视图文档中,采用:在PppView.cpp文件的OnInitialUpdate()函数中得到指向数据集的指针 
  CFormView::OnInitialUpdate();
   CPppDoc* pDoc = (CPppDoc*)GetDocument(); //得到指向文档类指针
   m_ShengSet=&pDoc->m_ShengSet;//得到数据库指针
  /
  //PUBLIC函数 打开数据表进行操作
  void CMagicWordDlg::DisplayFirstRecord()
  {
   try
   {
   if ( m_pSet->IsOpen() )
   m_pSet->Close();
  
   m_pSet->Open();
   PublicAssign();//操作函数
   }
   catch( CDaoException *exception )
   {
   exception->ReportError();
   return;
   }
  }
  、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
   添加功能:执行添加、删除、查找等操作。
   首先。写SQL查询语句
  其次。创建一个新的纪录集对象
   功能操作
   关闭数据表
  
  添加新单词
   // 实例化m_pSet
   m_pSet = new CWordDaoSet();
  
  void CMagicWordDlg::OnAddition() //添加函数
  {
   CWordInfoDlg WordInfoDlg; //添加对话框
   CWordDaoSet TempSet;//数据库表
   CString strSQL;//SQL查询
  
   // 如果点击了取消按钮,则不执行添加操作。
   if ( WordInfoDlg.DoModal() != IDOK )// 调用添加对话框
   return;
  
   // 查询当前单词是否已经被收录于数据库中
   if ( TempSet.IsOpen() )//关闭原有的记录集
   TempSet.Close();
   //查询功能,看添加的内容是否已经存在
   strSQL.Format( "SELECT * FROM WordList WHERE word = '%s'", 
   WordInfoDlg.m_word.operator LPCTSTR() );
  //创建一个新的纪录集对象
   TempSet.Open( AFX_DAO_USE_DEFAULT_TYPE, strSQL, 0 );
  
  
   if ( !TempSet.IsEOF() )
   {
   MessageBox( _T( "当前单词纪录已存在,没有添加的必要!" ),
   _T( "已经存在!" ), MB_OK | MB_ICONASTERISK );
   return;
   }
  
   if ( TempSet.IsOpen() )
   TempSet.Close();
  
   // 执行添加操作
   try
   {
   m_pSet->AddNew();
   //添加内容
   m_pSet->m_Word = WordInfoDlg.m_word;
   m_pSet->m_Explain0 = WordInfoDlg.m_explain0;
   m_pSet->m_Explain1 = WordInfoDlg.m_explain1;
   m_pSet->m_Explain2 = WordInfoDlg.m_explain2;
   m_pSet->m_Phrase0 = WordInfoDlg.m_phrase0;
   m_pSet->m_Phrase1 = WordInfoDlg.m_phrase1;
   m_pSet->m_Phrase2 = WordInfoDlg.m_phrase2;
   m_pSet->m_Sentence0 = WordInfoDlg.m_sentence0;
   m_pSet->m_Sentence1 = WordInfoDlg.m_sentence1;
   //更新数据库
   if ( m_pSet->CanUpdate() )
   {
   m_pSet->Update();
   MessageBox( _T( "添加新单词完成!" ), 
   _T( "添加成功!" ), MB_OK | MB_ICONASTERISK );
   }
   }
   catch( CDaoException *exception )//异常操作
   {
   exception->ReportError();
   // 否则指针会指向出现异常的纪录
   m_pSet->MoveNext();
   m_pSet->MovePrev();
   return;
   }
  }
  直接通过DAO读写Access文件
  CDaoDatabase db; //数据库
  CDaoRecordset RecSet(&db); //记录集
  void CRWAccessDlg::OnWriteAccess() //创建数据库,并向数据表中添加数据
  {
   //获取主程序所在路径,存在sPath中
   CString sPath;
   GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('\\');
   sPath=sPath.Left (nPos);
  
   //默认创建数据名:Demo.mdb,内部表名:DemoTable,表内有二个字段:姓名、年龄
   CString lpszFile = sPath + "\\Demo.mdb";
   
   CFileFind fFind;//查找文件
   BOOL bSuccess;
   bSuccess=fFind.FindFile(lpszFile);
  
   fFind.Close ();
   //是否已有创建好的Demo.mdb文件,没有则创建它
   if(!bSuccess)
   {
   db.Create(lpszFile);//创建数据库
  
   CString SqlCmd = "CREATE TABLE DemoTable(Name VARCHAR(20),Age VARCHAR(3));";
   db.Execute(SqlCmd);//创建数据表
   
   //打开已创建的数据表
   RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,
   "SELECT * FROM DemoTable", 0);
   //加入第一个记录,用SQL语句
   db.Execute("INSERT INTO DemoTable (Name,Age) VALUES ('徐景周',26)");
   
   //加入第二个记录,用DAO涵数
   RecSet.AddNew();
   RecSet.SetFieldValue("Name","徐志慧");
   RecSet.SetFieldValue("Age","21");
   RecSet.Update();
   
   //加入第三个记录,用DAO涵数
   RecSet.AddNew();
   RecSet.SetFieldValue("Name","郭徽");
   RecSet.SetFieldValue("Age","27");
   RecSet.Update();
   
   //关闭记录集及库
   RecSet.Close();
   db.Close();
  
   AfxMessageBox("Access文件写入成功!");
   }
   else
   AfxMessageBox("Demo.mdb数据库已经创建!");
   
  }
  void CRWAccessDlg::OnReadAccess() //直接读取数据库
  {
   COleVariant var; // 字段类型
   var.ChangeType(VT_BSTR, NULL);
   CString strName,strAge,strFile; 
  
   //清空列表框
   m_AccessList.ResetContent();
  
   //获取主程序所在路径,存在sPath中
   CString sPath;
   GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('\\');
   sPath=sPath.Left (nPos);
  
   strFile = sPath + "\\demo.mdb";
   db.Open(strFile); // 打开已创建的demo数据库及DamoTable表
   RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DemoTable",NULL);
  
   while(!RecSet.IsEOF()) // 有没有到表结尾
   {
   RecSet.GetFieldValue("Name",var);

    strName = (LPCSTR)var.pbstrVal;
   RecSet.GetFieldValue("Age",var);
   strAge = (LPCSTR)var.pbstrVal;
   m_AccessList.AddString( strName + " --> "+strAge );
  
   RecSet.MoveNext();
   }
  
   //关闭记录集及库
   RecSet.Close();
   db.Close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值