| Hallo Peter
Danke für Deine Anregung!
Nun mit -chunk kann man bytearrays in ein "Access-Feld" schreiben/lesen.
rsDAO(0).AppendChunk ArrBin()
rsDAO.Update
rsDAO.MoveLast
Diese Methode nutze ich bereits!
Mein Problem liegt nicht bei der Umwandlung oder Übertragung der Files,
sondern beim Zugriff auf den Varbinary(max) Datentypen im SQL-Server.
Das spezielle an diesem Datentypen ist, dass die Speicherung in eienm
NT-basierenden Filesystem durch den SQL-Server vorgenommen wird.
Mit den Access standard Methoden kann man NICHT auf diesen Feldtypen
zugreifen.
Mit .Net und dem Framework könnte eine Prozedur etwa so aussehen:
*************************
Public Sub LoadDocumentToTemp(ByVal IDDoc As Integer)
Dim dt As DataTable = New DataTable()
Dim pd As New PRGDialog() 'Dialog und Fortschrittsanzeige
Using conn As SqlConnection = New SqlConnection(Me.SqlDNS)
Dim reader As SqlDataReader = Nothing
Dim context() As Byte = Nothing
Dim serverFilePath As String = ""
conn.Open()
Dim transaction As SqlTransaction = conn.BeginTransaction()
Try
Dim cmd As SqlCommand = conn.CreateCommand()
With cmd
.Transaction = transaction
.CommandType = CommandType.StoredProcedure
.CommandText = "dbo.usp_SelectDocument"
.Parameters.Add(New SqlParameter("@IDDoc", IDDoc))
End With
reader = cmd.ExecuteReader()
dt.Load(reader)
If dt.Rows.Count > 0 Then
serverFilePath = dt.Rows(0)("PathName").ToString()
context = DirectCast(dt.Rows(0)("TransactionContext"), Byte())
Using clientStream As New FileStream(Me.TempFile, FileMode.CreateNew, FileAccess.Write)
Using serverStream As SqlFileStream = New SqlFileStream(serverFilePath, context, FileAccess.Read)
Dim bytesRead As Integer = 0, bufferSize As Integer = 1024 * 40
Dim buffer As Byte() = New Byte(bufferSize - 1) {}
pd.Value = 0
pd.Maximum = serverStream.Length
pd.Info2 = Me.TempFile
If serverStream.Length > 10000000 Then pd.cShow()
Do
bytesRead = serverStream.Read(buffer, 0, bufferSize)
If bytesRead = 0 Then
Exit Do
End If
clientStream.Write(buffer, 0, bytesRead)
With pd
.Value = clientStream.Length
.Info = CStr(CLng(100 / serverStream.Length * clientStream.Length)) + " %"
End With
Loop While True
pd.Info = "completet"
serverStream.Close()
Application.DoEvents()
End Using
clientStream.Seek(0, SeekOrigin.Begin)
clientStream.Close()
End Using
End If
transaction.Commit()
Catch ex As Exception
Try
'attempt to rollback the transaction
transaction.Rollback()
Catch ex2 As Exception
'rollback was unsuccessful (connection may be closed)
End Try
MessageBox.Show(ex.Message)
Finally
If reader IsNot Nothing AndAlso Not reader.IsClosed Then reader.Close()
End Try
End Using
pd.cClose()
pd = Nothing
End Sub
*************************
Suche für diese Variante eine Access Lösung (ohne .net) wenn möglich.
Für mich liegen oder evtl. lagen die stärken von Access im Datenzugriff und in der Datenmanipulation.
Wenn Neuerungen in diesen "Kernbereichen" nicht mehr Accessintern (mit VB) genutzt werden können, stellt sich mir die Frage
--"Wie Lange wird Access überhaupt noch weiterentwickelt!"--
Hoffe auf eine Lösung...
Gruss Martin
|