在VS2010环境下用ADO方式连接SQL2008的步骤

时间:2021-05-28 21:56:23

由于以前的经典版本VC6.0在WIN7上的兼容性不是很好,所以改装了VS2010,发现上面集成了SQL2008的一些东西。要想学习数据库,当然你可以下载一个SQL2008完整安装,在运用下面讲的连接方法连接数据库,当然是没有问题。但对于我这种对系统有洁癖的人,是不允许系统上装多余的东西的,既然集成了,就要用上,而且没必要装那么大一个软件。VS2010自带的SQL本身没有SQLManagementStudio,说通俗点就是不能让你在界面里面操作,比方说建表和添加数据功能。所以,我们需要添加这个功能,让我们能在VS2010里方便的看到我们要操作的数据库。

下面开始步骤:

1、我们要把VS2010自带的SQL升级为SQLEXPRESS版本,1)找到安装VS2010后附带的SQL Server配置管理器里按照向导进行升级操作;2)下载SQLManagementStudio_x86_CHS.exe并按照提示一步步安装;如果不清楚的话可在网上搜下,写的很清楚,是不是比完整安装省了大把的时间?3)在SQLManagementStudio中开启混合模式登陆;如果不清楚的话也可在网上搜下,这样就可以使用用户名和密码登录了。

2、接下来我们就可以在VS2010中进行建表和添加数据等功能了,当然也可以通过SQLManagementStudio进行建表和添加数据等功能。打开VS2010,打开服务器资源管理器,可以看到如下界面:

在VS2010环境下用ADO方式连接SQL2008的步骤

其中CONAN-PC就是我的计算机名字,然后我们新建一个数据连接,右击数据连接,点击添加连接如下:

在VS2010环境下用ADO方式连接SQL2008的步骤

然后按照下面的格式填写,注意是服务器名是:电脑名字\SQLEXPRESS。选择所需连接的数据库文件。下面的test是我以sa身份登录用SQLManagementStudio建的一个数据库文件(这个操作需在SQLManagementStudio中完成)。完成后,测试连接是否成功(此处的连接成功只是为了方便在VS2010中查看和操作数据库,与后文代码书写没有多大关系)。

在VS2010环境下用ADO方式连接SQL2008的步骤

下面就可以对test进行一些操作了,如添加新表(下面添加了student)操作界面如下:

在VS2010环境下用ADO方式连接SQL2008的步骤

添加表定义(下面添加了id,name,age),操作界面如下:

在VS2010环境下用ADO方式连接SQL2008的步骤在VS2010环境下用ADO方式连接SQL2008的步骤

添加数据,操作界面如下:

在VS2010环境下用ADO方式连接SQL2008的步骤在VS2010环境下用ADO方式连接SQL2008的步骤

PS.若遇到修改表无法保存的情况,可打开工具-------选项,打开如下操作,取消防止需要重新创建表的更改前的对勾,顺便说下在SQLManagementStudio中遇到此类情况也与之解决方案相同。

在VS2010环境下用ADO方式连接SQL2008的步骤

3、新建一个MFC对话框(例子中工程名为ado),在stdafx.h中添加如下代码(要添加在所有的#include之后,其中end是结尾字符,为了防止冲突,改为end,当然也可以自己设置,在后来的代码中用作判断指向数据的游标是否到达尾部):

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","end")

PS.若相应的路径下没有msado15.dll可在网上查找解决方案,一般都会有的。

4、绘制如下界面,添加CString类型的编辑框变量(m_id,m_name,m_age,m_check_name),给三个按钮绑定相应的消息函数。连接字符串data source中间注意是双反斜杠!!!!!

在VS2010环境下用ADO方式连接SQL2008的步骤

void CadoDlg::OnBnClickedQuery()
{
try
{
CoInitialize(NULL);
UpdateData(TRUE);
if (m_check_name =="")
{
AfxMessageBox(_T("姓名不能为空"));
return;
}
_ConnectionPtr pconnect(_uuidof(Connection));
_RecordsetPtr record(_uuidof(Recordset));
_CommandPtr comd(_uuidof(Command));
pconnect->ConnectionString="Provider=SQLOLEDB.1;Data Source=CONAN-PC\\SQLEXPRESS;User ID=sa;Password=123456;Initial Catalog=test;Persist Security Info=FALSE";
pconnect->Open("","","",NULL);
comd->PutActiveConnection(_variant_t((IDispatch*)pconnect));
CString cmda=_T("");
cmda="select * from student where name ='";
cmda+=m_check_name;
cmda+="'";
comd->CommandText=_bstr_t(cmda);
record = comd->Execute(NULL,NULL,adCmdText);
if (!record->end)
{
m_name=(char *)(_bstr_t)record->GetCollect("name");
m_id=(char *)(_bstr_t)record->GetCollect("id");
m_age=(char *)(_bstr_t)record->GetCollect("age");
UpdateData(FALSE);
}
else
{
m_name = "";
m_id = "";
m_age = "";
UpdateData(FALSE);
AfxMessageBox(_T("查询不到该学生的信息!"));
}
record->Close();
pconnect->Close();
comd.Release();
record.Release();
pconnect.Release();
CoUninitialize();
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息:%s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}
}

void CadoDlg::OnBnClickedAdd()
{
try
{
CoInitialize(NULL);
UpdateData(TRUE);
if (m_name =="")
{
AfxMessageBox(_T("姓名不能为空"));
return;
}
if (m_age =="")
{
AfxMessageBox(_T("年龄不能为空"));
return;
}
_ConnectionPtr pconnect(_uuidof(Connection));
_RecordsetPtr record(_uuidof(Recordset));
_CommandPtr comd(_uuidof(Command));
pconnect->ConnectionString="Provider=SQLOLEDB.1;Data Source=CONAN-PC\\SQLEXPRESS;User ID=sa;Password=123456;Initial Catalog=test;Persist Security Info=FALSE";
pconnect->Open("","","",NULL);
comd->PutActiveConnection(_variant_t((IDispatch*)pconnect));
CString cmda=_T("");
cmda="insert into student(name,age) values ('";
cmda+= m_name;
cmda+="','";
cmda+= m_age;
cmda+="')";
comd->CommandText=_bstr_t(cmda);
record = comd->Execute(NULL,NULL,adCmdText);
AfxMessageBox(_T("添加成功"));
//record->Close();//数据会添加成功,但运行时会产生错误
pconnect->Close();
comd.Release();
record.Release();
pconnect.Release();
CoUninitialize();
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息:%s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}
}

void CadoDlg::OnBnClickedDelete()
{
try
{
CoInitialize(NULL);
UpdateData(TRUE);
if (m_check_name =="")
{
AfxMessageBox(_T("姓名不能为空"));
return;
}
_ConnectionPtr pconnect(_uuidof(Connection));
_RecordsetPtr record(_uuidof(Recordset));
_CommandPtr comd(_uuidof(Command));
pconnect->ConnectionString="Provider=SQLOLEDB.1;Data Source=CONAN-PC\\SQLEXPRESS;User ID=sa;Password=123456;Initial Catalog=test;Persist Security Info=FALSE";
pconnect->Open("","","",NULL);
comd->PutActiveConnection(_variant_t((IDispatch*)pconnect));
CString cmda=_T("");
cmda="select * from student where name ='";
cmda+=m_check_name;
cmda+="'";
comd->CommandText=_bstr_t(cmda);
record = comd->Execute(NULL,NULL,adCmdText);
if (!record->end)
{
cmda="delete from student where name ='";
cmda+= m_check_name;
cmda+="'";
comd->CommandText=_bstr_t(cmda);
record = comd->Execute(NULL,NULL,adCmdText);
AfxMessageBox(_T("删除成功"));
}
else
AfxMessageBox(_T("该姓名不存在"));
//record->Close();//数据会添加成功,但运行时会产生错误
pconnect->Close();
comd.Release();
record.Release();
pconnect.Release();
CoUninitialize();
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息:%s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}
}

有了这三个函数之后,就可以进行查询,删除,添加操作了,当然代码中有些地方还不是很完善,只是为了让大家看下结构和流程。至于代码中函数的功能,相信大家在网上查查都可以找到相应的解释。

祝君好运,有问题可以相互交流。