做这个系统前期最纠结的就是怎么和数据库建立连接,安装sql server2005也耗费了很多的时间,结果到最后装的是精简版本的,以至于到后来连接数据库怎么也连接不上,这里还是推荐用开发版的sql server 2005,安装的过程如果有什么不明白的去百度搜索视频,安装完sql 2005以后就开始看关于sql 2005的书目,代码的东西当然略去不看,只需要学会,如何附加数据库,如何的备份导出数据库,以及数据库的设置等等一些就够了,在这中间浪费了一大部分的时间。设置好了,就要开始编程了,我还是比较懒的,有现成的程序,先仔细的研究,然后做了适当的修改,因为我只用到其中的一个模块。
列举一下遇到的问题,以及解决:
1. 跟一个对话框控件相关联,vc++是不支持一个对话框对应多个类的,最开始就是犯得这个错误,新建一个对话框,然后指定它对应的类,新建工程时候系统自动创建的对话框A做欢迎界面,新建的对话框做学生信息的界面。
2. 然新建了一个对话框B,那么我们肯定要从A当中弹出B才能达到我们需要的目的,在A的资源视图中新建Menu类,然后在ADlg的初始化函数中增加显示的学生信息菜单的代码。
CMenu menu;
menu.LoadMenu(IDR_MENU1);
SetMenu(&menu);
在新建的Menu图标上双击,然后在函数中添加
CB dlgMenu; dlgMenu.DoModal(); //我最开始用的是CDlg dlg; dlg.DoMal();结果出来的是一个我们建立的B的框架,所有按键均不管用
然后就可以实现由A菜单弹出B窗口
3. B中初始化COM接口,建立连接。初始化,以及建立连接用的是以下代码,最初的时候试了很多版本,因为是sql的问题,统统没连接上,这里的字符串生成可以用vb,也可以用新建.udl文件双击设置的方法
CoInitialize(NULL);
// TODO: Add extra initialization here
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->Open("Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=SSS;Data Source=WANGLING-PC","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
CoUninitialize();
} try catch是在编程中一直要用到的
4. 开表:打开表的时候费了很大劲儿:最初让同学帮忙改,他用的是 CString strSql="select * from student";
m_pRecordset=m_pConnection->Execute(_bstr_t(strSql),NULL,adCmdText);
这种方法,但是问题是大大的,因为我们要用的MoveLast等函数,结果一遇到这些函数就是大大的 run time error,实在纠结啊,这里这种方法,结果去csdn中搜索一下,找到了原因:
CursorType 属性
指示在 Recordset 对象中使用的游标类型。
设置和返回值
设置或返回以下某个 CursorTypeEnum 值。
常量 说明
AdOpenForwardOnly 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。
AdOpenKeyset 键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。
AdOpenDynamic 动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。
AdOpenStatic 静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。
我们没有设置游标类型,以至于n多的bug出现,于是进行了修改:
m_pRecordset->Open("SELECT * FROM student",
//theApp.m_pConnection.GetInterfacePtr(),//在A类建立的连接用
_variant_t((IDispatch*)m_pConnection,true),//在B类建立的连接用
adOpenDynamic,adLockOptimistic,adCmdText);
大功搞成