版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主要内容撒:的撒旦Ø MFC ODBC将ODBC API封装在类CDatabase、CRecordSet、CFieldExchange、CRecordView和CDBException中Ø 使用MFC ODBC开发数据库应用程序的一般步骤Ø 使用AppWizard访问数据库Ø 使用类CDatabase连接数据库Ø 使用类CRecordSet打开记录集、获取数据Ø 使用类CRecordSet的函数MoveFirst()、MoveLast()、MoveNext()、MovePrev()、IsBOF()和IsEOF()进行记录集的遍历
2、16; 使用类CRecordSet的函数AddNew和Update增加记录 Ø 使用类CRecordSet的函数Edit和Update修改记录 Ø 使用类CRecordSet的函数Delete删除记录Ø 使用类CDatabase的函数ExecuteSQL直接执行SQL命令 Ø 使用类CDatabase的函数BeginTrans、CommitTrans和Rollback处理事务目录MFC OBDC技术. 3概述. 3CDatabase类操作数据源. 3CFieldExchange类处理数据交换 . 6CRecordView类显示记录 . 6CDBExcep
3、tion类处理异常 . 7使用MFC ODBC编程建立应用程序. 7MFC ODBC编程模型概述 . 7通过AppWizard建立数据库应用程序. 8使用CDatabase类方法打开数据源 . 8使用CRecordste类打开记录集 . 10绑定记录集 . 12参数化记录集和查询 . 13遍历记录集合. 15书签定位和绝对定位 . 16获取记录集的数据. 18添加记录. 19删除记录. 21修改记录. 21直接执行SQL语句(增加、删除表等) . 22事务处理. 23使用多记录集. 25MFC OBDC技术概述MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口。MFC
4、的ODBC类主要包括以下5个类:² CDatabase类:主要功能是建立与数据源的连接² CRecordset类:代表从数据源选择的一组记录(记录集)² CRecordView类:提供了一个表单视图与某个记录集直接相连,利用对话框数据交替机制(DDX)在记录集与表单视图的控件之间传输数据 ² CFieldExchange类:支持记录字段数据交换(RFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换。² CDBException类:代表ODBC类产生的异常。CDatabase类操作数据源CDatabase类型的对象表示一个到数据源
5、的连接,通过它可以操作数据源。 该类的成员函数如下表:该类的属性属性如下表:应用程序可使用多个CDatabase类型的对象。构造一个对象并调用Open()成员函数打开一个连接。接着构造CRecordset类型的对象以操作连接的数据源,构造时向记录集对象传递CDatabase类型的指针。完成使用后,用Close()成员函数销毁CDatabase类型的对象。一般情况下并不需要直接使用CDatabase类型的对象,因为CRecordset类型的对象可以实现大多数的功能、但是在进行事务处理时,CDatabase就起到关键作用。事务(Transaction)指的是将一系列对数据源的更新放在一起,同时提交
6、或一个都不提交,为的是确保多用户对数据源同时操作时的数据正确性。CRecordset类操作记录集一个CRecordset类型的对象代表从数据源选择的一组记录的集合记录集,通过该类的方法实现对数据库中记录的各种操作。该类常用的数据成员如下表:该类的构造方法如下表:CRecordset类记录集属性如下表:记录集有两种形式:snapshot(表示数据的静态视图)和dynaset(表示记录集与其他用户对数据库的更新保持同步)。CFieldExchange类处理数据交换CFieldExchange类支持数据库类所使用的记录集字段交换(RFX)程式。如果使用自定义的数据类型写数据交换程式,会使用这个类。否
7、则不会直接使用此类。RFX在记录集对象的字段数据成员与数据源中当前记录的相应字段之间交换数据。CRecordView类显示记录CRecordView对象用于在控件中显示数据库记录的视图。这种视图是一种直接连到一个CRecordView对象的格式视图,它从一个对话框模板创建资源,并将CRecordView对象的字段显示在对话框模版的控件里。对象利用DDX和RFX机制,使窗体上的空间和记录集的字段值之间数据移动自动化,也就是说,用户不需要编写一行代码就可以完成简单的数据库记录查看程序。CDBException类处理异常由CException类派生,以3个继承的成员变量反映对数据库操作时的异常: &
8、#178; m_nRetCode:以ODBC返回代码(SQL_RETURN)的形式表明造成一场的原因² m_strError:字符串,描述造成抛出异常的错误原因² m_strStateNativeOrigin:字符串,用以描述以ODBC错误代码表示的异常错误使用MFC ODBC编程建立应用程序MFC ODBC编程模型概述使用MFC ODBC访问数据库比直接使用ODBC API简单得多,编程步骤如下: ² 使用CDatabase打开数据源的连接,如果利用AppWizard生成一个ODBC数据库应用程序,则会自动完成操作。² 使用ClassWizard向导加
9、入由CRecordset类派生的用户记录集类,完成对数据库的绑定。² 创建记录集类对象,如果利用AppWizard生成一个ODBC数据库应用程序,则会自动在文档类中创建。² 使用记录及对象对数据库进行遍历、增加、删除、修改等操作。² 使用CDatabase类的ExecuteSQL函数直接执行SQL命令。² 使用CDatabase类的BeginTrans、CommitTrans和Rollback函数进行事务处理² 使用CDatabase类的Close函数关闭数据源连接。通过AppWizard建立数据库应用程序“New”->”MFC AppW
10、izard(EXE)”->”OK”->”Single document(单文档)”->NEXT ->”选择需要对什么样的数据库类型支持做出选择:None(不要任何数据支持,今后再添加很麻烦)、Header files only(该工程需要数据库支持,但不清楚细节时选择。工程会添加所要求的头文件和链接库,但必须自己在创建数据库类)、Database view without file support(表示包含数据库头文件和链接库,并创建记录集和记录视图,应用程序虽有文档支持,但不支持串行化)表示包含数据库头文件、记录集和视图外,程序还支持串行化) ->”Data O
11、ptions 对话框:在”Datasource”中选择ODBC单选按钮,选择一个已经注册号的数据源(实例程序Sample中使用的数据源叫students)。在”Recordset type”(记录类型)中有三个选项:Snapshot(快照:它是当前表的一个静态视图。表打开之后,表中的所有数据马上被载入到应用程序中。其他用户或程序对表的修改只有在下次打开表时才会体现出来,看不到其他用户对表的”即时”修改,因此它是静态的。Snapshot适用于用户查询信息(例如生成报表等)而不适用于数据编辑。)、动态集:这个选项创建指向所请球的每个记录的实际指针。只有屏幕需要显示记录时,才从数据库中提取数据。这种
12、方式的好处是动态、即时的浏览到当前的记录。而其他用户也会即时看到你对记录所做出的修改。该选项适合于创建用户要发费很多时间来编辑数据的应用程序,并且,如果正在编写大型数据库应用程序,他也是最佳选择)、Table(表:表方法(仅使用DAO访问数据库时可用)把所做查询的内容放进一个临时表。这样做不但减小了从服务器下载的信息量,还意味着程序员有了更大的灵活性,因为可以直接操作临时表字段和记录。但缺点是你看不到别人的修改。使用DAO且用户会执行同等数量的数据查询和数据编辑时,它是最佳选择。)” ->”Selete Database Table(选择数据库表)” ->”Finish”.通过Ap
13、pWizard创建了一个MFC ODBC数据库工程后,该工程与一般的应用程序工程有所不同:多了一个CRecordset的派生类,对应前面选择的数据库表;视图类的基类是CRecordView,负责显示数据;工具栏上多了遍历记录集的4个按钮。使用CDatabase类方法打开数据源通过CDatabase类的Open函数来打开数据源,该函数原型如下:virtual BOOL Open(LPCTSTR lpszDSN, /一个数据源名,此数据源名是通过ODBC管理器注册的。如果DSN被设定在lpszConnect里,那么lpszDSN不应在被重新设定,lpszDSN应设为NULL。如果没有设定lpszC
14、onnect,而且又把lpszDSN设定为NULL,那么将出现一个对话框,让用户选择数据源。BOOL bExclusive = FALSE, /默认为FALSE,表示以共享方式打开数据源。当前版本的类库不支持独占方式,如果设定为TRUE,将失败BOOL bReadOnly = FALSE, /如果希望连接以只读方式打开,不想对数据源进行更新,那么设定为TRUE,所有依靠此连接打开的记录集全部继承此属性。默认值为FALSELPCTSTR lpszConnect = _T(“ODBC;”), /连接串。连接串可能包含数据源名、数据源中用户的ID、密码和其他信息。整个连接串必须以”ODBC;”开头。
15、”ODBC;”表示连接是一个ODBC数据源。BOOL bUseCursorLib = TRUE /如果希望加载ODBC光标动态连接库,设定为TRUE);下面的例子表示如何打开数据源:/在文档类中加入/CDatabase类对象CDatabase m_pdatabase;/连接对象到一个数据源(没有密码),ODBC连接对话框将是中隐藏 m_pdatabase.Open(_T(“students”), FALSE, FALSE, _T(“ODBC; UID = Admin”); /或者也可以显示ODBC对话框,请用户提供连接信息m_pdatabase.Open(NULL);像程序Sample一样,通
16、过向导生成数据库工程,不用添加代码就能实现对数据源的打开。在CRecordset类中有一个名为GetDefaultConnect()的虚函数值得注意,通过调用它可以返回默认的数据源连接(也就是在生成工程的时候所选择的数据源)来打开数据源。该函数如下:CString CSampleSet:GetDefaultConnect() return _T(“ODBC; DSN = students”);使用CRecordste类打开记录集通过声明CRecordset记录集类的对象,再利用记录集类的Open()函数可打开记录集,从而获取数据库中表的数据。也正是在调用Open()函数后,记录集当中的成员变量
17、得到数据源中表的字段值。Open()函数的形式如下:virtual BOOL Open();其中nOpenType为打开的类型,可取只有一下4种:² CRecordset:dynaset:双向滚动的记录集,在记录集打开时,记录的顺序和成员就被确定了。其他用户对数据的修改在fetch操作之后才可访问,这也被叫做键集驱动的记录集。² CRecordset:dynamic:双向滚动的记录集,其他用户对数据的修改在fetch操作后才可访问。许多ODBC驱动程序都不支持此种记录集。² CRecordset:ForwardOnly:只读记录集,只向前滚动。第二个参数lpszS
18、QL是一个CString的指针,指向以下内容之一:² 一个NULL指针;² 一个表名;² 一个SQL查询语句 UNIT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none第三个参数dwOptions为一系列选项的组合,它的默认值为None。可以像下面这样调用Open()函数来打开记录集:CDatabase m_pdatabase;m_pdatabase.Open(_T(“students”), FALSE, FALSE, _T(“ODBC; UID=
19、Admin”); CRecordset Sample(&m_pdatabase);Sample.Open(CRecordset:dynaset, _T(“Select name from students”);以上语句先用CDatabase对象打开一个数据源,之后构造记录及对象,最后记录及对象Sample以动态方式打开students表中的name字段。下面的语句表示以全部默认方式执行记录记得打开操作:CDatabase m_pdatabase;m_pdatabase.Open(_T(“students”), FALSE, FALSE, _T(“ODBC; UID=Admin”); C
20、Recordset Sample(&m_pdatabase);Sample.Open();也可以像下面代码中那样打开一个表中的所有字段:CDatabase m_pdatabase;m_pdatabase.Open(_T(“students”), FALSE, FALSE, _T(“ODBC; UID=Admin”); CRecordset Sample(&m_pdatabase);Sample.Open(CRecordset:dynaset, _T(“Select * from students”);经过上面的操作,记录集对象的字段变量就获得了数据库中特定表中指定字段的数据。像
21、程序Sample一样,在向导当中选择数据源和表名。在CRecordset类中有一个名为GetDefaultSQL()的虚函数值得注意,通过调用它可以返回默认的SQL语句,用于形成记录集对象。该函数如下:CString CSampleSet:GetDefaultSQL() return _T(“*students+”);绑定记录集通过向导创建工程后,程序的框架就生成出来。如果打开CRecordset的派生类CSampleSet,会发现里面已经有了5个变量:/Field/Param Data/AFX_FIELD(CSampleSet, CRecordset)long m_id;CString m_
22、name;Long m_department;Long m_age;CString m_comment;/AFX_FIELD这5个变量正好与要访问的表中的字段同名,并且变量的类型也与字段类型一致。这是MFC自动添加的变量,已绑定表中的字段。如果表中的字段是中文的,那么MFC会创建m_column1、m_column2等与之对应。RFX实现了这种绑定。RFX(Record Field Exchange),记录字段交换使记录集(CREcordset)和隐藏于后台的数据源(Datasource)之间建立其对应的关系。用户只需要操作记录集,就可以实现对数据源的操作。MFC中提供了一组RFX调用函数,利
23、用这些函数,就可以使记录集中的变量与数据源中的字段对应起来。使记录集和数据之间进行数据交换成为可能,并且,这种交换是双向的。可以在CSampleSet类的DoFieldExchange函数中看到一组组的RFX函数调用,正是通过调用它们,使CSampleSet记录集中的变量与students表中的字段对应起来。void CSampleSet: DoFieldExchange(CFieldExchange *pFx)/AFX_FIELD_MAP(CSampleSet)pFX->SetFieldType(CFieldExchange:outputColumn);RFX_Long(pFX, _T
24、(“*id+”), m_id); RFX_Long(pFX, _T(“*name+”), m_name);RFX_Long(pFX, _T(“*department+”), m_department); RFX_Long(pFX, _T(“*age+”), m_age);RFX_Long(pFX, _T(“*comment+”), m_comment); /AFX_FIELD_MAPRFX函数通常有3个参数(个别的会有4或5个)。第一个参数为一个指向CFieldExchange类对象的指针,第二个参数为数据源中的一个字段名称,第三个参数是与字段相对应的记录集中的变量名。常用的RFX函数如下表:
25、参数化记录集和查询CRecordset类对象中有两个成员变量,一个为m_strFilter(过滤字符串,负责对记录集进行过滤,返回过滤后的记录),另一个为m_strSort(排序字符串,对记录集进行排序)。m_strFilter存放着SQL语句中WHERE子句的条件字符串,m_strSort中则存放着SQL语句中ORDER BY子句的字符串。经过对它们的赋值,可以更加灵活的获得数据库中特定的数据,以及对记录进行排序。下面的代码中向m_strFilter赋值“comment=good”,向m_strSort赋值“name”:CRecordset Sample;Sample.m_strFilter
26、 = “comment = good”;Sample.m_strSort = “name”;除了直接向m_strFilter赋值外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:首先声明参变量:CString age1;CString comment1;在构造函数中初始化参变量age1 = _T(“”);comment = _T(“”);将参变量与对应列绑定pFX->SetFieldType(CFieldExchange:param);pFX->Text(pFX, _T(“*age+”), age1);pFX->Text(pFX, _
27、T(“*comment+”), comment1);最后利用参变量进行条件查询m_pSet->m_strFilter = “age= ? AND comment = ?”;m_pSet->age = “21”;m_pSet->comment = “good”;m_pSet->Requery();参变量的值按绑定的顺序替换查询字符串中的“?”适配符。代码中的m_pSet是CRecordView类的一个记录集指针,指向当前文档类中的记录集变量。它是在CRecordView类的OnInitialUpdate中被赋予文档类下记录集对象的指针的。下面是程序中CSampleView
28、类的OnInitialUpdate函数体:void CSampleView:OnInitialUpdate() /为m_pSet赋予文档类下的记录集对象的指针 m_pSet = &GetDocument()->m_sampleSet; CRecordView:OnInitialUpdate(); ResizeParentToFit();遍历记录集合CRecordset类中有一组函数负责记录集指针的移动,例如使用记录集指针下移一个记录、使用记录集指针上移一个记录等。1、2、3、4、5、 MoveFirst()函数:使指针移动到第一条记录 MoveLast()函数:使指针移动到最后一
29、条记录 MoveNext()函数:使指针移动到下一条记录 MovePrev()函数:使指针移动到前一条记录 IsBOF()函数:当指针移动到第一条记录前面或者表中没有记录的时候返回真6、 IsEOF()函数:当指针移动到最后一条记录后面的时候返回真知道上面的这些函数的意义后,下面来看如何遍历记录集。下面的代码中m_pSet是一个记录集指针,m_list为一个列表框控件(ClistBox类)的变量:if(!m_pSet->IsOpen()m_pSet->Open(); /用IsOpen函数检测记录集是否打开m_pSet->MoveFirst();while(!m_pSet-&g
30、t;IsEOF()m_list.AddString(m_pSet->m_name); m_pSet->MoveNext();m_pSet->MoveFirst(); /遍历完成后,使记录集指针指向第一条记录 书签定位和绝对定位当在记录集中浏览的时候,可能想返回记录集中特定的一条记录,CRecordset提供了两种方法可以指定记录集到特定的位置。1、 书签定位可以在记录集中的某一条记录增加一个书签。在记录集浏览时由于用户的增删操作使记录的绝对位置发生改变,所以以来绝对位置是不可靠的。因此需要使用书签定位来为所想要的记录定位。CRecordset类中提供的书签定位的方法是GetB
31、ookmark和SetBookmark两个函数,他们的原型如下:void GetBookmark(CDBVariant& varBookmark); /参数为CDBVariant的对象 void SetBookmark(const CDBVariant& varBookmark);这里只需直接使用CDBVariant的对象即可。/创建CDBVariant对象CDBVariant bookmark;/rs是CRecordset类或CRecordset类派生类的对象rs.GetBookmark(bookmark);/一系列移动到其他记录的代码rs.MoveNext();rs.Mov
32、eNext();rs.SetBookmark(bookmark);GetBookmark函数将当前的记录存入一个CDBVariant的对象中,经过一系列的纪录移动之后,在调用SetBookmark,并且用刚才记录“书签”的CDBVariant对象bookmark作参数来使用当前记录集重新指向“书签”的位置。是否支持书签定位取决于ODBC驱动程序和记录集类型。可以通过调用CRecordset:CanBookmark来确定是否支持书签定位。如果想支持书签定位,还需要在记录集的Open函数的dwOptions参数位置中加入CRecordset:useBookmarks参数。注意forward-onl
33、y recordsets(只向前)类型的记录集也不支持书签定位。还有一点,就是在某些记录集操作之后,也应该及时检查前面所设置的“书签”是否还可以继续使用。例如,对一个记录及进行了Requery操作之后,书签就可能不再有效了。所以,在调用SetBookmark函数之前,应该先调用CDatabase:GetBookmarkPersistence函数来核对是否可以安全的调用SetBookmark函数。下面是该函数原型:DWORD GetBookmarkPersistence() const;这个函数的返回值为bitmask,这是一个DWORD类型的返回值。该值可以是下表中的多个bitmask值的组合
34、。2、 绝对定位 相对于书签定位,绝对定位就好像记住某本书的某一个固定页码一样。绝对定位就是通过原始的记录位置来设置当前记录,比如可以设置记录集中第8条记录为当前记录。如想使用绝对定位来改变当前的记录集位置,可以调用CRecordset:SetAbsolutePosition函数。其原型为:void SetAbsolutePosition(long nRows);nRows表示记录集中的一个绝对位置。调用该函数会把记录集指针定位到nRows参数所指行号的记录上。下面的代码表示把记录集定位到第12条记录的位置上:long row;row = 12;rs.SetAbsolutePositon(ro
35、w);对于ODBC的记录集来说,绝对位置1指的是记录集当中的第一条记录,绝对位置如果是0则代表的是BOF位置(在第一条记录之前)。(*forward-only recordsets(只向前)类型的记录集不支持SetAbsolutePosition方法。此外,记录的绝对位置存在潜在的不可靠性。如果用户删除了某一条记录,那么后续记录的位置都发上变化,并且记录集也可能被再次重新创建,不能确保某条记录在创建的记录集中有与原来相同位置,因此建议使用书签定位。 *)获取记录集的数据通过在对话框上添加控件,并且为控件绑定变量来达到数据交换并显示的目的,与控件绑定的变量正是记录集中的那些字段变量。步骤如下:l
36、 按照所需显示的字段数量,在对话框窗体上添加几个编辑框控件,将控件的ID改成与表中字段相似的名称l 再按住Ctrl的同时双击每一个控件,为它们增加成员变量l 在Add Member Variable对话框中单击“Member variable name”下拉框,为每个控件一次选择记录集中的各个变量。到底记录集中的变量是如何把数据显示在控件上呢?下面讲述DDX技术。 DDX是Dialog Data Exchange的缩写,即对话框数据交换。它在对话框的控件与记录集的变量之间建立起一座桥梁,可以使他们双向交换数据。CRecordView类里面有一个DoDataExchange函数,所有的DDX函数
37、都是在DoDataExchange中调用的。DoDataExchange函数为DDX函数提供了一个CDataExchange类对象的指针。在工程刚刚创建时,CSampleView:DodataExchange函数是一个空函数,因此此时对话框上并没有控件,更没有与控件对应的变量。但经过窗体添加控件、为控件添加变量之后,再打开DoDataExchange函数,将会出现下面这样的代码:void CSampleView:DoDataExchange(CDataExchange* pDX)CRecordView:DoDataExchange(pDX); /AFX_DATA_MAP(CSampleView
38、)DDX_FieldText(pDX, IDC_ID, m_pSet->m_id, m_pSet); DDX_FieldText(pDX, IDC_NAME, m_pSet->m_name, m_pSet); DDX_FieldText(pDX, IDC_DEPARTMENT, m_pSet->m_department, m_pSet); DDX_FieldText(pDX, IDC_AGE, m_pSet->m_age, m_pSet); DDX_FieldText(pDX, IDC_COMMENT, m_pSet->m_comment, m_pSet);/AF
39、X_DATA_MAPDDX_FieldText函数负责在对话框控件和记录集中字段变量之间建立联系。因为记录集中的字段变量对应的是数据库中表的每个字段,所以就能在控件上看到表中的数据了。DDX函数有四个参数,分别为:l 一个指向CDateExchange类对象的指针l 对话框上控件的ID值l 记录集中要与对象绑定的字段变量l 记录集对象的指针DDX可以管理以下类型数据变量与控件的数据交换。它们是short、long、int、DWORD、CString、float、double、BOOL以及BYTE。程序通过UpdateData这个函数在控件与变量之间达到双向数据,而不是直接调用DoDataExc
40、hange。UpdateData函数的原型如下:BOOL UpdateData(BOOL bSaveAndValidate = TRUE);bSaveAndValidate指示了数据传输的方向,当为TRUE时就是控件向变量传输。反之,就是变量向控件传输数据。默认值为TRUE添加记录对记录的操作大多数都是由CRecordset类来负责的,执行添加的任务也不例外。CRecordset类中的函数AddNew()表示向表中添加一条新的纪录,该函数原型如下:virtual void AddNew();执行AddNew()函数之后会新增加一条空记录,等待输入数据。此时记录的每一个字段都被初始化NULL。在
41、输入新的记录数据之后,需调用另一个CRecordset类的函数才能完成对新记录的添加,这个函数是Update(),函数原型为:virtual BOOL Update();在调用完AddNew函数、输入新数据之后一定要调用Update,它负责把新添加的数据保存到数据源。实际上AddNew函数只是在内存中创建了一块缓冲区,等待输入数据,之后需要使用Update来真正把数据存入数据源。如果在调用Update之前滚动到了另一条记录,那么新记录就会丢失,也不会提出警告。对于dynaset(动态集)类型的记录集,新记录会添加到末尾。新记录不能被添加到Snapshot类型的记录集中。最后还需要调用CReco
42、rdset:Requery函数以刷新记录集:virtual BOOL Requery();Requery函数负责刷新记录集来反映当前最新的数据。在每次对记录进行添加、删除后,都有必要调用Requery来更新记录集。调用Requery函数后,记录集指针重新指向第一条记录。下面的代码实现了在一个名为OnAdd的函数中添加记录:void CSampleView:OnAdd()/添加一条新记录 m_pSet->AddNew(); /对记录集中的m_id、m_name、m_department、m_age等赋值 m_pSet->m_id = “1009”; m_pSet->m_name
43、 = “Jack”; m_pSet->m_department = “3”; m_pSet->m_age = “20”; m_pSet->m_comment = “good”; /更新记录集,将新记录存入数据源m_pSet->Update();/刷新记录集,并使记录集指针回到第一条记录m_pSet->Requery();删除记录调用CRecordset类中的Delete函数进行删除记录。该函数用于删除当前记录集指针指向的记录。原型如下:virtual void Delete();一次成功的删除后,被删除记录的字段全部被设为NULL,必须调用Move函数移动到其他记
44、录上来一处被删除的记录。如果删除不成功,记录中的数据也不会被破坏。一旦移除了删除的记录,就再也不能返回他了。在调用Delete函数时,记录集中必须有一条有效的记录,否则会产生错误。如果Delete了一条记录,但没有Move到另一条记录就有进行了Delete操作,Delete会产生一个CDBException类的错误。下面的代码在一个名为OnDelete的函数中实现了删除当前记录的操作: void CSampleView:OnDelete()/删除当前记录 m_pSet->Delete(); /刷新记录集 m_pSet->Requery();修改记录CRecordset:Edit函数
45、的作用是允许修改当前的记录。原型如下:virtual void Edit();调用Edit之后,就可以直接重新设定当前记录中每个字段的值了。再重新设定之后,还需要调用Update函数来保存对数据的修改。实际上,调用Edit之后,要被修改的值先被保存起来。如果Edit之后没有Update,而是移动到另一条记录,那么记录以前的值被重新恢复,不对记录作出修改。或者,调用了一次Edit,而对记录也作出了修改,然后又调用了一次Edit,那么记录还是被恢复到第一次调用Edit之前的值。下面的代码在名为OnEdit的函数中实现对数据的编辑:void CSampleView:OnEdit()m_pSet-&g
46、t;Edit(); m_pSet->m_id = m_newid; m_pSet->m_name = m_newname; m_pSet->m_department = m_newdepartment; m_pSet->m_age = m_newage; m_pSet->m_comment = m_newcomment;m_pSet->Update(); m_pSet->Requery();直接执行SQL语句(增加、删除表等)并不是所有的ODBC功能都被数据库类所支持,所以有时候需要使用直接执行SQL语句来对数据库进行一些操作。CDatabase类中有
47、一个函数ExecuteSQL,通过它可以直接执行SQL语句,对数据库进行操作。原型如下:void ExecuteSQL(LPCTSTR lpszSQL);参数lpszSQL是一个CString类型的指针,包含一条可执行的、有效地SQL命令。这个函数并不返回信息,如果要对记录进行操作,那么还是要使用记录集对象。下面的代码可以在一个名为class的表中增加一条记录。m_database是一个CDatabase类的对象。VALUES中是新增记录的具体值,分别于表中的每一个字段相对应。m_pSet->Open();m_pSet->AddNew();m_database.ExecuteSQL(“insert into class VALUES(006,Mary,19,FEMALE)”); m_pSet.Update();m_pSet->Edit();m_database.ExecuteSQL(“Delete from class WHERE Name = Mary”);m_pSet.Update();事务处理事务操作涉及CDatabase类的几个成员函数,BeginTrans表示开始事
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关注心理健康,营造阳光校园几年级主题班会课件
- 建筑公司施工材料采购招标流程指南
- 电商市场营销策划方案执行效果评估手册
- 农业科技园农技员农作物种植技术与产量绩效考评表
- 向欺凌说不打造文明校园小学主题班会课件
- 餐饮厨师团队创新绩效衡量表
- 向欺凌说‘不’营造和谐校园氛围小学主题班会课件
- 远离传染风险打造健康校园小学主题班会课件
- 时间管理和提升工作效率方案
- 关于售后服务流程的商洽(8篇)
- 广东春风银星新材料科技环境影响报告表
- DB31/T 8-2020托幼机构消毒卫生规范
- 宠物招聘面试题及答案
- 高职单招知识题库
- 内悬浮内拉线铁塔组立施工方案
- T-SZNB 005-2024 水果分级标准 库尔勒香梨
- 《高级有机合成技术-氧化反应》课件
- 南方全站仪NTS-332R说明书
- 2020年高考数学真题(共13套)后附解析
- 福建省农村部分计划生育家庭奖励扶助制度实施细则
- JX-系列脱氯剂交流课件
评论
0/150
提交评论