AddNew 方法 (ADO)
         为可更新的 Recordset 对象创建新记录。语法recordset.AddNew FieldList, Values参数FieldList   可选。新记录中字段的单个、一组字段名称或序列位置。Values   可选。新记录中字段的单个或一组值。如果 Fields 是数组,那么 Values 也必须是有相同成员数的数组,否则将发生错误。字段名称的次序必须与每个数组中的字段值的次序相匹配。说明使用 AddNew 方法可创建和初始化新记录。通过 adAddNew 使用 Supports 方法可验证是否能够将记录添加到当前的 Recordset 对象。在调用 AddNew 方法后,新记录将成为当前记录并在调用 Update 方法后继续保持为当前记录。如果 Recordset 对象不支持书签,当移动到其他记录时将无法对新记录进行访问。是否需要调用 Requery 方法访问新记录则取决于所使用的游标类型。如果在编辑当前记录或添加新记录时调用 AddNew,ADO 将调用 Update 方法保存任何更改并创建新记录。AddNew 方法的行为取决于 Recordset 对象的更新模式以及是否传送 Fields 和 Values 参数。在立即更新模式(调用 Update 方法时提供者会将更改写入现行数据源)下,调用不带参数的 AddNew 方法可将 EditMode 属性设置为 adEditAdd。提供者将任何字段值的更改缓存在本地。调用 Update 方法可将新记录传递到数据库并将 EditMode 属性重置为 adEditNone。如果传送了 Fields 和 Values 参数,ADO 则立即将新记录传递到数据库(无须调用 Update),且 EditMode 属性值没有改变 (adEditNone)。在批更新模式(提供者缓存多个更改并只在调用 UpdateBatch 时将其写入现行数据源)下,调用不带参数的 AddNew 方法可将 EditMode 属性设置为 adEditAdd。提供者将任何字段值的更改缓存在本地。调用 Update 方法可将新的记录添加到当前记录集并将 EditMode 属性重置为 adEditNone,但在调用 UpdateBatch 方法之前提供者不将更改传递到现行数据库。如果传送 Fields 和 Values 参数,ADO 将把新记录发送给提供者以便缓存;需要调用 UpdateBatch 方法将新记录传递到现行数据库。AddNew 方法范例
该范例使用 AddNew 方法创建具有指定名称的新记录。Public Sub AddNewX()   Dim cnn1 As ADODB.Connection
   Dim rstEmployees As ADODB.Recordset
   Dim strCnn As String
   Dim strID As String
   Dim strFirstName As String
   Dim strLastName As String
   Dim booRecordAdded As Boolean' 打开连接。
   Set cnn1 = New ADODB.Connection
   strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=;"
   cnn1.Open strCnn
      
   ' 打开 Employee 表。
   Set rstEmployees = New ADODB.Recordset
   rstEmployees.CursorType = adOpenKeyset
   rstEmployees.LockType = adLockOptimistic
   rstEmployees.Open "employee", cnn1, , , adCmdTable   ' 从用户获取数据,雇员 ID 的格式应为:
   ' 名、中间名和姓的三个首字母,
   ' 五位数字,以及性别标识 M 或 F。
   ' 例如,Bill Sornsin 的雇员 ID 为:B-S55555M。
   strID = Trim(InputBox("Enter employee ID:"))
   strFirstName = Trim(InputBox("Enter first name:"))
   strLastName = Trim(InputBox("Enter last name:"))   ' 只在用户输入姓和名之后进行。
   If (strID <> "") And (strFirstName <> "") _
      And (strLastName <> "") Then      rstEmployees.AddNew
      rstEmployees!emp_id = strID
      rstEmployees!fname = strFirstName
      rstEmployees!lname = strLastName
      rstEmployees.Update
      booRecordAdded = True      ' 显示新添加的数据。
      MsgBox "New record: " & rstEmployees!emp_id & " " & _
         rstEmployees!fname & " " & rstEmployees!lname   Else
      MsgBox "Please enter an employee ID, " & _
         "first name, and last name."
   End If
      
   ' 删除新记录,因为这只是演示。
   cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"
      
   rstEmployees.Close
   cnn1.CloseEnd Sub

解决方案 »

  1.   

    Delete 方法 (ADO Recordset)
             删除当前记录或记录组。语法recordset.Delete AffectRecords参数AffectRecords   AffectEnum 值,确定 Delete 方法所影响的记录数目,该值可以是下列常量之一。常量 说明 
    adAffectCurrent 默认。仅删除当前记录。 
    adAffectGroup 删除满足当前 Filter 属性设置的记录。使用该选项须将 Filter 属性设置为有效的预定义常量之一。 
    说明使用 Delete 方法可标记 Recordset 对象中的当前记录或一组记录以便删除。如果 Recordset 对象不允许删除记录将引发错误。使用立即更新模式将在数据库中进行立即删除,否则记录将标记为从缓存删除,实际的删除将在调用 UpdateBatch 方法时进行。(使用 Filter 属性可查看已删除的记录)。从已删除的记录中检索字段值将引发错误。删除当前记录后,在移动到其他记录之前已删除的记录将保持为当前状态。一旦离开已删除记录,则无法再次访问它。如果在事务中嵌套删除,可用 RollbackTrans 方法恢复已删除的记录。如果处于批更新模式,则可用 CancelBatch 方法取消一个或一组挂起的删除。如果因与现行数据冲突而导致删除记录失败(如记录已被其他用户删除),则提供者向 Errors 集合返回警告但不终断程序执行,只有在所有提出请求的记录上发生冲突时才会产生运行时错误。
    Delete 方法范例
    该范例使用 Delete 方法从 Recordset 删除指定的记录。Public Sub DeleteX()   Dim rstRoySched As ADODB.Recordset
       Dim strCnn As String
       Dim strMsg As String
       Dim strTitleID As String
       Dim intLoRange As Integer
       Dim intHiRange As Integer
       Dim intRoyalty As Integer   ' 打开 RoySched 表。
          strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       Set rstRoySched = New ADODB.Recordset
       rstRoySched.CursorLocation = adUseClient
       rstRoySched.CursorType = adOpenStatic
       rstRoySched.LockType = adLockBatchOptimistic
       rstRoySched.Open "SELECT * FROM roysched " & _
          "WHERE royalty = 20", strCnn, , , adCmdText   ' 提示删除记录。
       strMsg = "Before delete there are " & _
          rstRoySched.RecordCount & _
          " titles with 20 percent royalty:" & vbCr & vbCr
       Do While Not rstRoySched.EOF
          strMsg = strMsg & rstRoySched!title_id & vbCr
          rstRoySched.MoveNext
       Loop
       strMsg = strMsg & vbCr & vbCr & _
          "Enter the ID of a record to delete:"
       strTitleID = UCase(InputBox(strMsg))   ' 移到记录并保存数据以使其可被恢复。
       rstRoySched.Filter = "title_id = '" & strTitleID & "'"
       intLoRange = rstRoySched!lorange
       intHiRange = rstRoySched!hirange
       intRoyalty = rstRoySched!royalty   ' 删除记录。
       rstRoySched.Delete
       rstRoySched.UpdateBatch   ' 显示结果。
       rstRoySched.Filter = adFilterNone
       rstRoySched.Requery
       strMsg = ""
       strMsg = "After delete there are " & _
          rstRoySched.RecordCount & _
          " titles with 20 percent royalty:" & vbCr & vbCr
       Do While Not rstRoySched.EOF
          strMsg = strMsg & rstRoySched!title_id & vbCr
          rstRoySched.MoveNext
       Loop
       MsgBox strMsg   ' 恢复数据,因为这只是演示。
       rstRoySched.AddNew
       rstRoySched!title_id = strTitleID
       rstRoySched!lorange = intLoRange
       rstRoySched!hirange = intHiRange
       rstRoySched!royalty = intRoyalty
       rstRoySched.UpdateBatch   rstRoySched.CloseEnd Sub
      

  2.   

    Update 方法 (ADO)
             保存对 Recordset 对象的当前记录所做的所有更改。语法recordset.Update Fields, Values参数Fields   可选。变体型,代表单个名称;或变体型数组,代表需要修改的字段(单个或多个)名称或序号位置。Values   可选。变体型,代表单个值;或变体型数组,代表新记录中字段(单个或多个)值。说明使用 Update 方法保存自从调用 AddNew 方法,或自从现有记录的任何字段值发生更改之后,对 Recordset 对象的当前记录所作的所有更改。Recordset 对象必须支持更新。要设置字段值,请进行下列某项操作: 给 Field 对象的 Value 属性赋值并调用 Update 方法。
    传送字段名和值作为 Update 调用的参数。
    将字段名数组和值数组传送给 Update 调用。 
    在使用字段和值数组时,两个数组中必须有相等数量的元素,同时字段名的次序必须与字段值的次序相匹配。字段和值的数量及次序不匹配将产生错误。如果 Recordset 对象支持批更新,那么可以在调用 UpdateBatch 方法之前将一个或多个记录的多个更改缓存在本地。如果在调用 UpdateBatch 方法时正在编辑当前记录或者添加新记录,那么 ADO 将自动调用 Update 方法,以便在批更改传送到提供者之前将所有挂起的更改保存到当前记录。如果在调用 Update 方法之前移动出正在添加或编辑的记录,那么 ADO 将自动调用 Update 以便保存更改。如果希望取消对当前记录所做的所有更改或者放弃新添加的记录,则必须调用 CancelUpdate 方法。调用 Update 方法后当前记录仍为当前状态。
    Update 和 CancelUpdate 方法范例
    该范例连同 CancelUpdate 方法说明 Update 方法。Public Sub UpdateX()   Dim rstEmployees As ADODB.Recordset
       Dim strOldFirst As String
       Dim strOldLast As String
       Dim strMessage As String   ' 使用雇员表中的姓名打开记录集。
          strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       Set rstEmployees = New ADODB.Recordset
       rstEmployees.CursorType = adOpenKeyset
       rstEmployees.LockType = adLockOptimistic
       rstEmployees.Open "SELECT fname, lname " & _
          "FROM Employee ORDER BY lname", strCnn, , , adCmdText   ' 储存原始数据。
       strOldFirst = rstEmployees!fname
       strOldLast = rstEmployees!lname
       ' 更改编辑缓冲区中的数据。
       rstEmployees!fname = "Linda"
       rstEmployees!lname = "Kobara"   ' 显示缓冲区的内容并获取用户输入。
       strMessage = "Edit in progress:" & vbCr & _
          "  Original data = " & strOldFirst & " " & _
          strOldLast & vbCr & "  Data in buffer = " & _
          rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
          "Use Update to replace the original data with " & _
          "the buffered data in the Recordset?"   If MsgBox(strMessage, vbYesNo) = vbYes Then
          rstEmployees.Update
       Else
          rstEmployees.CancelUpdate
       End If   ' 显示结果数据。
       MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
          rstEmployees!lname   ' 恢复原始数据,因为这只是演示。
       If Not (strOldFirst = rstEmployees!fname And _
             strOldLast = rstEmployees!lname) Then
          rstEmployees!fname = strOldFirst
          rstEmployees!lname = strOldLast
          rstEmployees.Update
       End If   rstEmployees.CloseEnd Sub该范例连同 AddNew 方法说明 Update 方法。Public Sub UpdateX2()   Dim cnn1 As ADODB.Connection
       Dim rstEmployees As ADODB.Recordset
       Dim strEmpID As String
       Dim strOldFirst As String
       Dim strOldLast As String
       Dim strMessage As String   ' 打开连接。
       Set cnn1 = New ADODB.Connection
          strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       cnn1.Open strCnn   ' 使用雇员表中的数据打开记录集。
       Set rstEmployees = New ADODB.Recordset
       rstEmployees.CursorType = adOpenKeyset
       rstEmployees.LockType = adLockOptimistic
       rstEmployees.Open "employee", cnn1, , , adCmdTable   rstEmployees.AddNew
       strEmpID = "B-S55555M"
       rstEmployees!emp_id = strEmpID
       rstEmployees!fname = "Bill"
       rstEmployees!lname = "Sornsin"   ' 显示缓冲区内容并获取用户输入。
       strMessage = "AddNew in progress:" & vbCr & _
          "Data in buffer = " & rstEmployees!emp_id & ", " & _
          rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
          "Use Update to save buffer to recordset?"   If MsgBox(strMessage, vbYesNoCancel) = vbYes Then
          rstEmployees.Update
          ' 转到新记录并显示结果数据。
          MsgBox "Data in recordset = " & rstEmployees!emp_id & ", " & _
              rstEmployees!fname & " " & rstEmployees!lname
       Else
          rstEmployees.CancelUpdate
          MsgBox "No new record added."
       End If   ' 删除新数据,因为这只是演示。
       cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strEmpID & "'"
       
       rstEmployees.CloseEnd Sub