Infopath Attachment Field; Отправить в SQL Server - PullRequest
0 голосов
/ 19 апреля 2010

Есть ли способ получить вложение из формы в столбец SQL Server с помощью VBA? Есть несколько примеров кодирования и декодирования вложений, но так ли это?

Поддерживает ли SQL-сервер вложения каким-либо образом?

Спасибо заранее, Вс

1 Ответ

0 голосов
/ 20 апреля 2010

Вы можете хранить файлы на сервере SQL в столбце VarBinary (Max). Это будет хранить все, что вы положили туда, чтобы вы могли получить его позже. Если вы используете SQL Server 2008, вы также можете использовать функцию файлового потока, которая является очень мощной и работает точно так же

Вот некоторый код в проекте access / VBA, который у меня есть, который загрузит файл, хранящийся на сервере SQL, и сохранит его на диск

Public Sub Download_file(lMaterial_ID As Long, strSave_folder As String)
'Download the file lMaterial_ID and save it 
Dim adStream As ADODB.Stream
Dim rst As ADODB.Recordset
On Error GoTo Error_trap
On Error GoTo 0
'check if we have an open connection, if we do use it
Select Case dbCon.State
    Case adStateOpen
        'connection is open, do nothing
    Case adStateConnecting
        'still conecting wait
        Do Until dbCon.State = adStateOpen
            Application.Echo True, "Connection to DB"
        Loop
    Case adStateClosed
        'connection closed, try to open it
        If Len(strSQL_con_string) = 0 Then
            Set_SQL_con
        End If
        dbCon.ConnectionString = strSQL_con_string
        dbCon.Provider = "sqloledb"
        dbCon.Open
End Select

Me.acxProg_bar.Value = 0
Me.acxProg_bar.Visible = True
Me.Repaint

Set adStream = New ADODB.Stream
adStream.Type = adTypeBinary
adStream.Open


Set rst = New ADODB.Recordset
rst.Open "SELECT Material_FS, Material_file_name FROM tblMaterials WITH (NOLOCK) WHERE Material_ID=" & lMaterial_ID, dbCon, adOpenForwardOnly, adLockReadOnly
Me.acxProg_bar.Value = 60
Me.Repaint
If IsNull(rst.Fields("Material_FS").Value) = False Then
    adStream.Write rst.Fields("Material_FS").Value
    Me.acxProg_bar.Value = 80
    Me.Repaint
    adStream.SaveToFile strSave_folder & "\" & rst.Fields("Material_file_name").Value, adSaveCreateOverWrite
End If
rst.Close
dbCon.Close
Me.acxProg_bar.Value = 0
Me.acxProg_bar.Visible = False
Me.Repaint


Exit Sub

Error_trap:

If dbCon Is Nothing = False Then
    If dbCon.State = adStateOpen Then dbCon.Close
End If

DoCmd.Hourglass False
MsgBox "An error happened in sub Download_file, error description, " & Err.Description, vbCritical, "MCTS"
Me.acxProg_bar.Value = 0
Me.acxProg_bar.Visible = False
Me.Repaint
End Sub
...