怎样把动态记录集Recordset中的记录存入本地数据库文件

软侠 2004-01-14 10:32:17
我建立了一个动态记录集对象recordset,然后打开记录,我现在如何才能把这个记录集中所有的记录或符合条件的记录保存到本地的一个数据库文件中呢?望各位大侠指点指点。注意:我只希望把这个动态记录集中的记录(不能通过操作运程数据库的方式)导出到本地的一个数据库文件中。
...全文
552 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
软侠 2004-02-03
  • 打赏
  • 举报
回复
各位好!
现在已经照楼上几位的方法测试了。新出现的问题如下:
Save方法只能存为ADTG格式和XML格式,ADTG格式的文件用什么程序打开,打开后会是一个表吗,图片能显示出来吗?XML文件能用Excel打开,但是打开后,发现图片字段中的图片无法显示,尽是一些十六进制的代码,另外那些字段名也无法显示出来,而是一些XML格式文本,还有在最后看到了一些本不该显示的不知什么样东西的文本(也是在表中)。想问如何使Excel能完全正确地打开并显示记录集本来的面目呢?同时想知道如何在程序中控制Excel能自动打开这个刚存好的文件。
软侠 2004-02-02
  • 打赏
  • 举报
回复
真的是十分感谢各位大侠能真心实意的在此指教小弟!!
各位兄弟的代码及方法我得去试试,今天刚上班,所以现在才来回复大家,还望莫怪!
chenyu5188 2004-01-22
  • 打赏
  • 举报
回复
范例
保存 Recordset:

Dim rs as New ADODB.Recordset
rs.Save "c:\yourFile.adtg", adPersistADTG
使用 Recordset.Open 打开持久文件:

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg", "Provider='MSPersist'",,,adCmdFile
此外,如果 Recordset 不包含活动的连接,那么您可以接受所有默认值并编写如下简单代码:

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg"
使用 Connection.Execute 打开持久文件:

Dim conn as New ADODB.Connection
Dim rs as ADODB.Recordset
conn.Open "Provider='MSPersist'"
Set rs = conn.execute("c:\yourFile.adtg")
使用 RDS.DataControl 打开持久文件:

在本范例中,未设置 Server 属性。

Dim dc as New RDS.DataControl
dc.Connection = "Provider='MSPersist'"
dc.SQL = "c:\yourFile.adtg"
dc.Refresh
chenyu5188 2004-01-22
  • 打赏
  • 举报
回复
Save 方法:
将 Recordset 保存在文件或 Stream 对象中。
语法
recordset.Save Destination, PersistFormat
参数
Destination
可选。Variant,表示保存 Recordset 的文件的完整路径名,或者表示对 Stream 对象的引用。
PersistFormat
可选。PersistFormatEnum 值,指定 Recordset 的保存格式(XML 或 ADTG)。默认值为 adPersistADTG。
说明
只能在打开的 Recordset 上调用 Save 方法。将来使用 Open 方法从 Destination 中恢复 Recordset。

如果 Filter 属性对 Recordset 有效,那么将只保存可在过滤器下访问的行。如果 Recordset 是分级的,那么当前的子 Recordset 及其子都将被保存,包括父 Recordset。如果调用子 Recordset 的 Save 方法,那么该子及其所有的子都将被保存,而父则不被保存。

第一次保存 Recordset 时,可以指定 Destination,也可以不指定。如果省略 Destination,将创建一个新文件,其名称被设置为 Recordset 的 Source 属性的值。

如果在第一次保存后接着调用 Save,请省略 Destination,否则将产生运行时错误。如果接着调用带有新的 Destination 的 Save,Recordset 将被保存到新的目标。但是,新的目标和原始目标都将是打开的。

Save 不关闭 Recordset 或 Destination,因此您可以继续使用 Recordset 并保存最近所做的更改。Destination 保持打开,直至 Recordset 关闭。

为安全起见,Save 方法只允许使用由 Microsoft Internet Explorer 执行的脚本中的低和自定义级别安全设置。有关安全问题的详细说明,请参阅 Microsoft Data Access Technical Articles 中的 ActiveX Data Objects (ADO) Technical Articles 下面的“ADO and RDS Security Issues in Microsoft Internet Explorer”。

如果在异步 Recordset 提取、执行或更新操作时调用 Save 方法,那么 Save 将一直等到该异步操作完成后才执行。

从 Recordset 的第一行开始保存记录。当完成 Save 方法时,当前行位置将移动到 Recordset 的第一行。

要得到最佳结果,请用 Save 将 CursorLocation 属性设置为 adUseClient。如果提供者不支持保存 Recordset 对象所必需的所有功能,Cursor Service 将提供该功能。

当持久保留 CursorLocation 属性被设置为 adUseServer 的 Recordset 时,Recordset 的更新能力将受到限制。通常只允许更新、插入和删除单个表(取决于提供者的功能)。Resync 方法在此配置下也不可用。

注意 ADO 不支持保存 Fields 设置为 adVariant、adIDispatch 或 adIUnknown 类型的 Recordset,此操作可能导致无法预测的后果。
只有条件字符串形式(例如,OrderDate > '12/31/1999')的 Filters 对持久保留 Recordset 的内容起作用。使用 Bookmarks 数组或使用 FilterGroupEnum 中的值创建的过滤器对持久保留 Recordset 的内容不起作用。这些规则适用于使用客户端或服务器端游标创建的 Recordsets。

由于 Destination 参数可以接受支持 OLE DB IStream 接口的所有对象,因此可以将 Recordset 直接保存到 ASP Response 对象。有关详细信息,请参阅 XML Recordset 持久性方案。

也可以按 XML 格式将 Recordset 保存为 MSXML DOM 对象的一个实例,如下面的 Visual Basic 代码所示:

Dim xDOM As New MSXML.DOMDocument
Dim rsXML As New ADODB.Recordset
Dim sSQL As String, sConn As String

sSQL = "SELECT customerid, companyname, contactname FROM customers"
sConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files" & _
"\Common Files\System\msadc\samples\NWind.mdb"
rsXML.Open sSQL, sConn
rsXML.Save xDOM, adPersistXML 'Save Recordset directly into a DOM tree.
...
注意 以 XML 格式保存分级 Recordsets(数据构形)时有两个限制条件。如果分级 Recordset 包含挂起的更新,则不能以 XML 格式保存;参数化的分级 Recordset 也不能以 XML 格式保存。
以 XML 格式保存的 Recordset 是使用 UTF-8 格式保存的。将这类文件加载到 ADO Stream 中时,Stream 对象将不会尝试从流中打开 Recordset,除非将流的 Charset 属性设置为 UTF-8 格式的适当的值。

示例:

华芸智森 2004-01-21
  • 打赏
  • 举报
回复
其实,把记录保存成记录集有几种方法,下面就楼上的我详细说明一下SAVE方法..
RST.Save Destination,PersistFormat
Destination参数是用来保存记录公证机关内容的文件的全路径和文件名,PersistFormat参数是两上固有常量中的一个:
adPersistADTG是缺省值,将记录公证机关以Microsoft所有的Advanced Data TableGram格式保存.
adPersistXML指定将记录集存成XML,如果以XML格式保存记录集,可以用IE5.0以上的WEB浏览器打开宏观世界.
ADTG文件比XML文件波恩 此,除非你需要用WEB打开它或要穿过网络的防火墙,否则一定要用ADTG格式.
如果保存记录集并且继续使用它更新记录,每当调用UPDATE方法时你的改变总是写到磁盘文件中,直至调用记录集的CLOSE方法.当引用SAVE方法时,当前的记录重置到记录集的第一条记录.
当然,某些数据库提从者可能不支持保存一个记录集所必要的功能.如果遇到此类问题,可以将CURSORLOCATION属生设成ADUSECLIENT,以创建一个客户端临时表.
如果要将保存的记录集重写入数据库,把记录集的ACTIVECONNECTION属性设成数据库的一个有效CONNECTION对象,你就可以象更新其它记录集一样更新记录集.
如:
RST.OPEN STRFILE,,ADOPENSTATIC,ADLOCKPESSIMISTIC
SET RST.ACTIVECONNECTION=CNN
注:CURSOR选项并不作为永久保存记录集的一部分,在重新打开一个永久保存的记录集时,一定要指定临时表类型及锁定类型.否则将获得一个缺省的单向只读记录集.
ucme 2004-01-21
  • 打赏
  • 举报
回复
哇,有那么麻烦吗?!
只需要一条语句就可以解决问题:
adodb.recordset.save Destination,PersistFormat
Destination:保存文件的路径和文件名;
PersistFormat:记录集文件格式,有两个选项,分别是:adPersistADTG是默认值,adPersistXML
我看没有人有比我更简单而有能解决问题的方法了吧!:)
软侠 2004-01-16
  • 打赏
  • 举报
回复
还望各位大侠再帮帮忙吧
软侠 2004-01-15
  • 打赏
  • 举报
回复
to zjcxc(邹建):
你的代码运行速度太慢了,导出六千条记录的记录集要整整花一分钟时间,同时我想要导出图片类型的记录,但是你这代码没有支持。不知道是否有更好的更快的方法呢?我现在做的是要把包括图片的公司库存产品通过查询符合条件的记录输出到Excel中。
northwolves 2004-01-14
  • 打赏
  • 举报
回复
sql:
insert into
参考: http://www.china-askpro.com/msg8/qa93.shtml
软侠 2004-01-14
  • 打赏
  • 举报
回复
谢谢各位我要先试试!!
zjcxc 2004-01-14
  • 打赏
  • 举报
回复
'调用示例

Sub test()
Dim iRe As ADODB.Recordset
Dim iConc As String

iConc = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=F:\My Documents\客户资料.mdb"

Set iRe = New ADODB.Recordset
iRe.Open "维护员", iConc, adOpenKeyset, adLockOptimistic
f_Export2Excel iRe, "c:\b.xls", , True
iRe.Close
End Sub
zjcxc 2004-01-14
  • 打赏
  • 举报
回复
'参考下面这个保存为excel的处理方法

'*************************************************************************
'**
'** VB将数据导出到EXCEL,没有安装EXCEL的一样也可以导出.
'**
'** 调用方式: s_Export2Excel(Ado.Recordset) 或 s_Export2Excel(Rds.RecordSet)
'** 支持 Rds 与 Ado 的记录导出
'**
'*************************************************************************


'得到所有数据类型,有些数据类型EXCEL不支持,已经替换掉
Public Function f_FieldType$(ByVal sType&)
Dim iRe$
Select Case sType
Case 2, 3, 20
iRe = "int"
Case 5
iRe = "float"
Case 6
iRe = "money"
Case 131
iRe = "numeric"
Case 4
iRe = "real"
Case 128
iRe = "binary"
Case 204
iRe = "varbinary"
Case 11
iRe = "bit"
Case 129, 130
iRe = "char"
Case 17, 72, 131, 200, 202, 204
iRe = "varchar"
Case 201, 203
iRe = "text"
Case 7, 135
iRe = "datetime"
Case 205
iRe = "image"
Case 128
iRe = "timestamp"
End Select
f_FieldType = iRe
End Function


'导出ADO记录集到EXCEL
Public Function f_Export2Excel(ByVal sRecordSet As ADODB.Recordset, ByVal sExcelFileName$ _
, Optional ByVal sTableName$, Optional ByVal sOverExist As Boolean = False) As Boolean

'On Error GoTo lbErr

Dim iConcStr, iSql$, iFdlist$, iDB As ADODB.Connection
Dim iI&, iFdType$, j, TmpField, FileName
Dim iRe As Boolean


'检查文件名
If Dir(sExcelFileName) <> "" Then
If sOverExist Then
Kill sExcelFileName
Else
iRe = False
GoTo lbexit
End If
End If

'生成创建表的SQL语句
With sRecordSet
For iI = 0 To .Fields.Count - 1
iFdType = f_FieldType(.Fields(iI).Type)
Select Case iFdType
Case "char", "varchar", "nchar", "nvarchar", "varbinary"
If .Fields(iI).DefinedSize > 255 Then
iSql = iSql & ",[" & .Fields(iI).Name & "] text"
Else
iSql = iSql & ",[" & .Fields(iI).Name & "] " & iFdType & _
"(" & .Fields(iI).DefinedSize & ")"
End If
Case "image"
Case Else
iSql = iSql & ",[" & .Fields(iI).Name & "] " & iFdType
End Select
Next

If sTableName = "" Then sTableName = .Source
iSql = "create table [" & sTableName & "](" & Mid(iSql, 2) & ")"
End With

'数据库连接字符串
iConcStr = "DRIVER={Microsoft Excel Driver (*.xls)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;" & _
"CREATE_DB=""" & sExcelFileName & """;DBQ=" & sExcelFileName

'创建Excel文件,并创建表
Set iDB = New ADODB.Connection
iDB.Open iConcStr
iDB.Execute iSql

'插入数据
With sRecordSet
.MoveFirst
While .EOF = False
iSql = ""
iFdlist = ""
For iI = 0 To .Fields.Count - 1
iFdType = f_FieldType(.Fields(iI).Type)
If iFdType <> "image" And IsNull(.Fields(iI).Value) = False Then
iFdlist = iFdlist & ",[" & .Fields(iI).Name & "]"
Select Case iFdType
Case "char", "varchar", "nchar", "nvarchar", "text"
iSql = iSql & ",'" & .Fields(iI).Value & "'"
Case "datetime"
iSql = iSql & ",#" & .Fields(iI).Value & "#"
Case "image"
Case Else
iSql = iSql & "," & .Fields(iI).Value
End Select
End If
Next
iSql = "insert into [" & sTableName & "](" & _
Mid(iFdlist, 2) & ") values(" & Mid(iSql, 2) & ")"
iDB.Execute iSql
.MoveNext
Wend
End With

'处理完毕,关闭数据库
iDB.Close
Set iDB = Nothing

MsgBox "已经将数据保存到 [ " & sExcelFileName & " ]", 64
iRe = True
GoTo lbexit

lbErr:
MsgBox "发生错误:" & Err.Description & vbCrLf & _
"错误代码:" & Err.Number, 64, "错误"
lbexit:
f_Export2Excel = iRe
End Function

zjcxc 2004-01-14
  • 打赏
  • 举报
回复
数据库的类型是什么?
j4sxw 2004-01-14
  • 打赏
  • 举报
回复
for i=1 to rs.recordcount
insert into table(a,b,c) values('rs!a','rs!b','rs!c')
next

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧