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
为可更新的 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
解决方案 »
- 留言框与按钮代码合并后通不过,不知何故?请指正
- *****急100分求教,请问怎么用CreateObject打开浏览器,并且打开指定网页**********
- 写了个小程序,显示器测试程序.不想做界面,就用了QQ的界面,不知道算不算侵权.
- 如何将查询到的记录集,输出到一个*.txt文本文件中?
- VB中如何调用VC写的DLL函数呀?向VB高手致意!!
- SQL语句的问题
- 一个摸名奇妙的问题 请各位大侠近来看看 (请斑竹帮忙 )
- 怎样将VB程序做为win2000&XP下的服务?????
- 新鲜出炉的寻求女友项目方案建议书
- 坚决抵制骗分行为,大家来看看
- 为什么我对记录加锁,确锁不住这条记录?
- 我该学些什么?
删除当前记录或记录组。语法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
保存对 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