zoukankan      html  css  js  c++  java
  • VC :数据库

    一、ADO

    1、导入ADO动态数据库:

    #import "c:\program files\common files\system\ado\maado15.dll" no_namespace rename("EOF","adoEOF")

    2、初始化COM环境:

    ::CoInitalize(NULL);

    ::CoUninitalize();

    3、连接数据库:

    _ConnectionPtr pconnect(__uuidof(Connection));

    pconnect->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=BUS";

    pconnect->Open("","","",NULL);

    4、执行SQL语句:

    _RecordsetPtr record(__uuidof(Recordset));

    _CommandPtr comd(__uuidof(Command));

    comd->put_ActiveConnection(_variant_t((IDispatch *)pconnect));

    5、ADO的其他对象:

    Parameter对象、Field对象、Error对象。

    实例:

    1、导入ADO动态数据库:

    #import "c:\program files\common files\system\ado\maado15.dll" no_namespace rename("EOF","adoEOF")

    2、数据库中的数据和编辑框中的数据交互:

    void CTestDlg::OnButton1()

    {

           // TODO: Add your control notification handler code here

                  UpdateData(true);

           CoInitialize(NULL);

           _ConnectionPtr pconnect(__uuidof(Connection));

           _RecordsetPtr record(__uuidof(Recordset));

           _CommandPtr comd(__uuidof(Command));

           pconnect->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=student";

           pconnect->Open("","","",NULL);

           comd->put_ActiveConnection(_variant_t((IDispatch *)pconnect));

           //标准SQL语句

           CString cmda="";

           cmda="select * from 学生信息 where 姓名='";

           cmda+=m_na;cmda+="'";

          

           comd->CommandText=_bstr_t(cmda);//得到SQL语句

           record=comd->Execute(NULL,NULL,adCmdText);

           if(!record->end)

           {

                  m_name=(char *)(_bstr_t)record->GetCollect("姓名");

                  m_sex=(char *)(_bstr_t)record->GetCollect("性别");

                  m_age=(char *)(_bstr_t)record->GetCollect("年龄");

                  UpdateData(false);

           }

           else

           {     m_name="";

                  m_sex="";

                  m_age="";

                  UpdateData(false);

                  AfxMessageBox("查询不到该学生的信息");

           }

           record->Close();

           pconnect->Close();

           comd.Release();

           record.Release();

           pconnect.Release();

           CoUninitialize();

    }

    void CTestDlg::OnLogin()

    {

           // TODO: Add extra validation here

           UpdateData(true);

           CoInitialize(NULL);

           _ConnectionPtr pconnect(__uuidof(Connection));

           _RecordsetPtr record(__uuidof(Recordset));

           _CommandPtr comd(__uuidof(Command));

           pconnect->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Library";

           pconnect->Open("","","",NULL);

           comd->put_ActiveConnection(_variant_t((IDispatch *)pconnect));

           //标准SQL语句

           CString cmd="select * from READER where NAME='";

           cmd+=m_name;

           cmd+="' AND PASSWORD='";

           cmd+=m_password;

           cmd+="'";

           comd->CommandText=_bstr_t(cmd);//得到SQL语句

           record=comd->Execute(NULL,NULL,adCmdText);

           if(!record->end)

           {    

                  CDialog::OnOK();

                  CTestDlg2 dlg;

                  dlg.DoModal();

           }

           else

                  AfxMessageBox("LogIn ERROR!");

           record->Close();

           pconnect->Close();

           comd.Release();

           record.Release();

           pconnect.Release();

           CoUninitialize();

    }

    三、连接Access数据源

    1、建立基于单文档的应用程序,利用向导在第(2)步骤选择数据源支持;单击Data Source按钮,弹出Database Option对话框:ODBC下选择相应数据源,弹出选择表对话框。。。。

    2、添加控件及相应的变量。

    3、利用类向导添加一个新类:CRecordsetAdd : public CRecordset.单击OK,弹出DataBase Option对话框。。。

    4、在C*View::DoDataExchange()函数添加如下代码:

    void CTestView::DoDataExchange(CDataExchange* pDX)

    {

           CRecordView::DoDataExchange(pDX);

           //{{AFX_DATA_MAP(CTestView)

           DDX_Text(pDX, IDC_EDIT1,m_pSet->m_column1);

           DDX_Text(pDX, IDC_EDIT2,m_pSet->m_column2);

           DDX_Text(pDX, IDC_EDIT3,m_pSet->m_column3);

           DDX_Text(pDX, IDC_NA, m_na);

           //}}AFX_DATA_MAP

    }

    5、在C*View类中,添加函数用于向数据库中添加数据:

    void CTestView::OnAdd()

    {

           CAddNew dlg;

           CString str;

           if(IDOK==dlg.DoModal())

           {

                  try{

                  CRecordsetAdd m_pdatabase;

                  if(m_pdatabase.IsOpen())

                         m_pdatabase.Close();

                  m_pdatabase.Open(CRecordset::snapshot,NULL,CRecordset::none);

                  m_pdatabase.AddNew();

                  m_pdatabase.m_column1=dlg.m_name;

                  m_pdatabase.m_column2=dlg.m_sex;

                  m_pdatabase.m_column3=dlg.m_age;

                  if(m_pdatabase.CanUpdate())

                         m_pdatabase.Update();

                  m_pSet->Requery();

                  m_pdatabase.Close();

                  if(!m_pSet->IsEOF())

                         m_pSet->MoveNext();

                  }

                  catch(CDBException* e)

                  {

                         e->ReportError();

                         return;

                  }

                  str.Format("添加记录[ %s ]成功",dlg.m_name);

                  MessageBox(str,NULL,MB_OK|MB_ICONINFORMATION);

           }

    }

    6、在C*View类中,添加函数用于删除数据库中的数据:

    void CTestView::OnDel()

    {

           // TODO: Add your control notification handler code here

                  try{

                  CString str;

                  CRecordsetAdd m_pdatabase;

                  if(m_pdatabase.IsOpen())

                         m_pdatabase.Close();

                  str.Format("%s",m_pSet->m_column1);

                  m_pdatabase.m_strFilter.Format("姓名='%s'",str);

                  m_pdatabase.Open(CRecordset::snapshot,NULL,CRecordset::none);

                  m_pdatabase.Delete();

                  if(!m_pdatabase.IsEOF())

                         m_pdatabase.MoveLast();

                  else

                         m_pdatabase.SetFieldNull(NULL);

                  if(m_pdatabase.IsOpen())

                         m_pdatabase.Close();    

                  m_pSet->Requery();

                  str.Format("删除记录 ["+m_pdatabase.m_column1+"] 成功!{}-..-{}");//如果此处还是写m_pSet->m_name则错误,因为已经重新连接

                  MessageBox(str,NULL,MB_OK|MB_ICONINFORMATION);

           }

           catch(CDBException* e)

           {

                  e->ReportError();

                  return;

           }

    }

    7、在C*View类中,添加函数用于查询数据库中的数据:

    void CTestView::OnQu()

    {

           UpdateData(TRUE);

           CString col="姓名";

           m_pSet->Close();

           m_pSet->m_strFilter=col+"='"+m_na+"'";//按字段进行查询

           m_pSet->Open();

           UpdateData(FALSE);

    }

     四、设置Access数据库ODBC数据源

    注意:控制台应用程序默认是单线程的,因此本程序需要设置MFC的支持,从而可以支持多线程。

           进入Project->Settings->C++, 将Category 选为 Code generation,  再将Use run-time library 选为 Debug multitheaded 就行了 。

    实例:

    //strSourceName是要创建的数据源名, strSourceDb是数据库存放路径, strDescription是数据源的描述字符串

    #include <afx.h>

    #include <atlbase.h>

    #include <iostream.h>

    BOOL LoadDbSource(CString strSourceName,CString strSourceDb, CString strDescription)

    {

           //存放要打开的子键

           CString strSubKey;

           //检测是否安装了 MS Access ODBC driver:odbcjt32.dll

           //获得 Windows系统目录

           char sysDir[MAX_PATH];

           char drvName[]="\\odbcjt32.dll" ;

           ::GetSystemDirectory (sysDir,MAX_PATH);

           strcat(sysDir,drvName);

           CFileFind findFile;

           if(!findFile.FindFile(sysDir))

           {

                  cout<<"您的计算机系统中没有安装 MS Access的 ODBC驱动程序 odbcjt32.dll,您将无法加载该类数据源。"<<endl;

                  return false;

           }

           strSubKey="SOFTWARE\\ODBC\\ODBC.INI\\"+strSourceName;

           //创建 ODBC数据源在注册表中的子键

           CRegKey reg;

       reg.Create(HKEY_CURRENT_USER,strSubKey);//创建项file1

       reg.SetValue(strSourceDb,"DBQ");

       reg.SetValue(strDescription,"Description");

       reg.SetValue(sysDir,"Driver");

       reg.SetValue(25,"DriverId");

       reg.SetValue("MS Access;","FIL");

       reg.SetValue("","UID");

       DWORD value=0;

       reg.SetValue(value,"SafeTransactions");

       reg.Close();

           //创建 ODBC数据源的 Jet子键

           strSubKey+="\\Engines\\Jet" ;

           reg.Create(HKEY_CURRENT_USER,strSubKey);//创建Jet子键

           reg.SetValue("","ImplicitCommitSync");

           reg.SetValue(2048,"MaxBufferSize");

           reg.SetValue(5,"PageTimeout");

           reg.SetValue(3,"Threads");

           reg.SetValue("Yes","UserCommitSync");

           //设置 ODBC数据库引擎名称

           reg.Open(HKEY_CURRENT_USER,"SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources");

           CString strDbType="Microsoft Access Driver (*.mdb)";

           reg.SetValue(strDbType,strSourceName);

           cout<<"设置数据源完成"<<endl;

           return true;

    }

    main()

    {

           CString strSourceName="student2";

           CString strSourceDb="D:\\student.mdb";

           CString strDescription="学生信息2";

           LoadDbSource(strSourceName,strSourceDb,strDescription);

    }

  • 相关阅读:
    java:输出流程printStream
    phalcon 连接多个数据库 phalcon multi-database
    Selenium Webdriver元素定位的八种常用方法
    adb push ,adb pull和adb install的区别
    Java将数据写进excel
    Java接口和抽象类的区别
    深入理解Java的接口和抽象类
    Java内存解析 程序的执行过程
    bit,byte,char,位,字节,字符 的区别
    java static成员变量方法和非static成员变量方法的区别 ( 二 )
  • 原文地址:https://www.cnblogs.com/shenchao/p/2970070.html
Copyright © 2011-2022 走看看