MFC 中用ADO访问数据库
个人觉得,数据库操作连接和操作上手很快,但是那些类型总是会让你头疼 目前我还没搞清楚用怎么从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了
结束:
一些释放操作,置空操作
上一篇: php socket 编程的时候,报错后,报错内容乱码??
下一篇: Oracle数据库随笔