CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

在ADO中(VC)Recordset如何使用Addnew添加记录?

楼主David982002()2002-03-20 08:21:57 在 VC/MFC / 基础类 提问

我想给Recordset添加记录,有两种字段,adVarWChar、adInteger,如何操作?最好有一段详细代码。  
  另外,我在一个Table中将一个字段设为Primary   Key,Unique,该字段为adVarWChar型,我的本意是不允许有重复值,但如果在运行中在Addnew中加入一个已存在的值,会出现什么情况,应如何处理? 问题点数:50、回复次数:3Top

1 楼strip(阿飞 - Mozilla●CSDN●痛)回复于 2002-03-20 08:24:46 得分 50

AddNew   Method   Example   (VC++)  
  [This   is   preliminary   documentation   and   subject   to   change.]    
  This   example   uses   the   AddNew   method   to   create   a   new   record   with   the   specified   name.  
   
  //   BeginAddNewCpp  
  #import   "C:\Program   Files\Common   Files\System\ADO\msado15.dll"   \  
          no_namespace   rename("EOF",   "EndOfFile")  
   
   
  #include   <ole2.h>  
  #include   <stdio.h>  
  #include   "conio.h"  
  #include   "AddNewX.h"  
   
  //Function   declaration  
  inline   void   TESTHR(HRESULT   x)   {if   FAILED(x)   _com_issue_error(x);};  
  void   AddNewX(VOID);  
  void   PrintProviderError(_ConnectionPtr   pConnection);  
   
  ///////////////////////////////////////////////////////////  
  //                                                                                                               //  
  //             Main   Function                                                                         //  
  //                                                                                                               //  
  ///////////////////////////////////////////////////////////  
  void   main()  
  {  
        HRESULT     hr   =   S_OK;  
   
        if(FAILED(::CoInitialize(NULL)))    
              return;    
   
        if   (SUCCEEDED(hr))  
        {  
                AddNewX();  
   
              //Wait   here   for   the   user   to   see   the   output  
              printf("Press   any   key   to   continue...");  
              getch();  
   
                ::CoUninitialize();  
        }  
  }  
   
   
  ///////////////////////////////////////////////////////////  
  //                                                                                                               //  
  //             AddNewX   Function                                                                   //  
  //                                                                                                               //  
  ///////////////////////////////////////////////////////////  
  VOID     AddNewX(VOID)  
  {  
   
        //   Define   ADO   object   pointers.  
          //   Initialize   pointers   on   define.  
        _RecordsetPtr   pRstEmployees   =   NULL;  
        _ConnectionPtr   pConnection     =   NULL;  
   
        //Define   Other   variables  
        IADORecordBinding       *picRs   =   NULL;     //Interface   Pointer   declared.(VC++   Extensions)        
        CEmployeeRs   emprs;         //C++   class   object        
   
        HRESULT   hr   =   S_OK;  
   
                                                        //Replace   Data   Source   value   with   your   server   name.  
        _bstr_t   strCnn("Provider=sqloledb;Data   Source=MyServer;Initial   Catalog=pubs;User   Id=sa;Password=;");  
        _bstr_t   strId;  
          _bstr_t   strMessage;  
         
        try  
        {  
              //Open   a   connection  
              TESTHR(pConnection.CreateInstance(__uuidof(Connection)));  
              pConnection->Open(strCnn,"","",adConnectUnspecified);  
               
   
              //Open   employee   table    
              TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));  
   
              //You   have   to   explicitly   pass   the   Cursor   type   and   LockType   to   the   Recordset   here  
              pRstEmployees->Open("employee",_variant_t((IDispatch   *)   pConnection,   true),adOpenKeyset,adLockOptimistic,adCmdTable);  
               
   
              //Open   an   IADORecordBinding   interface   pointer   which   we'll   use   for   Binding   Recordset   to   a   class          
              TESTHR(pRstEmployees->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));  
   
   
                //Bind   the   Recordset   to   a   C++   Class   here        
              TESTHR(picRs->BindToRecordset(&emprs));                
   
              //   Get   data   from   the   user.The   employee   id   must   be   formatted   as  
              //   first,middle   and   last   initial,five   numbers,then   M   or   F   to  
              //   signify   the   gender.For   example,the   employee   id   for    
              //   Bill   A.   Sorensen   would   be   "BAS55555M".    
                       
              printf("Enter   Employee   Id:   ");scanf("%s",emprs.m_sz_empid);  
              strId   =   emprs.m_sz_empid;  
              printf("Enter   First   Name:   ");scanf("%s",emprs.m_sz_fname);  
              printf("Enter   Last   Name:");scanf("%s",emprs.m_sz_lname);  
   
              //Proceed   if   the   user   actually   entered   some   thing      
              //for   the   id,   the   first   and   the   last   name.    
                 
              if(strcmp(emprs.m_sz_empid,"")     &&   strcmp(emprs.m_sz_fname,"")   &&   strcmp(emprs.m_sz_lname,""))  
              {  
                    //This   adds   a   new   record   to   the   table        
                            //if   (FAILED(hr   =   picRs->AddNew(&emprs)))  
                          //_com_issue_error(hr);  
                          TESTHR(picRs->AddNew(&emprs));  
               
                          //Show   the   newly   added   data  
                            printf("New   Record:   %s     %s     %s   \n",\  
                                emprs.lemp_empidStatus   ==   adFldOK   ?   emprs.m_sz_empid   :   "<NULL>",\  
                                emprs.lemp_fnameStatus   ==   adFldOK   ?   emprs.m_sz_fname   :   "<NULL>",\  
                                emprs.lemp_lnameStatus   ==   adFldOK   ?   emprs.m_sz_lname   :   "<NULL>");  
              }  
              else  
                    printf("Please   enter   an   employee   id,   first   name   and   last   name.\n");        
                 
                     
               
              //Delete   the   new   record   because   this   is   a   demonstration.    
              pConnection->Execute("DELETE   FROM   EMPLOYEE   WHERE   emp_id   =   '"+strId+"'",NULL,adCmdText);  
   
               
              //Release   the   IADORecordset   Interface   here        
              if   (picRs)  
              picRs->Release();  
   
              //   Clean   up   objects   before   exit.  
              pRstEmployees->Close();  
              pConnection->Close();    
   
        }  
   
   
        catch(_com_error   &e)  
        {  
              //   Notify   the   user   of   errors   if   any.  
              _variant_t   vtConnect   =   pRstEmployees->GetActiveConnection();  
   
              //   GetActiveConnection   returns   connect   string   if   connection  
              //   is   not   open,   else   returns   Connection   object.  
              switch(vtConnect.vt)  
              {  
              case   VT_BSTR:  
                          printf("Error:\n");  
                          printf("Code   =   %08lx\n",   e.Error());  
                          printf("Message   =   %s\n",   e.ErrorMessage());  
                          printf("Source   =   %s\n",   (LPCSTR)   e.Source());  
                          printf("Description   =   %s\n",   (LPCSTR)   e.Description());  
                          break;  
              case   VT_DISPATCH:  
                          PrintProviderError(vtConnect);  
                          break;  
              default:  
                          printf("Errors   occured.");  
                          break;  
              }  
   
        }  
   
   
  }  
   
   
  ///////////////////////////////////////////////////////////  
  //                                                                                                               //  
  //             PrintProviderError   Function                                             //  
  //                                                                                                               //  
  ///////////////////////////////////////////////////////////  
   
  VOID   PrintProviderError(_ConnectionPtr   pConnection)  
  {  
        //   Print   Provider   Errors   from   Connection   object.  
        //   pErr   is   a   record   object   in   the   Connection's   Error   collection.  
        ErrorPtr     pErr   =   NULL;  
        long             nCount   =   0;          
        long             i   =   0;  
   
        if(   (pConnection->Errors->Count)   >   0)  
        {  
              nCount   =   pConnection->Errors->Count;  
              //   Collection   ranges   from   0   to   nCount   -1.  
              for(i   =   0;   i   <   nCount;   i++)  
              {  
                    pErr   =   pConnection->Errors->GetItem(i);  
                    printf("\n\t   Error   number:   %x\t%s",   pErr->Number,   (LPCSTR)pErr->Description);  
              }  
        }  
  }  
  //   EndAddNewCpp  
   
  AddNewX.h:  
   
  //   BeginAddNewH  
  #include   "icrsint.h"  
   
   
  //This   Class   extracts   empid,   fname   and   lastname      
   
  class   CEmployeeRs   :   public   CADORecordBinding  
  {  
  BEGIN_ADO_BINDING(CEmployeeRs)  
           
        //Column   empid   is   the   1st   field   in   the   recordset        
   
        ADO_VARIABLE_LENGTH_ENTRY2(1,   adVarChar,   m_sz_empid,    
                    sizeof(m_sz_empid),   lemp_empidStatus,   TRUE)  
   
        ADO_VARIABLE_LENGTH_ENTRY2(2,   adVarChar,   m_sz_fname,    
                    sizeof(m_sz_fname),   lemp_fnameStatus,   TRUE)  
   
        ADO_VARIABLE_LENGTH_ENTRY2(4,   adVarChar,   m_sz_lname,    
                    sizeof(m_sz_lname),   lemp_lnameStatus,   TRUE)  
         
  END_ADO_BINDING()  
   
  public:  
   
        CHAR     m_sz_empid[10];  
        ULONG   lemp_empidStatus;  
        CHAR       m_sz_fname[40];  
        ULONG     lemp_fnameStatus;  
        CHAR       m_sz_lname[41];  
        ULONG     lemp_lnameStatus;  
   
  };  
  //   EndAddNewH  
   
  Top

2 楼strip(阿飞 - Mozilla●CSDN●痛)回复于 2002-03-20 08:25:37 得分 0

Table中将一个字段设为Primary   Key,Unique,该字段为adVarWChar型,我的本意是不允许有重复值,但如果在运行中在Addnew中加入一个已存在的值,会出现什么情况  
   
  :  
  update的时候回抛出异常,你最好自己试一下就清楚怎么回事了Top

3 楼pfans(pfans)回复于 2002-03-20 08:37:53 得分 0

studyTop

相关问题

  • 关于recordset对象的addnew方法添加新数据的问题
  • ADO VC Extension中IADORecordBinding的AddNew在空表中添加星纪录的问题。
  • 工具栏的添加(VC)
  • 关于VC++添加控件的问题
  • 添加自己写的类进VC
  • 问个vc中添加类的问题
  • vc中如何添加winsock控件啊
  • Vc不能自动添加头文件
  • vc中如何对excel添加菜单?
  • ado添加记录addnew()的问题(有代码)

关键词

  • c++
  • vc++
  • 字段
  • ado
  • hr
  • emprs
  • lemp
  • sz
  • prstemployees
  • picrs

得分解答快速导航

  • 帖主:David982002
  • strip

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo