Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6642731
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: WINDOWS

2006-11-12 09:37:16

如何使用 RDO 和 ADO 对象的 GetChunk 和 AppendChunk 方法
察看本文应用于的产品
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号 : 153238
最后修改 : 2004年7月13日
修订 : 1.0
概要
本文介绍如何使用 GetChunk 和 AppendChunk 方法的 RDO 和 ADO 列对象。 包含是有关如何实现此行为的工作示例代码。
GetChunk 和 AppendChunk 方法使用 LongVarChar 和 LongVarBinary 列类型, 称为 TEXT 和 IMAGE 列, MicrosoftSQLServer 中。 使用列 < 对象 > .Type 属性返回常量 rdLongVarChar 或 rdLongVarBinary, 或使用 < Column 对象 > .ChunkRequired 属性来确定是否需要用以访问列 AppendChunk Get/Setmethods@@ 确定 RDO, 中这些列类型。 每个这些列类型通常称为二进制大对象 (BLOB), 因此术语 BLOB 将用于本文其余部分。
下面是一些有关使用 RDO BLOB 建议:
• SQL 表中使用 BLOB 列将导致性能下降您服务器上并在应用程序代码, 可避免添加一个额外的复杂性层。 如果要存储文件如画笔 (.bmp)、 Microsoft Word .doc) 或只文本 (.txt) 文件, 则效率将这些文件存储在文件系统比表中。 要做到这通过 UNC 路径对文件存储在列的表, 然后让 VisualBasic 代码读取路径并适当处理文件。 
• 选择包含 BLOB 列, 结果集时应该将 BLOB 列在选择列表末尾。 如果您通常使用选择从表 " 语法, 应更改此处 " Select char1, text1, image1 从表以明确引用列并将 BLOB 列末尾 " * "。 
• 编辑使用 AppendChunk 方法, BLOB 列时您应您结果集中选择至少一个其他编辑非 BLOB 列并编辑非 BLOB 列以及 BLOB 列。 如果您不要编辑非 BLOB 列, RDO 将不引发错误但没有数据可能会保存回基表。 
• 无法绑由于 rdoParameter 对象上 AppendChunk 方法无效, BLOB 值定到参数标记。 如果要将 BLOB 作为输入参数传递到存储过程, 将需要利用 ODBC 柄从 RDO 来通过 ODBCAPI 调用处理此。 幸好, 能够这样做将实现所有未来版本的 RDO 以下版本 1.0 中 x。 
• 如果您尝试在 LongVarBinary 列, 中所存储图片控件显示位图请记住, VisualBasic 中图片控件没有通过 Visual Basic Applications (VBA) 代码位数流中采取的功能。 要将图片置于图片控件通过代码, 代码, 通过获取回掉的图片控件位或唯一方法是: 使用磁盘上文件。 还可使用 RDC 并将图片框绑定到 BLOB 列。 这适用于读取 (显示图片), 但更新是由于对 VisualBasic 绑定经理中问题稳定 Visual Basic 4.0 中。 要执行更新, 代码, RDC 而请使用。 
与 ODBC 游标库, 它并不能够从存储过程返回结果集上使用 GetChunk 或 AppendChunk 方法。 这是因为 BLOB 数据不是通过与其余部分 resultset 管道。 RDO 须回到, 列上使用 SQLGetData 或 SQLPutData ODBC AP 函数与 RDO GetChunk 或 AppendChunk 方法要求它时。 当存储过程创建结果集在结果集中, RDO 可以使用数据但它无法回到基表和列, 是所有它知道 SQL 语句是东西执行 SQLGetData / SQLP tData 是返回给应用, 喜欢 " { 调用 myproc(...) } ", 有是游标库来知道如何不足没有基表或列表示有索取 BLOB 数据没有办法。
与服务器端游标, 它也可以到达您 BLOB 数据。 服务器端游标知道内容的存储过程并可因此获取基表上。 是这限制是您无法创建服务器端游标基于它 (SQLServer 限制), 中具有除了一个单个选择语句任何存储过程因此是相当限制和 doubtful 您将能够作为主方法使用因此是相当限制和 doubtful 您将能够作为主方法使用此。
用户要更新其 BLOB 列事实要求他们暴露其基表并创建通过标准选择语句从该基表游标。 即使您已编码直接向 ODBC (没有一个 RDO 事情), 以及 dbLibary (专用 SQLServer API) 这是 true。 如果您使用 Jet, 不能更新游标因为它们总是成为只读根本基于存储过程。
 回到顶端
更多信息
以下示例分为三个单独过程, Command 1 _ Click、 ColumnToFile 和 FileToColumn。 ColumnToFile 和 FileToColumn 是两个独立的过程, 您应该能够将直接粘贴到代码如果您是将 BLOB 数据来回移动到磁盘上文件表中。 每个过程接受参数, 可由应用程序提供。 Command 1 _ Click 包含示例代码与数据库建立连接, 如果不存在, 调用 ColumnToFile 和 FileToColumn 过程带有正确参数创建 CHUNKTABLE 表。
1. VisualBasic 中启动新项目。 默认情况下创建 Form 1。 
2. 向 Form 1 添加一个 Command 按钮, Command。 
3. 以下代码粘贴到 Form 1 的 GeneralDeclarations 部分:
   Private Sub Command1_Click()
     MousePointer = vbHourglass
     Dim cn As rdoConnection
     Dim rs As rdoResultset, TempRs As rdoResultset
     Dim cnstr As String, sqlstr As String
     cnstr = "Driver={SQLServer};Server=myserver;Database=pubs;Uid=sa;Pwd="
     sqlstr = "Select int1, char1, text1, image1 from chunktable"
     rdoEnvironments(0).CursorDriver = rdUseServer
     Set cn = rdoEnvironments(0).OpenConnection( _
       "", rdDriverNoPrompt, False, cnstr)
     On Error Resume Next
     If cn.rdoTables("chunktable").Updatable Then
       'table exists
     End If
     If Err > 0 Then
       On Error GoTo 0
       Debug.Print "Creating new table..."
       cn.Execute "Create table chunktable(int1 int identity, " & _
                  "char1 char(30), text1 text, image1 image)"
       cn.Execute "create unique index int1index on chunktable(int1)"
     End If
     On Error GoTo 0
     Set rs = cn.OpenResultset(Name:=sqlstr, _
       Type:=rdOpenDynamic, _
       LockType:=rdConcurRowver)
     If rs.EOF Then
       rs.AddNew
       rs("char1") = Now
       rs.Update
       rs.Requery
     End If
     Dim currec As Integer
     currec = rs("int1")
     rs.Edit
     FileToColumn rs.rdoColumns("text1"), App.Path & "\README.TXT", 102400
     FileToColumn rs.rdoColumns("image1"), App.Path & "\SETUP.BMP", 102400
     rs("char1") = Now  'need to update at least one non-BLOB column
     rs.Update
     'this code gets the columnsize of each column
     Dim text1_len As Long, image1_len As Long
     If rs("text1").ColumnSize = -1 Then
       'the function Datalength is SQL Server specific
       'so you may have to change this for your database
       sqlstr = "Select Datalength(text1) As text1_len, " & _
                "Datalength(image1) As image1_len from chunktable " & _
                "Where int1=" & currec
       Set TempRs = cn.OpenResultset(Name:=sqlstr, _
         Type:=rdOpenStatic, _
         LockType:=rdConcurReadOnly)
       text1_len = TempRs("text1_len")
       image1_len = TempRs("image1_len")
       TempRs.Close
     Else
       text1_len = rs("text1").ColumnSize
       image1_len = rs("image1").ColumnSize
     End If
     ColumnToFile rs.rdoColumns("text1"), App.Path & "\text1.txt",  _
       102400, text1_len
     ColumnToFile rs.rdoColumns("image1"), App.Path & "\image1.bmp",  _
       102400, image1_len
     MousePointer = vbNormal
  End Sub
   Sub ColumnToFile(Col As rdoColumn, ByVal DiskFile As String, _
     BlockSize As Long, ColSize As Long)
     Dim NumBlocks As Integer
     Dim LeftOver As Long
     Dim byteData() As Byte   'Byte array for LongVarBinary
     Dim strData As String    'String for LongVarChar
     Dim DestFileNum As Integer, i As Integer
     ' Remove any existing destination file
     If Len(Dir$(DiskFile)) > 0 Then
       Kill DiskFile
     End If
     DestFileNum = FreeFile
     Open DiskFile For Binary As DestFileNum
     NumBlocks = ColSize \ BlockSize
     LeftOver = ColSize Mod BlockSize
     Select Case Col.Type
       Case rdTypeLONGVARBINARY
         byteData() = Col.GetChunk(LeftOver)
         Put DestFileNum, , byteData()
         For i = 1 To NumBlocks
           byteData() = Col.GetChunk(BlockSize)
           Put DestFileNum, , byteData()
         Next i
       Case rdTypeLONGVARCHAR
         For i = 1 To NumBlocks
           strData = String(BlockSize, 32)
           strData = Col.GetChunk(BlockSize)
           Put DestFileNum, , strData
         Next i
         strData = String(LeftOver, 32)
         strData = Col.GetChunk(LeftOver)
         Put DestFileNum, , strData
       Case Else
         MsgBox "Not a ChunkRequired column."
     End Select
     Close DestFileNum
   End Sub
   Sub FileToColumn(Col As rdoColumn, DiskFile As String, _
   BlockSize As Long)
     'moves a disk file to a ChunkRequired column in the table
     'A Byte array is used to avoid a UNICODE string
     Dim byteData() As Byte   'Byte array for LongVarBinary
     Dim strData As String    'String for LongVarChar
     Dim NumBlocks As Integer
     Dim filelength As Long
     Dim LeftOver As Long
     Dim SourceFile As Integer
     Dim i As Integer
     SourceFile = FreeFile
     Open DiskFile For Binary Access Read As SourceFile
     filelength = LOF(SourceFile) ' Get the length of the file
     If filelength = 0 Then
       Close SourceFile
       MsgBox DiskFile & " empty or not found."
     Else
       ' Calculate number of blocks to read and left over bytes
       NumBlocks = filelength \ BlockSize
       LeftOver = filelength Mod BlockSize
       Col.AppendChunk Null
       Select Case Col.Type
         Case rdTypeLONGVARCHAR
           ' Read the 'left over' amount of LONGVARCHAR data
           strData = String(LeftOver, " ")
           Get SourceFile, , strData
           Col.AppendChunk strData
           strData = String(BlockSize, " ")
           For i = 1 To NumBlocks
             Get SourceFile, , strData
             Col.AppendChunk strData
           Next i
           Close SourceFile
         Case rdTypeLONGVARBINARY
           ' Read the left over amount of LONGVARBINARY data
           ReDim byteData(0, LeftOver)
           Get SourceFile, , byteData()
           Col.AppendChunk byteData()
           ReDim byteData(0, BlockSize)
           For i = 1 To NumBlocks
             Get SourceFile, , byteData()
             Col.AppendChunk byteData()
           Next i
           Close SourceFile
         Case Else
           MsgBox "not a chunkrequired column."
       End Select
     End If
   End Sub
      
 
4. 需要更改才能连接到数据库服务器、 数据库、, UID 和 PWD 值 cnstr 变量中。 
5. Command 1 _ Click 事件中代码希望查找当前目录中名为 README.TXT 和 SETUP.BMP 两文件。 Windows 目录中通常找到这些文件。 可将这些文件移到当前目录或更改路径以匹配另一个位图和文本文件在硬盘上。 
6. 按 F 5 键以启动程序。 
7. 单击 Command 按钮来执行 RDO 代码。 代码将自动创建一个名为 chunktable, 如果它不尚未存在, 和文本和位图文件移动到和掉的 BLOB 列表。 
有关 ADO 对象, 请单击以下链接:
()
 回到顶端
参考
VisualBasic 和 SQLServer, MicrosoftPress hitchhiker 的指南。 55615 906 ISBN: 1 - - - 4。
有关其他信息, 请参见以下 Microsoft 知识库文章:
152715 () 152715 RDO 1.0b 立即释放可用:
 回到顶端

--------------------------------------------------------------------------------
这篇文章中的信息适用于:
• Microsoft Visual Basic 6.0 Learning Edition
• Microsoft Visual Basic 6.0 Professional Edition
• Microsoft Visual Basic 6.0 Enterprise Edition
• Microsoft Visual Basic 5.0 Enterprise Edition
• Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
 回到顶端
阅读(4959) | 评论(0) | 转发(0) |
0

上一篇:VBA语法基础

下一篇:Loc 函数

给主人留下些什么吧!~~