*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bccn.net
*/ 作者: 赵博闻
*/ 时间: 2007-10-29 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
我自己做了个用SQL2000联接的例子,请大家帮我看看,有什么不足还望指教。如能得到您的点滴指点
都将万分感谢。
这个例子现在只能操作一张表,要想操作整个库也不难,就是改SQL语句,然后配好数据库,建议使用存储过程
正文:
简易数据库系统
第一部分:用ADO连接SQL Server 2000
1 在STDafx.h中加入动态连接库msado15.dll,并重命名EOF为adoEOF,加在该文件后面(蓝色#endif后面,要是编译时有错误说明位置不对)
#import "D:\Program Files\Common Files\System\ado\msado15.dll"\
no_namespace rename("EOF","adoEOF")
2 在App类中定义连接字符串。我的是CADOApp,文件是ADO.h
_ConnectionPtr m_pConnection;
3 在数据操作类InitInstance()中初始化COM类库
//这就是初始化COM库
//应用程序主类的InitInstance成员函数里初始化OLE/COM库环境
if (!AfxOleInit()) {
AfxMessageBox("OLE/COM初始化失败");
return FALSE;
}
theApp.m_pConnection.CreateInstance(__uuidof(Connection));
要在其它操作前面初始化,我的是dlg,原来在它后面初始化的结果走不到那一步,所以m_pConnection总是为NULL/0x000000000
4 再要操作的地方初始化结果集和连接字符串,我的是在一个按钮里
void CADOAccessDlg::OnBtnExec()
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
CString strLink;//连接字符串
try
{ strLink.Format("Provider=SQLOLEDB;server=ZHAOPENG;UID=sa;PWD=sa;database=MD200");
theApp.m_pConnection->Open((_bstr_t)strLink,"","",NULL);
}
catch(_com_error e)
{
AfxMessageBox("连接SQL Server失败!");
return;
}
//UpdateData(true);
theApp.m_pConnection->Close();
}
如果要在文件中使用theApp,不要忘记在文件头部(不是头文件)加上extern CADOAccessApp theApp
以上就是连接数据库的简单方法。
第二部分:向ListCtrl中添加数据库中表的数据
1先写两个方法用于添加表头,和内容,ListCtrl要用Report格式
//初始化列表框
void CADOAccessDlg::InitReport()
{
m_List.InsertColumn(0,_T("音乐名称"),LVCFMT_LEFT,120,-1);
m_List.InsertColumn(1,_T("作者/歌手"),LVCFMT_LEFT,90,-1);
m_List.InsertColumn(2,_T("备注"),LVCFMT_LEFT,110,-1);
m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);
}
//显示列表框里的内容,从MidoSond表中
void CADOAccessDlg::UpdataReport()
{
m_List.DeleteAllItems();
//查询
m_pRecordset.CreateInstance(__uuidof(Recordset));
CString strLink;
try
{
strLink.Format("Provider=SQLOLEDB;server=ZHAOPENG;UID=sa;PWD=sa;database=MidoText");
theApp.m_pConnection->Open((_bstr_t)strLink,"","",NULL);
}
catch(_com_error e)
{
AfxMessageBox("连接SQL Server失败!");
return;
}
UpdateData(true);
try
{
m_pRecordset->Open("select * from TextSond",theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,//动态
adLockOptimistic,//乐观封锁法
adCmdText);//文本查询
}
catch (_com_error e)
{
CString strErr="Select语句执行失败!";
AfxMessageBox(e.ErrorMessage()+strErr);
}
_variant_t vat;
CString MusicName,ZhuoZhe,SomethingAbout;
CString strDomainName;
while (!m_pRecordset->adoEOF)
{//获取一个字段
vat = m_pRecordset->GetCollect("音乐名称");
if (vat.vt != VT_NULL) {
MusicName = (LPCSTR)_bstr_t(vat);
MusicName.TrimLeft();//清除左边的空格
}
vat = m_pRecordset->GetCollect("作者/歌手");
if (vat.vt != VT_NULL) {
ZhuoZhe = (LPCSTR)_bstr_t(vat);
ZhuoZhe.TrimLeft();
}
vat = m_pRecordset->GetCollect("备注");
if (vat.vt != VT_NULL) {
SomethingAbout = (LPCSTR)_bstr_t(vat);
SomethingAbout.TrimLeft();
}
int pos,id=1;
pos = m_List.InsertItem(id,strDomainName);
m_List.SetItemText(pos,0,MusicName);
m_List.SetItemText(pos,1,ZhuoZhe);
m_List.SetItemText(pos,2,SomethingAbout);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
theApp.m_pConnection->Close();
}
2在ShowWindow事件中调用,因为该事件先于其它任何事件所以在这一个就建立了数据库连接(连接写在第二个方法里)
void CADOAccessDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
this->InitReport();
this->UpdataReport();
}
第三部分:添加,修改,删除
这三项功能看似简单实则重要,使操作数据库系统的核心操作,可以扩展出许多其他功能。
分析:三项功能的本质在于1检索输入设备中输入的数据合法性,将其保存到相应的变量中。2调用命令函数,对连接的数据库进行操作。3将操作结果返回到输出设备上。
我们就按照这样的思想编成,以添加功能为例说明其它给出代码
//1检索输入设备中输入的数据合法性,将其保存到相应的变量中
void CADOAccessDlg::OnBtnAdd()
{
//判断是否有字符输入
if (ISEmpty()) {
return;
}
//不可以出现前两项一样的输入(正则表达式)
if (ISHaveString()==false) {
return;
}
//得到所输入的字符
BOOL IsUpdata = FALSE;
DataTable = "TextSond";//数据表名字
//这里我原来想作动态建库的所遗留了变量
CString strWeather;
CString strMusicName,strMen,strSomething;
((CEdit*)GetDlgItem(IDC_EdtMusicName))->GetWindowText(strMusicName);
((CEdit*)GetDlgItem(IDC_EdtZZName)