Хранение документов Microsoft Word 97 в столбце SQL Server - PullRequest
7 голосов
/ 06 мая 2011

У меня есть эта база данных с таблицей, в которой есть следующее, но у меня нет возможности расшифровать ее

DATA,        TYPE,            FILE TYPE, SIZE,  DOC TYPE
0x15234324 , Word.Document.8 ,DOC,       19968, WORD.DOCUMENT.8

Поле содержит текстовый документ, хранящийся в SQL Server IMAGE столбец

Кто-нибудь сталкивался с этим раньше или как извлечь эти данные в удобочитаемом формате?

До сих пор я пытался использовать PHP для извлечения файла и записи его в текстовый документ, но мне не очень повезло.

ОБНОВЛЕНИЕ: Теперь у меня есть Visual Studio Express, и я хотел бы получить способ извлечь эти данные и сохранить в текстовом документе

ОБНОВЛЕНИЕ2: Это то, что у меня есть в VB sofar

Imports System.Data.SqlClient
Imports System.IO


Public Class Form1

    Private Shared Function RetrieveFile(ByVal filename As String) As Byte()
        Dim connection As New SqlConnection("Server=sqlsrv;database=database;Trusted_Connection=Yes;")
        Dim command As New SqlCommand("select data from objects where object_ref in (select data from parts where object_ref =239804)", connection)
        command.Parameters.AddWithValue("test", filename)
        connection.Open()
        Dim reader As SqlDataReader = command.ExecuteReader(System.Data.CommandBehavior.SequentialAccess)
        reader.Read()
        Dim memory As New MemoryStream()
        Dim startIndex As Long = 0
        Const ChunkSize As Integer = 256
        While True
            Dim buffer As Byte() = New Byte(ChunkSize - 1) {}
            Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize)
            memory.Write(buffer, 0, CInt(retrievedBytes))
            startIndex += retrievedBytes
            If retrievedBytes <> ChunkSize Then
                Exit While
            End If
        End While
        connection.Close()
        Dim data As Byte() = memory.ToArray()
        memory.Dispose()
        Return data


    End Function


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim saveFileDialog1 As New SaveFileDialog()
        saveFileDialog1.Filter = "Doc File|*.doc"
        saveFileDialog1.Title = "Save an doc File"
        saveFileDialog1.ShowDialog()

        If saveFileDialog1.FileName <> "" Then
            Dim fs As New System.IO.FileStream(saveFileDialog1.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write)
            Dim data As Byte() = RetrieveFile("test.doc")
            fs.Write(data, 0, data.Length)
            fs.Flush()
            fs.Close()
        End If
    End Sub




End Class

Ответы [ 5 ]

4 голосов
/ 24 июня 2011

Некоторое время назад я написал сценарий VBS для извлечения данных из больших двоичных объектов, вот его общая версия:

Const adOpenKeyset                  = 1
Const adLockOptimistic              = 3
Const adTypeBinary                  = 1
Const adSaveCreateOverWrite         = 2

strSQLServer = "YOURSERVER"
strSQLDatabase = "YOURDB"
strRecordID = "123"
strTempFileName = "c:\output.doc"

Set objConn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.RecordSet")
Set objStream = CreateObject("ADODB.Stream")

objConn.Open "Provider=SQLOLEDB;data Source=" & strSQLServer & ";Initial Catalog=" & strSQLDatabase & "; Trusted_Connection=yes;"
objRS.Open "Select * from AllDocStreams WHERE ID='" & strRecordID & "'", objConn, adOpenKeyset, adLockOptimistic

objStream.Type = adTypeBinary
objStream.Open
objStream.Write objRS.Fields("Content").Value
objStream.SaveToFile strTempFileName, adSaveCreateOverWrite

objRS.Close
objConn.Close
2 голосов
/ 23 июня 2011

C # код:

connection.Open();
SqlCommand command1 = new SqlCommand("select DATA from TABLE where ...", connection);
byte[] img = (byte[])command1.ExecuteScalar();
File.WriteAllBytes("your_path/word.doc", img);

Это должно быть логично.Напишите что-нибудь подобное на любом языке, который вы знаете.Это не должно быть сложно в PHP или чем-то, что вы используете.

0 голосов
/ 24 июня 2011

Я думаю, вы получите исключение IndexOutOfRangeException в следующей строке вашего кода:

 Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize)

потому что индекс первого параметра равен 0, а не 1

В любом случае, я предлагаю вам использовать метод, подобный предложенному Кларком, который проще и удобнее для чтения.

0 голосов
/ 23 июня 2011

Попробуйте что-то вроде этого, замените "некоторые" значения своими:

declare @doc varbinary(max), @ObjectToken int

select @doc = (select data from yourTable were someID = @idThatYouWant)

set @FileName = '\someFolder\' + 'someFilename.doc'

print 'Processing: ' + isnull(@FileName, 'null')

exec sp_oacreate 'ADODB.Stream', @objecttoken output
exec sp_oasetproperty @objecttoken, 'type', 1
exec sp_oamethod @objecttoken, 'open'
exec sp_oamethod @objecttoken, 'write', null, @doc
exec sp_oamethod @objecttoken, 'savetofile', null, @FileName, 2
exec sp_oamethod @objecttoken, 'close'
exec sp_oadestroy @objecttoken
0 голосов
/ 22 июня 2011

взгляните на эту тему.

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101754

Парень делает это, используя SCRIPTING.FILESYSTEMOBJECT, чтобы извлечь содержимое из столбца IMAGE и записать его в файл.

прочитайте комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...