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

由于以前的经典版本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,打开服务器资源管理器,可以看到如下界面:


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


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


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

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

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

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


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中间注意是双反斜杠!!!!!


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);
	}
}

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

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

猜你喜欢

转载自blog.csdn.net/zhuyinglong2010/article/details/39186037