代码之家  ›  专栏  ›  技术社区  ›  Nathan

如何使用DTS将SqlServer中的二进制数据导出到文件

  •  1
  • Nathan  · 技术社区  · 15 年前

    我在SQLServer2000表中有一个图像列,用于存储pdf文件的二进制文件。

    我需要使用SQLServer2000DTS将列中每一行的内容导出到实际的物理文件中。

    http://www.freevbcode.com/ShowCode.asp?ID=1654&NoBox=True

    Set rs = conn.execute("select BinaryData from dbo.theTable")
    FileHandle = FreeFile 
    Open ("AFile") For Binary As #FileHandle 
    ByteLength = LenB(rs("BinaryData")) 
    ByteContent = rs("BinaryData").GetChunk(ByteLength)
    Put #FileHandle, ,ByteContent 
    Close #FileHandle
    

    不幸的是,DTS脚本任务是VBSCript,而不是VB,并且它在 作为 关键字在第三行。

    还有其他想法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Tmdean    15 年前

    在VBScript中编写二进制文件是一项众所周知的困难任务。VBScript公开的唯一直接文件操作位于FileSystemObject对象中,该对象仅支持编写文本文件。唯一可行的选择是使用 ADO Stream objects ,这仍然很麻烦,因为VBScript不支持将脚本创建的字节数组传递给COM对象,而COM对象是能够写入任意二进制数据所必需的。

    adTypeBinary = 1
    
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT binary_data FROM dbo.data_table", "connection string..."
    Set strm = CreateObject("ADODB.Stream")
    strm.Type = adTypeBinary
    strm.Open
    strm.Write rs.Fields("binary_data").GetChunk( _
        LenB(rs.Fields("binary_data").Value))
    strm.SaveToFile "binarydata.bin"
    strm.Close
    rs.Close
    

    我用Access测试了这段代码,不幸的是它似乎不起作用。我没有得到与我创建的表中相同的二进制数据,但我没有费心进入十六进制编辑器来查看有什么不同。

    如果您从ADO操作中得到错误,您可以得到 actual messages 通过在脚本顶部添加一个“On Error Resume Next”并使用以下代码。

    For Each err In rs.ActiveConnection.Errors
        WScript.Echo err.Number & ": " & err.Description
    Next
    
        2
  •  0
  •   Neal    15 年前

    如果可能的话,我会选择sqlserverintegrationservices(SSIS)而不是DTS,并使用一个脚本任务来允许您使用VB.NET版.

    您可以连接到SQL Server 2000数据源并将导出的输出指向一个文件。