如何将inkPicture控件内容存储在SQL Server表中并将内容读回到inkPicture控件?

问题描述 投票:0回答:1

我有一个MS Access 2010应用程序。我有一个带有名为InkSign的inkPicture控件的表单,用户可以在其中放置签名。我将inkPicture控件的内容存储在名为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

sql-server vba ms-access-2010 adodb
1个回答
0
投票

尝试,未测试。

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
© www.soinside.com 2019 - 2024. All rights reserved.