none
Sharepoint 2016 zugriff auf MSSQL Datenbank Blob

    Frage

  • Guten Tag,

    Wir haben einen MSSQL Server welcher Daten einer Applikation speichert. Es handelt sich dabei um PDF`s und Metadaten.

    Nun möchte ich in SharePoint 2016 eine Verbindung zu dem Datenbankserver herstellen und den Benutzern vom Sharepointserver die Möglichkeit geben diese Daten auch abzurufen.

    Verbindung zum Datenbankserver konnte ich ohne Probleme herstellen, auch konnte ich die Metadaten anzeigen lassen.

    Was muss ich jetzt machen damit die Leute auch einen Zugriff auf die PDF`s haben ?,

    diese sind als Blob gespeichert.

    Vielen Dank

    Dienstag, 13. März 2018 15:14

Antworten

  • Hi,
    ohne genau zu wissen, was Du bisher gemacht hast und was Du konkrete im UI erreichen willst, kann ich nur eine Möglichkeit zeigen, wie ich es machen würde.

    In der Oberfläche würde ich einen Link platzieren (z.B. in einem WebPart), der mit einem Handler (ashx) verlinkt wird. Im Link ist als Parameter die ID des konkreten Dokumentes enthalten. Der Handler (ashx) ruft mit der übergebenen ID das Dokument aus der Datenbank ab, entweder als image-Spalte oder über TXTPTR. Im Ergebnis der Abfrage erhält man ein Byte-Stream. Dieser Byte-Stream wird im Response übergeben mit dem pdf-Header. Beim Klick auf den Link wird dann die Anwendung zur Anzeige eines pdf geöffnet.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert MrAlex-G Freitag, 16. März 2018 10:36
    Mittwoch, 14. März 2018 06:51

Alle Antworten

  • Hi,
    ohne genau zu wissen, was Du bisher gemacht hast und was Du konkrete im UI erreichen willst, kann ich nur eine Möglichkeit zeigen, wie ich es machen würde.

    In der Oberfläche würde ich einen Link platzieren (z.B. in einem WebPart), der mit einem Handler (ashx) verlinkt wird. Im Link ist als Parameter die ID des konkreten Dokumentes enthalten. Der Handler (ashx) ruft mit der übergebenen ID das Dokument aus der Datenbank ab, entweder als image-Spalte oder über TXTPTR. Im Ergebnis der Abfrage erhält man ein Byte-Stream. Dieser Byte-Stream wird im Response übergeben mit dem pdf-Header. Beim Klick auf den Link wird dann die Anwendung zur Anzeige eines pdf geöffnet.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert MrAlex-G Freitag, 16. März 2018 10:36
    Mittwoch, 14. März 2018 06:51
  • Hallo Peter !

    Vielen Dank für Deine Antwort, die Therorie dahinter habe ich verstanden, wie ich es jetzt in der Praxis umsetze ist ein anderes Thema. Ich habe noch nicht so viel Erfahrung mit Sharepiont.

    Viele Grüße

    Freitag, 16. März 2018 10:37
  • Hi Alex,
    wenn der Handler direkt auf die Datenbank zugreift, könnte er so aussehen:

    Imports System.Data.SqlClient
    Imports System.Web
    Public Class PdfHandler
      Implements IHttpHandler
    
      ''' <summary>
      '''  You will need to configure this handler in the Web.config file of your 
      '''  web and register it with IIS before being able to use it. For more information
      '''  see the following link: https://go.microsoft.com/?linkid=8101007
      ''' </summary>
    #Region "IHttpHandler Members"
    
      Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
          ' Return false in case your Managed Handler cannot be reused for another request.
          ' Usually this would be false in case you have some state information preserved per request.
          Return False
        End Get
      End Property
    
      Private cnString = "Data Source=sps2016;Initial Catalog=DemoDB;Integrated Security=True"
    
      Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Try
          Dim id As Integer = CType(context.Request.QueryString("ID"), Integer)
          Using conn As New SqlConnection(cnString)
            Using cmd As New SqlCommand("SELECT * FROM Tab WHERE ID = @id", conn)
              cmd.Parameters.AddWithValue("@id", id)
              conn.Open()
              Dim myData As Data.SqlClient.SqlDataReader = cmd.ExecuteReader
              If myData.Read Then
                With context.Response
                  .Clear()
                  .ContentType = "Application/pdf"
                  .AddHeader("Content-Disposition", "inline;filename=Dokument.pdf")
                  Dim buf(127) As Byte
                  Dim p = myData.GetOrdinal("Dok")
                  Dim l0 = 0&
                  Dim l1 = myData.GetBytes(p, 0, buf, 0, buf.Length)
                  While l1 > 0
                    .OutputStream.Write(buf, 0, CType(l1, Integer))
                    l0 += l1
                    l1 = myData.GetBytes(p, l0, buf, 0, buf.Length)
                  End While
                  .OutputStream.Close()
                End With
              End If
              conn.Close()
            End Using
          End Using
        Catch ex As Exception
          Trace.WriteLine(ex.Message)
        End Try
      End Sub
    
    #End Region
    
    End Class
    

    Der vorliegende Code wertet die übergebene ID aus und nutzt diese für die Abfrage der Datenbank, um dort das Imagefeld "Dok" zu lesen.

    Der Aufruf in einem WebPart kann so gestaltet werden:

        Dim id = 1 ' ID des Datensatzes mit dem Pdf
        Dim url = SPContext.Current.Web.Url & $"/_layouts/SharePointProject1/PdfHandler.ashx?ID={id}"
        Me.Controls.Add(New HyperLink With {.Text = "Link zu Pdf", .NavigateUrl = url, .Target = "_new"})

    Wichtig ist auch, dass ashx nicht blockiert wird, was im SharePoint 2016 erst einmal die anfängliche Standardeinstellung ist.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 16. März 2018 20:17