none
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
    Dienstag, 4. November 2014 06:22

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



    Dienstag, 4. November 2014 07:48
  • 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

    Dienstag, 4. November 2014 08:41
  • Ich benutze DAO. Das ist nach meiner Kenntnis die Technik der Zukunft

    Mittwoch, 5. November 2014 15:47
  • 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

    Donnerstag, 6. November 2014 12:27
  • 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
    

    Dienstag, 13. Januar 2015 17:46