Fragensteller
GUID aus Formular auslesen und für Abfrage verwenden

Frage
-
Ich wähle in einem Access-Formular ein Dokument aus.
Dieses ist in einer File-Table auf dem SQL gespeichert. Mein Formular zeigt passend die stream_id an, d.h. im Formluar existiert ein Feld mit etwa diesem Inhalt {0E4C84F1-9DFC-E311-9AF7-000C29EC3D5D}.
Nun will ich ausgehend von der stream_id den Namen der Datei auslesen und diese öffnen. Es handelt sich um Word-Dokumente und PDFs.
Überraschenderweise erhalte ich nur "?????????" als Ergebnis für ? Me.stream_id; genauso für ?me.txt_stream_id.
Entsprechend schlägt dann auch die Abfrage fehl. Was mache ich falsch ?
BTW: Das sit der SQL-string den ich mir zusammenbaue
sqlstr = "SELECT fileTableRootPath() + DATEISPEICHER.file_stream.GetFileNamespacePath() AS UNCPathName FROM DATEISPEICHER WHERE [FK_AUftrag]=" & Me.stream_id
Ich habe auch schon mit StringfromGUID und GUIDfromString versucht herumzuspielen; brachte aber keine Besserung.
- Bearbeitet NicoNi Dienstag, 4. November 2014 06:29
Alle Antworten
-
So, jetzt kann ich selbst die Lösung präsentieren.
Die Lösung fand ich teilweise im Netz:
http://oakdome.com/programming/MSAccess_Using_GUIDs.php
Der Trick scheint zu sein, vor und hinter dem GUID-String einiges zu entfernen
Und so geht's:
Dim sguid As String sguid = StringFromGUID(Me.txt_stream_id)'einen String aus der GUID erzeugen
' das ganze sieht dann so aus: {guid {0E4C84F1-9DFC-E311-9AF7-000C29EC3D5D}}
' Wir entfernen jetzt das ganze drumherum sguid = Right(sguid, Len(sguid) - 6) sguid = Left(sguid, Len(sguid) - 1) connstr = "ODBC;DRIVER={SQL Server Native Client 11.0};SERVER=GALILEO2010;DATABASE=Gutachten;Trusted_Connection=yes" sqlstr = "SELECT fileTableRootPath() + DATEISPEICHER.file_stream.GetFileNamespacePath() AS UNCPathName FROM DATEISPEICHER WHERE [stream_id]='" & sguid & "'"
'Wichtig scheint noch das Setzen der "'" zu sein
- Bearbeitet NicoNi Dienstag, 4. November 2014 07:49
- Als Antwort vorgeschlagen Winfried.Sonntag Donnerstag, 6. November 2014 12:30
-
Du hast die Antwort ja gefunden. Was mich überrascht, ist der Kommentar am Schluss:
>> Wichtig scheint noch das Setzen der "'" zu sein
Bei mir geht es auch ohne die Hochkommas rund um den GUID, zumindest in DAO. Wo wird dein SQL-String ausgeführt, DAO, ADODB, SQL Pass Through?
Matthias Kläy, Kläy Computing AG
-
Hi,
benutzt Du FileStream oder hat Du die Dateien als BLOB in der Tabelle abgelegt? Wenn Filestream, wie schreibst Du die Dateien per DAO ins Backend? Würde mich persönlich interessieren, bisher schreibe ich mit ADO und ADODB.Stream die Dateien in die Filestream Tabelle.
Rufst Du eine SP auf die den Pfad zur Datei übergibt?
Vielen Dank schon im Voraus.
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren -
Sorry, ich habe erst jetzt Deinen Wunsch nach Beispielcode gesehen.
Hier mein Vorschlag. Die Quelldatei wird in die Filestream-Tabelle kopiert und dann die Datei für fallebzogen registriert. Es geht für mich darum, Faxe, Word-Dokumente oder Rechnungs-PDFs fallbezogen zu registrieren.
USE [GUTACHTEN] GO /****** Object: StoredProcedure [dbo].[DokumentErfassen] Script Date: 13.01.2015 18:42:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- Batch submitted through debugger: SQLQuery3.sql|15|0|C:\Users\ADMINI~1\AppData\Local\Temp\2\~vs2C94.sql -- ============================================= -- Author: Nicolas Nickisch -- Create date: 11.10.1024 -- Description: kopiet eine Datei in die Filetable und registriert die Datei für den jeweiligen Fall -- ============================================= ALTER PROCEDURE [dbo].[DokumentErfassen] -- Add the parameters for the stored procedure here @Auftrag int = 0, -- Verweis auf den Auftrag @Dateiname nvarchar(255) , -- der Dateinmae, der später im FileTable verwendet wird @SourceFileAndPath nvarchar(255), -- Pfad zur Quelldatei @subject nvarchar(255) =N'--- DEFAULT ---' --Ein Freitext, der die Datei beschreibt AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @SQL nvarchar(MAX); DECLARE @streamid uniqueidentifier -- hier wird die streaiming-ID zurückgegeben BEGIN TRY BEGIN TRANSACTION Erfassung; -- als erstes den SQL-String zusammenbauen SET @SQL='INSERT INTO dbo.DATEISPEICHER (name, file_stream) (SELECT '''+@Dateiname + ''', * FROM OPENROWSET(BULK N'''+@SourceFileAndPath +''', SINGLE_BLOB) AS FileData)'; -- jetzt den gerade generierten T-SQL-Code ausführen EXEC sp_executesql @SQL; SET @streamid=(SELECT dbo.DATEISPEICHER.stream_id from dbo.DATEISPEICHER WHERE name=@Dateiname) ; INSERT INTO dbo.tbl_Files_zum_Auftrag (AuftragNr,FK_stream_id, Beschreibung) VALUES(@Auftrag,@streamid,@subject); EXEC dbo.sp_Journal_AddEntry @Auftrag, 34 ,N'Dokument wurde archiviert und verschoben' -- jetzt die Originaldatei löschen DECLARE @delstr nvarchar(4000); SET @delstr='del "' + @SourceFileAndPath + '"'; -- derzeit muss das Ausführen des DOS-Codes unterbleiben!!! Das scheint eher schwierig zu sein. -- theoretisch sollte hier die Quelldatei gelöcht werden --exec xp_cmdshell @delstr; COMMIT TRANSACTION Erfassung; RETURN; END TRY BEGIN CATCH if @@TRANCOUNT>0 rollback transaction Erfassung; DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); -- Use RAISERROR inside the CATCH block to return error -- information about the original error that caused -- execution to jump to the CATCH block. RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END CATCH END