Maison > base de données > tutoriel mysql > MFC 中用ADO访问数据库

MFC 中用ADO访问数据库

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2016-06-07 15:12:06
original
1759 Les gens l'ont consulté

个人觉得,数据库操作连接和操作上手很快,但是那些类型总是会让你头疼 目前我还没搞清楚用怎么从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);
	}
Copier après la connexion
四:打开记录集,初始化记录集

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);
	}
Copier après la connexion
五,执行语句

	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);
	}
Copier après la connexion
Connection::Execute来执行SQL语句,如果有返回结果的,那么就返回Recordset,如果无需返回的就可以直接执行

取出查询结果是

 ptrRecord->Fields->GetItem(va)->Value;
Copier après la connexion
<pre class="brush:php;toolbar:false"> ptrRecord->Fields->GetItem(va)->Name;
Copier après la connexion
va是
Copier après la connexion
<pre class="brush:php;toolbar:false">_variant_t va;
va.vt=VT_I4;
va.lVal=0;
Copier après la connexion
也可以这样
Copier après la connexion
<pre class="brush:php;toolbar:false"> ptrRecord->Fields->GetItem(short(0))->Name;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
返回结果是
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<pre class="brush:php;toolbar:false">while(ptrRecord->EndOfFile==VARIANT_FALSE)
Copier après la connexion
Copier après la connexion
取出结果集
Copier après la connexion
ptrRecord->MoveNext();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
有些时候,如果你的结果集已经被全部取出来的时候,也就是你的结果集已经到了非VARIANT_FALSE
Copier après la connexion
这时候你就需要重新创建实例,然后打开,<pre class="brush:php;toolbar:false">ptrRecord.CreateInstance(__uuidof(Recordset));//有些时候如果记录级背使用过了,可能需要重新创建实例,然后再打开
	ptrRecord->Open("select * from dbo.StaffInfo",///为什么把这里的数据库改成dbo.StaffRecord时候,列表框就显示全为空
	ptrConn.GetInterfacePtr(),
	adOpenKeyset, //注意在VB说明文档时候,首字母a是大写的,在C++中应该小写
	adLockBatchOptimistic, 
	adCmdText);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
这样你才能重新使用,不然好像MoveFirst,么有用啊
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
另外如果你结果集在某处调用了close,那么你再次使用的时候一定要执行上面这段语句,否则会报说记录集已经关闭了,wufa使用
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

六: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了


结束:

一些释放操作,置空操作



Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal