• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MFC 中用ADO访问数据库

mysql 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

个人觉得,数据库操作连接和操作上手很快,但是那些类型总是会让你头疼 目前我还没搞清楚用怎么从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<strong style="color:transparent">本文来源gaodai#ma#com搞@@代~&码网^</strong>+=strTemp;		AfxMessageBox(str);	}

Connection::Execute来执行SQL语句,如果有返回结果的,那么就返回Recordset,如果无需返回的就可以直接执行

取出查询结果是

 ptrRecord->Fields->GetItem(va)->Value;
<pre class="prettyprint linenums"> ptrRecord->Fields->GetItem(va)->Name;
va是
<pre class="prettyprint linenums">_variant_t va;va.vt=VT_I4;va.lVal=0;
也可以这样
<pre class="prettyprint linenums"> ptrRecord->Fields->GetItem(short(0))->Name;

返回结果是


<pre class="prettyprint linenums">while(ptrRecord->EndOfFile==VARIANT_FALSE)
取出结果集
ptrRecord->MoveNext();

有些时候,如果你的结果集已经被全部取出来的时候,也就是你的结果集已经到了非VARIANT_FALSE
这时候你就需要重新创建实例,然后打开,<pre class="prettyprint linenums">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了


结束:

一些释放操作,置空操作



搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MFC 中用ADO访问数据库

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址