视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
MFC中用ADO访问数据库
2020-11-09 08:11:43 责编:小采
文档

个人觉得,数据库操作连接和操作上手很快,但是那些类型总是会让你头疼 目前我还没搞清楚用怎么从T-SQL 的decimal技术到MFC中相应的数据?? 将一下数据库连接的步骤 一:加载动态链接库 #import C:\Program Files\Common Files\System\ADO\msado15.dll \ no

个人觉得,数据库操作连接和操作上手很快,但是那些类型总是会让你头疼

目前我还没搞清楚用怎么从T-SQL 的decimal技术到MFC中相应的数据??


将一下数据库连接的步骤


一:加载动态链接库

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

讲一下这句话什么意思,就是导入动态链接库,否则你的那个什么ptrConn,ptrRecord连接指针,都会在编译的时候报错

第二个rename,EOF替换成,EndOfFile是为了在从记录集Recordset取出来时候,判断是否到达了结尾

如果是到达了结尾,那么就会返回非VARIANT_FALSE


二:声明连接指针和记录集

_ConnectionPtr ptrConn; // 定义Connection对象
_RecordsetPtr ptrRecord;

三:创建连接

CoInitialize(NULL); //不要忘记了,否则指针全部为空,无效

try//打开连接
	{

	// 创建一个连接实体
	ptrConn.CreateInstance(__uuidof(Connection));
	// 设定连接等待的最大秒数,默认是15秒
	ptrConn->ConnectionTimeout = 20;
	// 打开连接
 ptrConn->Open("driver={SQL server};server=127.0.0.1;uid=laicb;pwd=616458;database=DBCourse", 
	"",//登录用户名
	"",//登录密码
	adConnectUnspecified);//打开连接
	}
	catch(_com_error &e)--捕获异常
	{
	CString str;
	CString strTemp;
	str.Format(TEXT("Error:\n"));
	strTemp.Format(TEXT("Code = %08lx\n"), e.Error());
	str+="\n";
	str+=strTemp;
	
	strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description());
	str+="\n";
	str+=strTemp;
	MessageBox(str);
	}
四:打开记录集,初始化记录集
try
	{
	//_RecordsetPtr ptrRS; // recordset 对象
	// 创建recordset 对象实体

	ptrRecord.CreateInstance(__uuidof(Recordset));//有些时候如果记录级背使用过了,可能需要重新创建实例,然后再打开
	ptrRecord->Open("select * from dbo.StaffInfo",///为什么把这里的数据库改成dbo.StaffRecord时候,列表框就显示全为空
	ptrConn.GetInterfacePtr(),
	adOpenKeyset, //注意在VB说明文档时候,首字母a是大写的,在C++中应该小写
	adLockBatchOptimistic, 
	adCmdText);
	//int j= ptrRecord->RecordCount;
	//或者
	//ptrRS = ptrConn ->Execute(m_ strSql,NULL, adCmdText);

	}
	catch(_com_error &e)
	{
	CString str;
	CString strTemp;
	str.Format(TEXT("Error:\n"));
	strTemp.Format(TEXT("Code = %08lx\n"), e.Error());
	str+="\n";
	str+=strTemp;
	
	strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description());
	str+="\n";
	str+=strTemp;
	MessageBox(str);
	}
五,执行语句
	try
	{
	ptrConn->Execute("select * from dbo.Login",NULL,adCmdText);
	ptrRecord->MoveFirst();//加了这句这会就可以取出数据了,可能是上一个父亲指针已经把其移动到最后了
	int i= ptrRecord->RecordCount;//如果把游标从动态到记录集,那么这个参数就有用
	while(ptrRecord->EndOfFile==VARIANT_FALSE)
	{	
	_variant_t va;
	_variant_t str;
	va.vt=VT_I4;
	va.lVal=0;
	str = ptrRecord->Fields->GetItem(va)->Value;
	CString strGetID((wchar_t*)(_bstr_t)str);
	str = ptrRecord->Fields->GetItem(short(1))->Value;
	CString strGetSerect((wchar_t*)(_bstr_t)str);
	strGetID.TrimRight();
	strGetSerect.TrimRight();
	right=ptrRecord->Fields->GetItem(short(2))->Value.intVal;
	if(strGetID==strID&&strGetSerect==strSerect)
	{
	isadmin=true;
	}
	ptrRecord->MoveNext();
	}
	}
	catch(_com_error &e)
	{
	CString str;
	CString strTemp;
	str.Format(TEXT("Error:\n"));
	strTemp.Format(TEXT("Code = %08lx\n"), e.Error());
	str+="\n";
	str+=strTemp;
	
	strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source());
	str+="\n";
	str+=strTemp;

	strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description());
	str+="\n";
	str+=strTemp;
	AfxMessageBox(str);
	}
Connection::Execute来执行SQL语句,如果有返回结果的,那么就返回Recordset,如果无需返回的就可以直接执行

取出查询结果是

 ptrRecord->Fields->GetItem(va)->Value;
 ptrRecord->Fields->GetItem(va)->Name;
va是
_variant_t va;
va.vt=VT_I4;
va.lVal=0;
也可以这样
 ptrRecord->Fields->GetItem(short(0))->Name;
返回结果是

while(ptrRecord->EndOfFile==VARIANT_FALSE)
取出结果集
ptrRecord->MoveNext();

有些时候,如果你的结果集已经被全部取出来的时候,也就是你的结果集已经到了非VARIANT_FALSE
这时候你就需要重新创建实例,然后打开,
ptrRecord.CreateInstance(__uuidof(Recordset));//有些时候如果记录级背使用过了,可能需要重新创建实例,然后再打开
	ptrRecord->Open("select * from dbo.StaffInfo",///为什么把这里的数据库改成dbo.StaffRecord时候,列表框就显示全为空
	ptrConn.GetInterfacePtr(),
	adOpenKeyset, //注意在VB说明文档时候,首字母a是大写的,在C++中应该小写
	adLockBatchOptimistic, 
	adCmdText);

这样你才能重新使用,不然好像MoveFirst,么有用啊
另外如果你结果集在某处调用了close,那么你再次使用的时候一定要执行上面这段语句,否则会报说记录集已经关闭了,wufa使用

六:Command对象的使用

try
{
// Create Connection Object (1.5 Version)
Conn1.CreateInstance( __uuidof( Connection ) );
Conn1->ConnectionString = bstrConnect;
Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty, -1 );
// Create Command Object
Cmd1.CreateInstance( __uuidof( Command ) );
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = _bstr_t("SELECT * FROM mytable WHERE age< ?");

然后执行就可以了cmd1->Execute就OK了


结束:

一些释放操作,置空操作


下载本文
显示全文
专题