数据库系统概论实验报告4Word格式.docx
《数据库系统概论实验报告4Word格式.docx》由会员分享,可在线阅读,更多相关《数据库系统概论实验报告4Word格式.docx(16页珍藏版)》请在冰点文库上搜索。
,'
数据库'
5'
4);
2'
数学'
NULL,2);
3'
信息系统'
4'
操作系统'
6'
3);
数据结构'
7'
数据处理'
PASCAL语言'
8'
DB_DESIGN'
2);
--表的结构'
sc'
CREATETABLEsc(
Snochar(9)NOTNULLDEFAULT'
'
Cnochar(4)NOTNULLDEFAULT'
GradesmallintDEFAULTNULL,
PRIMARYKEY(Sno,Cno),
INSERTINTOsc(Sno,Cno,Grade)VALUES
200215121'
92);
85);
88);
200215122'
90);
80);
----------------------------------------------------------
student'
CREATETABLEstudent(
Snochar(9)NOTNULL,
Snamechar(20)DEFAULTNULLUNIQUE,
Ssexchar
(2)DEFAULTNULL,
SagesmallintDEFAULTNULL,
Sdeptchar(20)DEFAULTNULL,
PRIMARYKEY(Sno),
)
INSERTINTOstudent(Sno,Sname,Ssex,Sage,Sdept)VALUES
李勇'
男'
20,'
CS'
);
刘晨'
女'
19,'
200215123'
王敏'
18,'
MA'
200215125'
张立'
IS'
200215128'
陈冬'
--限制表'
ALTERTABLEcourse
ADDCONSTRAINTcourse_ibfk_1FOREIGNKEY(Cpno)REFERENCEScourse(Cno);
ALTERTABLEsc
ADDCONSTRAINTsc_ibfk_1FOREIGNKEY(Sno)REFERENCESstudent(Sno);
ADDCONSTRAINTsc_ibfk_2FOREIGNKEY(Cno)REFERENCEScourse(Cno);
2.在应用程序App类的InitInstance()函数中添加如下语句,初始化COM库
AfxOleInit();
3.在stdafx.h中加入如下语句引入ADO类库
#import"
c:
\programfiles\commonfiles\system\ado\msado15.dll"
no_namespacerename("
EOF"
"
adoEOF"
几点说明:
(1)
msado15.dll所在的目录
(2)
在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405)
:
warning
C4146:
unary
minus
operator
applied
to
unsigned
type,
result
4.在应用程序的Dlg类的定义中增加三个成员变量:
_ConnectionPtrm_pConnection;
_RecordsetPtrm_pRecordset;
_CommandPtrm_pCommand;
5.在应用程序的Dlg类的OnInitDialog()函数中末尾添加如下语句:
HRESULThr;
try
{
hr=m_pConnection.CreateInstance("
ADODB.Connection"
///创建Connection对象
if(SUCCEEDED(hr))
{
hr=m_pConnection->
Open("
Driver=SQLServer;
Server=localhost;
Database=scdb;
UID=sa;
PWD=abc"
"
adModeUnknown);
}
}
catch(_com_errore)///捕捉异常
CStringerrormessage;
errormessage.Format("
连接数据库失败!
\r\n错误信息:
%s"
e.ErrorMessage());
AfxMessageBox(errormessage);
///显示错误信息
}
注意:
上面语句中的数据库的名称和用户名密码要根据实际情况来填写。
m_pConnection->
上述函数中参数ConnectionString为连接字串;
参数UserID是用户名;
参数Password是登陆密码;
在本例子中,数据库的用户名和密码均没创建,所以去空值””。
参数Options是连接选项,用于指定Connection对象对数据的更新许可权,一般情况下Options可以是如下几个常量:
adModeUnknown
缺省。
当前的许可权未设置
adModeRead
只读
adModeWrite
只写
adModeReadWrite
可以读写
adModeShareDenyRead
组织其他Connection对象以读权限打开连接
,
adModeShareDenyWrite
阻止其它Connection对象以写权限打开连接
adModeShareExclusive
阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone
阻止其它Connection对象以任何权限打开连接。
6.在对话框上添加三个按钮,设置按钮上的标题分别为:
“使用Connection对象访问数据库”、“使用Command对象访问数据库”和“使用RecordSet对象访问数据库”。
7.分别双击三个按钮,进入到每个按钮的事件处理函数中,添加如下语句,测试与数据库的查询。
(1)Connection对象
_variant_tRecordsAffected;
m_pRecordset=m_pConnection->
Execute("
SELECTCOUNT(*)FROMstudent"
&
RecordsAffected,adCmdText);
_variant_tvIndex=(long)0;
_variant_tvCount=m_pRecordset->
GetCollect(vIndex);
///取得第一个字段的值放入vCount变量
m_pRecordset->
Close();
///关闭记录集
CStringmessage;
message.Format("
共有%d条记录"
vCount.lVal);
AfxMessageBox(message);
///显示当前记录条数
(2)Command对象
m_pCommand.CreateInstance("
ADODB.Command"
_variant_tvNULL;
vNULL.vt=VT_ERROR;
vNULL.scode=DISP_E_PARAMNOTFOUND;
///定义为无参数
m_pCommand->
ActiveConnection=m_pConnection;
///非常关键的一句,将建立的连接赋值给它
CommandText="
SELECT*FROMstudent"
;
///命令字串
m_pRecordset=m_pCommand->
Execute(&
vNULL,&
vNULL,adCmdText);
///执行命令,取得记录集
_variant_tvName,vAge,vDept,vSex;
while(!
m_pRecordset->
adoEOF)///这里为什么是adoEO而不是EOF呢?
还记得rename("
)这一句吗?
vName=m_pRecordset->
GetCollect(_variant_t((long)1));
///取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
vAge=m_pRecordset->
GetCollect("
sage"
///取得username字段的值
vDept=m_pRecordset->
sdept"
vSex=m_pRecordset->
ssex"
///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
if(vName.vt!
=VT_NULL&
&
vAge.vt!
vDept.vt!
vSex.vt!
=VT_NULL)
TRACE("
姓名:
%s,性别:
%s,年龄:
%d,所在系:
%s\r\n"
(LPCTSTR)(_bstr_t)vName,
(LPCTSTR)(_bstr_t)vSex,
vAge.lVal,
(LPCTSTR)(_bstr_t)vDept);
m_pRecordset->
MoveNext();
///移到下一条记录
(3)RecordSet对象
m_pRecordset.CreateInstance("
ADODB.Recordset"
_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
adoEOF)///这里为什么是adoEOF而不是EOF呢?
///添加1条新记录并赋值
try{
AddNew();
///添加新记录
PutCollect("
sno"
_variant_t("
201400015"
));
sname"
李四4"
男"
_variant_t((long)18));
CS"
}
AddNew!
Move(1,_variant_t((long)adBookmarkFirst));
///从第一条记录往下移动一条记录,即移动到第二条记录处
PutCollect(_variant_t("
),_variant_t((long)46));
///修改其年龄
Update();
///保存到库中
//m_pRecordset->
/*m_pRecordset->
MoveLast();
///移到首条记录
try{
Delete(adAffectCurrent);
///删除当前记录
删除!
}*/
出现的问题
1.数据库链接不成功
2.格式不正确,编写代码有误
3.通过接收编辑框中的数据然后和数据库中的sno进行比对,如果正确即输出sno,得不到正确结果
CoInitialize(NULL);
_ConnectionPtrpConn(__uuidof(Connection));
_RecordsetPtrpRst(__uuidof(Recordset));
pConn->
ConnectionString="
Provider=SQLOLEDB.1;
PersistSecurityInfo=False;
UserID=sa;
InitialCatalog=chl"
adConnectUnspecified);
pRst=pConn->
select*fromchl"
NULL,adCmdText);
GetDlgItem(IDC_EDIT3)->
GetWindowText(ch1);
_variant_tvar1=pRst->
pRst->
rsEOF&
ch1==var1.vt)
{
((CListBox*)GetDlgItem(IDC_LIST1))->
AddString((_bstr_t)pRst->
sdate"
pRst->
}
pRst.Release();
pConn.Release();
CoUninitialize();
解决方案
1.重新设置密码,改名。
2.由于软件版本不同导致编写出现问题,根据情况修改语句。
3.从数据库里获得的字符串中含有一些空格。