VC 中的ADO数据库开发

来源:互联网 发布:kmeans算法java实现 编辑:程序博客网 时间:2024/06/04 21:08

1.在vc++中使用ado

首先要在头文件stdafx.h中加入以下代码:

#import "msado15.dll" no_namespace \
rename("EOF","EndOfFile") \
rename("LockTypeEnum","newLockTypeEnum")\
rename("DataTypeEnum","newDataTypeEnum")\
rename("FieldAttributeEnum","newFieldAttributeEnum")\
rename("EditModeEnum","newEditModeEnum")\
rename("RecordStatusEnum","newRecordStatusEnum")\
rename("ParameterDirectionEnum","newParameterDirectionEnum")

//以上代码是引用动态连接库,rename 后面的是ado 的关键字重定义,避免和其他地方的关键字冲突!

2.对于数据库操作方法是:

创建公共模块,主要是在C**App类中定义数据库有关的变量,便于其他类对数据库的操作

class C**App : public CWinApp

{

... ...

public:

bool adoexecute(_RecordsetPtr &adoset,_variant_t &strsql);

 _ConnectionPtr adoconn; //定义ado数据库连接对象指针

_RecordsetPtr m_padoset;

 CString m_sCurrentuser;//定义登陆用户名

 int m_Logincount;//统计登陆的次数

}

extern C**App theApp; // 全局变量的声明,但不可放在类定义的前面,theApp是为了在其他的模块中调用

connection对象和记录集

3.在程序C**App类的初始函数中打开数据源的连接,在退出的函数中释放连接对象和记录集,如:

BOOL C**App::InitInstance()
{
 ::AfxOleInit();  //打开com组件
    AfxEnableControlContainer();

  m_Logincount=0;

 try
 {
    adoconn.CreateInstance(__uuidof(Connection)); //初始化ado conn
    adoconn->Open("DSN=material;Provider=MSDASQL","sa","13562616", adConnectUnspecified);
 }
 catch(_com_error &e)
 {
    CString err;
    err.Format("%s",(char*)(e.Description()));
    AfxMessageBox(err);
 }

 m_padoset.CreateInstance(__uuidof(Recordset)); //初始化ado记录集

... ....

//这是在程序启动时,调用登陆窗口
    CLongin dlg;    
    if(IDOK!=dlg.DoModal())
       return false;

 ... ...

 m_pMainWnd->SetWindowText("物资管理信息系统"); //设置窗体的标题


 return TRUE;
}

 

bool C**App::adoexecute(_RecordsetPtr &adoset, _variant_t &strsql)
{

//该函数是执行SQL语句的,在其他类的模块中只要通过theApp.adoexecute(theApp.m_padoset,strquery)


  if(adoset->State==adStateOpen) 
   adoset->Close();

  try
  {
     adoset->Open(strsql,adoconn.GetInterfacePtr    (),adOpenStatic,adLockOptimistic,adCmdUnknown);
  return true;
  }
  catch(_com_error &e)
  {
     CString err;
  err.Format("%s",(char*)(e.Description()));
  AfxMessageBox(err);
  return false;
  }

}

int C**App::ExitInstance()   //退出函数,是一个自己加入的虚函数
{
    if(adStateOpen==adoconn->State)
  adoconn->Close();    //关闭ado connection
 adoconn.Release();       //释放
 if(adStateOpen==m_padoset->State)
  m_padoset->Close();
 m_padoset.Release();

 return CWinApp::ExitInstance();
}

//一个登陆窗口类对数据库的应用:

void CLongin::OnOK() 
{
    UpdateData(true);
 if(m_user==" ")
 {
  AfxMessageBox("请填写你用户名!",MB_ICONEXCLAMATION);
  return;
 }

 m_user.TrimRight(" ");
 m_passwd.TrimRight(" ");
 _variant_t strquery,holder;
 strquery="select user_ID, user_PWD from user_Info where user_ID='"+m_user+"' and user_PWD='"+m_passwd+"'";
 theApp.adoexecute(theApp.m_padoset,strquery);
 int count=theApp.m_padoset->GetRecordCount();
 if(count==0)
 {
     theApp.m_Logincount++;
  if(theApp.m_Logincount>2)
  {
   ::AfxMessageBox("没有这个用户\n三次输入均不正确,请核对后再来", MB_ICONEXCLAMATION);
   CDialog::OnCancel();
   return;
  }
  AfxMessageBox("没有这个用户,请重新输入用户名", MB_ICONEXCLAMATION); 
     return;
 }
 else
 {
   theApp.m_sCurrentuser=m_user;
      CDialog::OnOK();
 }
}

//在试图类中创建一个ListCtrl表格

 

首先要在C**view类中定义:

CListCtrl m_ListCtrl;//listctrl表格
CStatic m_StaticCtrl;//静态文本框

void C**View::OnInitialUpdate() //该函数是在窗体启动时,在视图内初始化,如这里的静态文本框
{
 CView::OnInitialUpdate();
 
 CRect rect;
 rect.left=rect.top=10;
 rect.bottom=30;
 rect.right=120;
 m_StaticCtrl.Create(m_sCurrentList,WS_VISIBLE,rect,this,1);
}

void C**View::CreateMaterialInfo()
{
 m_sCurrentList = _T("物资列表");
    m_StaticCtrl.SetWindowText(m_sCurrentList);
 
 CRect rect;
 GetClientRect(rect);
 rect.top += 30;

//创建一个ListCtrl表格

 m_ListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT, rect, this, 1);

 m_ListCtrl.SetBkColor(RGB(177, 151, 240));
 m_ListCtrl.SetTextColor(RGB(0,0,0));
 m_ListCtrl.SetTextBkColor(RGB(177, 151, 240));
 
 // Set EX-Style
 m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);

 // 创建标题
 m_ListCtrl.InsertColumn(0,_T("物资编号"), LVCFMT_LEFT, 100);
 m_ListCtrl.InsertColumn(1,_T("物资名称"), LVCFMT_LEFT, 100);
    m_ListCtrl.InsertColumn(2,_T("规格型号"), LVCFMT_LEFT, 100);
 m_ListCtrl.InsertColumn(3,_T("类    别"), LVCFMT_LEFT, 100);
 m_ListCtrl.InsertColumn(4,_T("计量单位"), LVCFMT_LEFT, 100);

 // 获得所有记录
 _variant_t Holder, strQuery;
    strQuery = "select * from material order by wzid";
 theApp.adoexecute(theApp.m_padoset, strQuery);
    int iCount = theApp.m_padoset->GetRecordCount();
 if ( 0==iCount ) return;
 
    CString str;
 theApp.m_padoset->MoveFirst();
 for(int i=0; i<iCount; i++)
 {
  // 获得物资ID
  Holder = theApp.m_padoset->GetCollect("wzid");
     str = Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
     m_ListCtrl.InsertItem(i, str);
     // 获得物资名称
        Holder = theApp.m_padoset->GetCollect("wzname");
     str = Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
     m_ListCtrl.SetItemText(i, 1, str);
  // 获得物资规格型号
        Holder = theApp.m_padoset->GetCollect("wzspec");
  str = Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
     m_ListCtrl.SetItemText(i, 2, str);
  // 获得物资类别
        Holder = theApp.m_padoset->GetCollect("wzkind");
     str = Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
     m_ListCtrl.SetItemText(i, 3, str);
  // 获得物资计量单位
        Holder = theApp.m_padoset->GetCollect("wzunit");
     str = Holder.vt==VT_NULL?"":(char*)(_bstr_t)Holder;
     m_ListCtrl.SetItemText(i, 4, str);  
  theApp.m_padoset->MoveNext();
 }
}

void C**View::RefreshMaterial()
{
   if (m_ListCtrl) m_ListCtrl.DestroyWindow();
 
    CreateMaterialInfo();
    
    m_sCurrentList = _T("物资列表");
    m_StaticCtrl.SetWindowText(m_sCurrentList);
}

原创粉丝点击