|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专业性的服务。有的ASP商提供垂直型的应用服务,针对某一特定行业提供应用服务。ado|odbc|会见|数据|数据库 比来一向在进修研讨用vc++会见数据库的成绩,利用过ADO,也利用过ODBC。就这两种毗连数据源的接口都有好几种体例,能够使用database,也能够使用dataset。使用这个word把我进修的思绪收拾一下。
1、利用ADO毗连数据源
一样平常来讲当创建基于对话框的使用程序时,都选择利用ADO对照便利(这纯属团体习气成绩)。
1.间接在使用程序中创建与数据库的connection
2.本人写一个ADOConnection类作为使用程序操纵数据库的接口,如许操纵的条理更分明,程序的分层头脑也表现较好。
上面分离就这两种办法做个总结。
1.间接在使用程序中创建与数据库的connection
在使用程序中要利用ADO,则必要引进ADO的静态毗连库。其办法为:
在StdAfx.h中:
#import"c:programfilescommonfilessystemadomsado15.dll"
no_namespace
rename("EOF","adoEOF")
目标:发生msado15.tlh和msado15.tli两个头文件来界说ADO库。
界说好ADO库后,应初始化COM库情况。其办法为:
在C***APP::InitInstance中界说_ConnectionPtrm_pConnection;
AfxOleInit();//利用AfxOleInit初始化OLE/COM库情况
//创立ADO毗连
m_pConnection.CreateInstance(_uuidof(Connection));
//在ADO操纵中利用try...catch捕捉毛病
try
{ m_pConnection->Open("provider=SQLOLEDB;server=ZENGYH;database=postms;uid=sa;pwd=hongyi","","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox("毗连数据库失利!");
returnFALSE;
}
而响应的开释数据库的毗连:
在C***APP::ExitInstance中:
m_pConnection->Close();
::OleUninitialize();
至此,关于数据库的毗连与断开就可以顺遂完成,接上去将是对数据库中表的操纵,即对纪录集操纵。当操纵数据库的表时,需先声明数据集指针:_RecordsetPtrm_pRecordset;与创立ADO毗连相似,必要在所操纵的对话框类的OnInitDialog()中创立纪录集工具:
m_pRecordset.CreateInstance(_uuidof(Recordset));
云云以后将可使用m_pRecordset来查询,修正,删除数据库等。
翻开要操纵的表可以使用m_pRecordset的open函数m_pRecordset->Open("select*fromSTUDENTS",theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
纪录集的查询操纵:
利用可使用以下的函数来完成纪录集的挪动Movefirst,movenext,moveprev,movelast。
提取列属性:getcollect(“列名”),注重:此处的前往值范例为:_variant_t,这个范例类包括了很多与c++所撑持的范例的转换函数,较经常使用的是与cstring范例的转换(LPCSTR)_bstr_t(_variant_t范例变量)。
纪录集的增添操纵:
确保要操纵的纪录集翻开以后,起首挪用m_pRecordset->addnew(),addnew以后将主动天生一个供纪录集域值利用的新的空纪录,来寄存行将增添的数据信息,体系将主动实行sql的insert语句来拔出纪录。
然后经由过程设置列属性:putcollect(“列名”,_variant_t&pvar)来设置纪录信息
设置以后必定要挪用m_pRecordset->update来更新纪录集
纪录集的修正操纵:
修正操纵与增添操纵相似,独一分歧的地方在于不必先挪用addnew,而间接将纪录集指针挪动到必要修正的纪录处,实行putcollect操纵。
以后再update。
纪录集的删除操纵:
当找到必要删除的纪录时,使用m_pRecordset->Delete(adAffectCurrent);能够删除以后的纪录。再update便可。
固然,在每次必要对纪录集操纵之前应该翻开必要操纵的表的纪录集,操纵终了应封闭响应纪录集,如许能够包管只声明一个纪录集指针,每次只操纵一个纪录集,能够勤俭资本。
别的,在修正和删除操纵中也大概必要查询满意前提的纪录,能够如许完成:
str.Format("select*fromSTUDENTSwhereStuID=%s",m_StuID); m_pRecordset->Open(str.AllocSysString(),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
2.本人写一个ADOConnection类作为使用程序操纵数据库的接口
经由过程自界说的ADOConnection类封装与使用程序操纵数据库的接口(在这个类中应起首声明_connectionptr和_recordsetptr指针),这个类中要完成的功效包含:界说ADO库,初始化与ADO的毗连,开释毗连,初始化纪录集(办法1的初始化是在响应类的OnInitDialog()中完成),实行SQL语句
界说ADO库,初始化与ADO的毗连,开释毗连与办法1分歧;
初始化纪录集:
_RecordsetPtr&CAdoConnection::GetRecordset(_bstr_tmySql)
{
try
{
if(m_pConnection==NULL)
{
OnInitAdoConneciton();
}
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pRecordset->Open(mySql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
returnm_pRecordset;
}
实行SQL语句次要利用connection来完成(分歧于办法1使用纪录集来完成)
boolCAdoConnection::ExecuteSql(_bstr_tmySql)
{m_pConnection->Execute(mySql,NULL,adCmdText);}
至此,在使用程序中能够经由过程界说这个ADOConnection的实例来完成响应的操纵。
查询操纵:
起首界说ADOConnection,实行初始化ADO毗连;依据查询前提获得纪录集指针:
_bstr_tmySql="select*fromCOURSESwhereCouID="+m_CouID+"";
_RecordsetPtrmyRecordset=myConnection.GetRecordset(mySql);
依据指针的前往情形举行处置。
增加操纵:
起首依据实践情形判别所要增加的纪录是不是存在(相似查询);若前往的指针是为空,则申明要增加的纪录不存在,则能够实行insert:
mySql="insertintoCOURSESvalues("+m_CouID+","+m_CouName+","+CouScore+","+CouTea+","+m_CouKind+")";
myConnection.ExecuteSql(mySql);
修正操纵、删除操纵:
与增加操纵相似,实行update和delete语句
申明:每一个函数中的初始化ADOConnection和开释应绝对应。
与办法1比拟,不必要单条操纵纪录集,纪录集指针也能够声明多个,实行sql语句更便利。
纪录集的初始化能够通用到ADOConnection类中,而无需办法1中在分歧的类中初始化各自的纪录集。
2、利用ODBC毗连数据源
一样平常来讲创建基于文档视图的使用程序时,利用此办法毗连数据源。
1.利用CDatabase类中的executesql实行SQL语句
当创立基于单文档的使用程序时,若在第二步选择databaseviewwithfilesupport,则必要设置ODBC数据源(如student表),而且天生的使用程序的基类为recordview。那末天生的使用程序的Doc类中将主动天生所绑定的数据集类(cstudentsetm_studentset),View类中将主动天生(cstudentset*m_pset)。
毗连数据库:
对数据库的毗连要重载BOOLCStudentDoc::OnNewDocument():
在该函数中到场如许的代码(m_database是我在文档类中界说的成员变量CDatabase):
if(m_pStudentSet==NULL)
{
m_pStudentSet=newCStudentSet(&m_database);
CStringstrConnect=m_pStudentSet->GetDefaultConnect();
m_database.Open(NULL,false,false,strConnect,false);
}
这里m_pStudentSet是在该文档类中从头界说的一个CStudentSet纪录集指针,至此能够创建使用程序与数据库的毗连。增加纪录操纵:
在响应函数中声明CDatabasem_database
在函数中界说CStudentSetmySet(&m_database);
再翻开纪录集myset.open();
mySet.AddNew();
CStringmySql;
mySql="insertintoSTUDENTS(StuID,StuName)values("+m_pSet->m_StuID+","+m_pSet->m_StuName+")";
m_database.ExecuteSQL(mySql);
mySet.Update();
删除纪录、修正纪录操纵:
在函数中界说CStudentSetmySet(&m_database);
再翻开纪录集myset.open();
mySet.Edit();
mysql=…….
m_database.ExecuteSQL(mySql);
mySet.Update();
查询纪录操纵:
仍旧能够选用纪录集指针的挪动,getcollect来完成。
最初,不要健忘myset.close()。
固然也能够利用CRecordset类来实行查询、删除、修正、增加操纵。基础办法跟后面所提到的分歧。这是我第一次在博客内里发文章,关于不成熟大概不准确的头脑还请人人提出,感谢。
对于中小型web应用来说,php有很强的竞争力,linux+apache+mysql+php(lamp)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,jsp的struts是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来。asp就不用说了, |
|