AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

在Visual C++中用ADO进行数据库编程

51自学网 2015-08-30 http://www.wanshiok.com

  4.执行SQL命令并取得结果记录集

      为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");
SQL命令的执行可以采用多种形式,下面我们一进行阐述。

  (1)利用Connection对象的Execute方法执行SQL命令

  Execute方法的原型如下所示:

     _RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected,
long Options ) 其中CommandText是命令字串,通常是SQL命令。 参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一: adCmdText:表明CommandText是文本命令 adCmdTable:表明CommandText是一个表名 adCmdProc:表明CommandText是一个存储过程 adCmdUnknown:未知 Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 _variant_t RecordsAffected; ///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,
整形old,日期型birthday m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday
DATETIME)", &RecordsAffected, adCmdText); ///往表格里面添加记录 m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) VALUES
(1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText); ///将所有记录old字段的值加一 m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText); ///执行SQL统计命令得到包含记录条数的记录集 m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText); _variant_t vIndex = (long)0; _variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量 上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0)); m_pRecordset->Close();///关闭记录集 CString message; message.Format("共有%d条记录",vCount.lVal); AfxMessageBox(message);///显示当前记录条数

(2)利用Command对象来执行SQL命令

_CommandPtr m_pCommand;m_pCommand.CreateInstance("ADODB.Command");_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它m_pCommand->CommandText = "SELECT * FROM users";///命令字串m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集

  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。

  (3)直接用Recordset对象进行查询取得记录集

  实例——

void CGmsaDlg::OnDBSelect() {    // TODO: Add your control notification handler code here     _RecordsetPtr Rs1;  //定义Recordset对象    _bstr_t Connect("DSN=GMS;UID=sa;PWD=;");//定义连接字符串    _bstr_t Source ("SELECT count(*) FROM buaa.mdb010");  //要执行的SQL语句    ::CoInitialize(NULL);    //初始化Rs1对象        HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );       //省略对返回值hr的判断      Rs1->Open( Source,            Connect,                adOpenForwardOnly,                    adLockReadOnly,            -1 );     _variant_t temp=Rs1->GetCollect(_variant_t((long)0));    CString strTemp=(char* )(_bstr_t)temp;    MessageBox("OK!"+strTemp);}例如   m_pRecordset->Open("SELECT * FROM users",  _variant_t((IDispatch *)m_pConnection,true),  adOpenStatic,  adLockOptimistic,  adCmdText);Open方法的原型是这样的:HRESULT Recordset15::Open ( const _variant_t & Source,    const _variant_t & ActiveConnection,    enum CursorTypeEnum CursorType,    enum LockTypeEnum LockType,    long Options ) 其中:①Source是数据查询字符串②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) ③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:enum CursorTypeEnum{ adOpenUnspecified = -1,///不作特别指定 adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方
式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用 adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操
作对你是可见的。 adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。 adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你
的记录集来说是不可见的。};④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnum{ adLockUnspecified = -1,///未指定 adLockReadOnly = 1,///只读记录集 adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制 adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做
数据的更新、插入、删除等动作 adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模
式下完成。}; ⑤Options可以取如下值之一: adCmdText:表明CommandText是文本命令 adCmdTable:表明CommandText是一个表名 adCmdProc:表明CommandText是一个存储过程 adCmdUnknown:未知

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC通用控件编程之CStatusBar控件  下一篇:Visual C++多线程DAO处理