终于连上你,还好我没放弃,在经过四天的努力挣扎后,最后还是在孙大侠的指点后,才发现错误,竟然不是程序的错误,而是SQL 的设置问题,汗颜。。。
首先在网站上下载SQL Server R2 2008的安装包,然后对其安装,网站上都是有安装教程的,我安装的路径就是默认路径,然后再其中以SQL Server身份验证的方式登录。我设置的登录名是:sa 密码是:123456 这样就可以在其中建立新的数据库 取名为school 在其中建立表格sc 包含了sno cno 以及grade三项,并在表格中随便添加些内容,这样基本的数据库就建立好了,接下来就是如何使其与VS2010相连接。
为了测试是否可以连接上你所建立的数据库,首先新建一个txt文件,并将其后缀名修改成.udl 打开该文件在里面填写相关的信息,如下图:
然后进行测试,当现实测试成功时表明可以了,然后以记事本的方法打开该文件,会发现里面会有相关的信息,这部分后面会用到。
在VS2010中建立mfc界面,在stdafx.h的文件中添加代码:
#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
在对话框窗口中添加了一个连接数据库按钮,一个添加数据库中的数据按钮,以及一个list列表,用于显示数据库中的信息,
首先在OnInitDialog()中添加以下代码:
m_list.ModifyStyle(0, LVS_REPORT);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list.InsertColumn(0, _T("学号"), LVCFMT_CENTER, 200);
m_list.InsertColumn(1, _T("课程号"), LVCFMT_CENTER, 150);
m_list.InsertColumn(2, _T("学分"), LVCFMT_CENTER,200);
在连接数据库按钮下添加以下代码:
// TODO: 在此添加控件通知处理程序代码
::CoInitialize(NULL); //初始化OLE/COM库环境
HRESULT hr = NULL;
try
{
hr = m_pConnection.CreateInstance(_uuidof(Connection));//创建连接对象实例
if (SUCCEEDED(hr))
{
m_pConnection->ConnectionString =("Provider = SQLOLEDB.1; Persist Security Info =True; User ID = sa; Password=123456; Initial Catalog = school; Data Source = (local)");
//local是数据库连接中服务器的名字,这部分是在之前用记事本的方式打开的文件中可以看到
hr = m_pConnection->Open("", "", "", adConnectUnspecified);//打开数据库
AfxMessageBox(_T("连接成功"));
if (FAILED(hr))
{
AfxMessageBox(_T("Open Failed!"));
}
}
else
{
AfxMessageBox(_T("Create instance of connection failed!"));
}
}
catch (_com_error e)
{
CString temp;
temp.Format(_T("数据库连接错误\r\n错误信息为:%s"), e.ErrorMessage());
AfxMessageBox(temp);
}
在添加数据按钮下添加以下代码:
// TODO: 在此添加控件通知处理程序代码
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("select sno, cno, grade from sc",
_variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText);
}
catch (_com_error &e)
{
AfxMessageBox(e.Description());
}
_variant_t sno, cno, grade;
try
{
int num = m_list.GetItemCount();
while (!m_pRecordset->adoEOF)
{
CString sno= (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("sno"))->Value);
CString cno = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("cno"))->Value);
CString grade = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("grade"))->Value);
m_list.InsertItem(num, sno);
m_list.SetItemText(num, 1, cno);
m_list.SetItemText(num , 2, grade);
num++;
m_pRecordset->MoveNext();
}
}
catch (_com_error &e)
{
AfxMessageBox(e.Description());
}
运行以下,大功告成啦~~~~