Lotus Notes ODBC Connection и поле BLOB для SQL - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над Lotus Notes 9, у меня есть несколько записей в базе данных Lotus Notes с вложением в документы.

Теперь я хотел бы переместить записи этого документа на сервер SQL со всеми текстовыми и числовыми полями и т. Д.Мне было интересно, если кто-нибудь может помочь мне в приложениях.Как я могу прикрепить вложение к типу BLOB-полей SQL-сервера с использованием LotusScript или JDBC (с использованием кода LS2J)?

Я знаю, что с помощью ODBC-соединения некоторые вещи могут быть достигнуты, но не знаю, как это сделать.Если кто-то выполнил подобное упражнение, любая помощь будет высоко оценена.

Вот код, в таблице SQL я задаю поле FileNameAtt is varbinary(max).

Sub Initialize

    Dim cn As Variant
    Dim rs As Variant

    ' Variable declarations
    Dim file_length As Variant
    Dim NumBlocks As Variant
    Dim leftover As Variant
    Dim inBuff As Variant, outBuff() As Byte

    'VB Constants
    Const adOpenKeyset = 1
    Const adLockOptimistic = 3
    Const adTypeBinary = 1
    Const adSaveCreateOverWrite = 2
    Const adBlocksize = 4096

    'Connect to the serve server
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    ' Open provider
    cn.open "SQLConnectionCSIDB", "user1", ""

    Dim session As New NotesSession
    Set stream = session.CreateStream
    Call stream.open("C:\\Image1.PNG")
    file_length=stream.Bytes

    If file_length > 0 Then
        num_blocks = Int(file_length / adBlocksize)
        left_over = file_length Mod adBlocksize

        Call rs.Open("SELECT TOP 1 * FROM tblFiles", cn, adOpenKeyset, adLockOptimistic)

        rs.AddNew
        'rs.Fields("dsize").Value = file_length
        rs.Fields("FileNameAtt").Value ="C:\\Image1.PNG"

        ' Get blocks of the file
        ReDim outBuff(adBlocksize)
        For block_num = 1 To num_blocks
            ' Get data into a variant
            inBuff = stream.Read(adBlocksize)

            ' Move to byte array
            counter% = 0
            ForAll b In inBuff
                outBuff(counter%) = b
                counter% = counter% + 1
            End ForAll

            ' Save to field
            rs.Fields("dimage").AppendChunk(outBuff)
        Next block_num

        ' Get the remainder of the file
        If left_over > 0 Then
            inBuff = stream.Read(left_over) 

            ' Move to byte array
            counter% = 0
            ReDim outBuff(left_over)
            ForAll b In inBuff
                outBuff(counter%) = b
                counter% = counter% + 1
            End ForAll

            ' Save to field
            rs.Fields("dimage").AppendChunk(outBuff)
        End If  

        rs.Update
        Call rs.Close
    End If

    Call cn.Close
    Set stream = Nothing
    Set session = Nothing
End Sub

выдает ошибку, как показано ниже в номере строки

rs.Fields("FileNameAtt").Value ="C:\\Image1.PNG"

Поставщик Microsoft OLEDB для драйверов ODBC: ошибка, вызванная многоэтапной операцией OLE DB, проверьте значение каждого состояния OLE DB, если доступно, работа не выполнена

Спасибо, Человек

1 Ответ

0 голосов
/ 12 июня 2018

Нет способа получить доступ к вложениям через NotesSQL.

LotusScript может работать с вложениями, используя класс NotesEmbeddedObject и связанные методы в NotesDocument , NotesRichTextItem и NotesRichTextNavigator ,Те же самые возможности также доступны через Lotus COM классы для программ, написанных на VB, C # и других языках, и эквивалентные Java-классы также доступны.

...