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);
}