Rumah > pangkalan data > tutorial mysql > MFC 中用ADO访问数据库

MFC 中用ADO访问数据库

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-06-07 15:12:06
asal
1759 orang telah melayarinya

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

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);
	}
Salin selepas log masuk
五,执行语句

	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);
	}
Salin selepas log masuk
Connection::Execute来执行SQL语句,如果有返回结果的,那么就返回Recordset,如果无需返回的就可以直接执行

取出查询结果是

 ptrRecord->Fields->GetItem(va)->Value;
Salin selepas log masuk
<pre class="brush:php;toolbar:false"> ptrRecord->Fields->GetItem(va)->Name;
Salin selepas log masuk
va是
Salin selepas log masuk
<pre class="brush:php;toolbar:false">_variant_t va;
va.vt=VT_I4;
va.lVal=0;
Salin selepas log masuk
也可以这样
Salin selepas log masuk
<pre class="brush:php;toolbar:false"> ptrRecord->Fields->GetItem(short(0))->Name;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
返回结果是
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
<pre class="brush:php;toolbar:false">while(ptrRecord->EndOfFile==VARIANT_FALSE)
Salin selepas log masuk
Salin selepas log masuk
取出结果集
Salin selepas log masuk
ptrRecord->MoveNext();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
有些时候,如果你的结果集已经被全部取出来的时候,也就是你的结果集已经到了非VARIANT_FALSE
Salin selepas log masuk
这时候你就需要重新创建实例,然后打开,<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);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
这样你才能重新使用,不然好像MoveFirst,么有用啊
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
另外如果你结果集在某处调用了close,那么你再次使用的时候一定要执行上面这段语句,否则会报说记录集已经关闭了,wufa使用
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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


结束:

一些释放操作,置空操作



sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan