Как сохранить содержимое элемента управления inkPicture в таблице SQL Server и прочитать содержимое обратно в элемент управления inkPicture? - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть приложение MS Access 2010. У меня есть форма с элементом управления inkPicture с именем InkSign, где пользователь может поставить подпись. Я храню содержимое элемента управления inkPicture в переменной варианта een с именем sig, например:

sig = Me.InkSign.Ink.save()

Теперь я могу считывать данные этого варианта в элемент управления, используя:

Dim newInk As New InkDisp
newInk.Load sig
Me.InkSign.Ink.DeleteStrokes
Me.InkSign.InkEnabled = False
Set InkSign.Ink = newInk
Me.InkSign.InkEnabled = True

Я хочу сохранить и прочитать данные подписи в таблице базы данных SQL Server.

Я пробовал это:

Private Sub btnSaveSig_Click()
    Dim rst As ADODB.Recordset 

    sig = Me.InkSign.Ink.save()

    Set rst = New ADODB.Recordset
    With rst
        '.CursorLocation = adUseClient
        .Open "SELECT * FROM sign WHERE signID = 1", cnnC, adOpenKeyset, adLockOptimistic
        If .BOF And .EOF Then .AddNew
        .Fields("signDate") = Date
        .Fields("signedBy") = "Pipo"
        .Fields("sign") = sig
        .Fields("docType") = "so"
        .Fields("docID") = "1"
        .Update
        .Close
    End With
    Set rst = Nothing
    MsgBox "signature saved"

End Sub

Столбец sign имеет тип NVARCHAR(MAX). Данные сохраняются, но выглядят как китайские иероглифы. Но правильный ли это способ хранения этих двоичных данных?

Я пытаюсь прочитать данные обратно, но в этой строке происходит сбой: newInk.Load sig

Private Sub LoadSignature()
    Dim newInk As New InkDisp

    sig = Nz(cLookup("sign", "sign", "signID = 1"), "")
    If IsEmpty(sig) Then Exit Sub

    newInk.Load sig
    Me.InkSign.Ink.DeleteStrokes
    Me.InkSign.InkEnabled = False
    Set InkSign.Ink = newInk
    Me.InkSign.InkEnabled = True
End Sub

Функция clookup это функция, которая извлекает данные из таблицы SQL Server. Я получаю ошибку:

Недопустимый вызов процедуры или аргумент

Я думаю, что я должен использовать объект потока ADO для записи и чтения данных. Но я не знаю как.

Может кто-нибудь помочь мне заставить этот код работать?

Спасибо, Emphyrio

1 Ответ

0 голосов
/ 15 февраля 2020

Попробуйте, не тестировали.

Private Sub btnSaveSig_Click()
    Dim rst As ADODB.Recordset
    Dim oStream As ADODB.Stream
    Dim fn As String

    sig = Me.InkSign.Ink.Save()

    'Set rst = New ADODB.Recordset
    Set oStream = New ADODB.Stream

    fn = "c:\myImageFile" '<~~"Your image file path"

    With oStream
        .Type = adTypeBinary
        .Open
        .LoadFromFile fn
    End With

    If oStream.Size > 0 Then
        With rst
            '.CursorLocation = adUseClient
            .Open "SELECT * FROM sign WHERE signID = 1", cnnC, adOpenKeyset, adLockOptimistic
            If .BOF And .EOF Then .AddNew
            .Fields("signDate") = Date
            .Fields("signedBy") = "Pipo"
            .Fields("sign") = oStream.Read '<~~ image read
            .Fields("docType") = "so"
            .Fields("docID") = "1"
            .Update
            .Close
        End With
    End If
    Set rst = Nothing
    oStream.Close
    Set oStream = Nothing
    MsgBox "signature saved"

End Sub
...