{"id":55001538,"date":"2025-04-01T00:00:00","date_gmt":"2025-03-05T17:22:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1538"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bilder_im_SQL_Server_mit_varbinarymax","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/","title":{"rendered":"Bilder im SQL Server mit varbinary(max)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/5e2b2080479f43f5a4bfad20971437ac\" width=\"1\" height=\"1\" alt=\"\"><b>Wie man Bilder in Access speichert, ist seit der Version 2010 eindeutig vorgegeben &#8211; n&auml;mlich in Anlagefeldern. Die Inhalte dieser Felder k&ouml;nnen auch leicht im Bild-Steuerelement angezeigt werden, dazu braucht man nur eine einfache Bindung an das entsprechende Feld. Allerdings bietet der SQL Server keinen solchen Datentyp, sondern nur verschiedene Alternativen. Dabei handelt es sich beispielsweise um den Datentyp varbinary(max) oder um FILESTREAM. Die erstgenannte Alternative schauen wir uns im vorliegenden Beitrag an.<\/b><\/p>\n<h2>Beispielmaterial<\/h2>\n<p>Wir starten mit einer einfachen Beispieldatenbank, der wir eine Tabelle namens <b>tblBilder <\/b>hinzugef&uuml;gt haben. Diese enth&auml;lt die Felder wie in Bild 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_001.png\" alt=\"Tabelle zum Speichern von Bildern\" width=\"549,559\" height=\"389,5376\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Tabelle zum Speichern von Bildern<\/span><\/b><\/p>\n<p>Dazu haben wir unter anderem ein Anlagefeld eingef&uuml;gt, dem wir nicht nur Bilder, sondern auch noch andere Dateien zuweisen k&ouml;nnen.<\/p>\n<p>Hier k&ouml;nnen wir in der Datenblattansicht durch einen Doppelklick auf das im Anlagefeld angezeigt B&uuml;roklammer-Symbol einen Dialog namens <b>Anlagen <\/b>&ouml;ffnen, mit dem wir die enthaltenen Anlagen verwalten k&ouml;nnen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_002.png\" alt=\"Einf&uuml;gen eines Bildes\" width=\"549,559\" height=\"374,2685\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einf&uuml;gen eines Bildes<\/span><\/b><\/p>\n<h2>Access-Bilder im Formular<\/h2>\n<p>Ein so eingef&uuml;gtes Bild m&ouml;chten wir auch im Formular anzeigen k&ouml;nnen. Dazu erstellen wir ein neues, leeres Formular, f&uuml;gen diesem unsere Tabelle als Datensatzquelle hinzu und ziehen alle gew&uuml;nschten Felder in den Formularentwurf.<\/p>\n<p>Das Anlagefeld wird hier als Steuerelement des Typs <b>Anlage <\/b>hinzugef&uuml;gt, das an das Anlagefeld der Tabelle gebunden ist.<\/p>\n<p>Alternativ k&ouml;nnen wir auch ein Steuerelement des Typs <b>Bild <\/b>einf&uuml;gen.<\/p>\n<p>Der Unterschied zwischen diesen beiden Steuerelementen ist im Wesentlichen, dass wir mit dem Anlagefeld auch die enthaltenen Dateien verwalten k&ouml;nnen.<\/p>\n<p>Dazu brauchen wir nur das Steuerelement anzuklicken und sehen dann das Men&uuml; wie in Bild 3.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_003.png\" alt=\"Ein Bild im Anlage-Steuerelement\" width=\"424,5589\" height=\"280,4185\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ein Bild im Anlage-Steuerelement<\/span><\/b><\/p>\n<p>Hier k&ouml;nnen wir zwischen den Bildern wechseln, wenn das Anlagefeld mehrere enthalten sollte, und mit einem Klick auf die B&uuml;roklammer den Dialog <b>Anlagen <\/b>zum Verwalten der Anlagen aufrufen.<\/p>\n<p>Das Bild-Steuerelement zeigt einfach nur das erste Bild im Anlagefeld an.<\/p>\n<h2>Anlagefeld im SQL Server?<\/h2>\n<p>Es w&auml;re praktisch, wenn es im SQL Server einen entsprechenden Datentyp g&auml;be. Den gibt es allerdings nicht in dieser Form. Das erfahren wir auf die harte Tour, wenn wir versuchen, unsere Beispieldatenbank mit dem SQL Server Migration Assistant zu migrieren.<\/p>\n<p>Die Fehlerliste aus Bild 4 zeigt, dass der Datentyp <b>Attachment <\/b>nicht unterst&uuml;tzt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_004.png\" alt=\"Meldung beim Versuch, ein Anlagefeld zum SQL Server zu migrieren\" width=\"649,559\" height=\"331,9331\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Meldung beim Versuch, ein Anlagefeld zum SQL Server zu migrieren<\/span><\/b><\/p>\n<p>Es wird auch keine Alternative aufgezeigt, sondern das Feld wird einfach in eines mit dem Datentyp <b>varchar(8000) <\/b>migriert &#8211; das entnehmen wir dem Entwurf der neu erzeugten Tabelle im SQL Server Management Studio (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_005.png\" alt=\"Das Anlagefeld wird in ein Feld mit dem Datentyp varchar(8000) migriert.\" width=\"599,559\" height=\"254,5787\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Anlagefeld wird in ein Feld mit dem Datentyp varchar(8000) migriert.<\/span><\/b><\/p>\n<p>Allerdings ist die Gr&ouml;&szlig;e von 8.000 Zeichen etwas &uuml;bertrieben &#8211; tats&auml;chlich speichert die Tabelle nach der Migration nur noch den Namen der Datei in diesem Feld (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_006.png\" alt=\"Das Feld Bild enth&auml;lt nun nur noch den Dateinamen.\" width=\"424,5589\" height=\"181,4194\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Feld Bild enth&auml;lt nun nur noch den Dateinamen.<\/span><\/b><\/p>\n<p>Das hei&szlig;t, dass der Ansatz &uuml;ber den SQL Server Migration Assistant hier nicht brauchbar ist und wir nacharbeiten m&uuml;ssen.<\/p>\n<h2>Wo und wie Bilder im SQL Server speichern?<\/h2>\n<p>Navigieren wir im SQL Server Management Studio durch die Datentypen, die uns die Entwurfsansicht f&uuml;r Tabellen anbietet, finden wir schnell den Eintrag <b>image<\/b>. Ist das nicht der passende Datentyp?<\/p>\n<p>Schauen wir uns das einmal an. Zun&auml;chst einmal betrachten wir den Weg, dort ein Bild zu speichern. Dieser ist relativ einfach umzusetzen.<\/p>\n<p>Wir nutzen eine einfache <b>INSERT INTO<\/b>-Anweisung, um dem <b>image<\/b>-Feld namens <b>Bild2 <\/b>ein Bild hinzuzuf&uuml;gen. Diese sieht wie folgt aus:<\/p>\n<pre>INSERT INTO tblBilder(Bild2) \r\nSELECT BulkColumn FROM OPENROWSET(BULK ''C:\\...\\pic001.png'', SINGLE_BLOB)   AS Bild2<\/pre>\n<p>Die <b>OPENROWSET<\/b>-Funktion liest die angegebene Datei als einzelnen Datenblock (<b>SINGLE_BLOB<\/b>) und schreibt das Ergebnis in das Feld <b>Bild2<\/b>. Das Ergebnis sehen wir in Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_007.png\" alt=\"Hinzuf&uuml;gen eines Bildes per INSERT INTO-Anweisung\" width=\"649,559\" height=\"246,3844\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Hinzuf&uuml;gen eines Bildes per INSERT INTO-Anweisung<\/span><\/b><\/p>\n<p>Zum Hinzuf&uuml;gen eines Bildes zu einem bestehenden Datensatz nutzen wir folgende Syntax:<\/p>\n<pre>UPDATE tblBilder \r\nSET Bild2 = (\r\n&nbsp;&nbsp;&nbsp;&nbsp;SELECT bulkcolumn \r\n&nbsp;&nbsp;&nbsp;&nbsp;FROM OPENROWSET(\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BULK ''C:\\...\\pic002.png'', \r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SINGLE_BLOB) AS Bild2)\r\nWHERE BildID = 1<\/pre>\n<h2>Bild von image-Feld in Access anzeigen<\/h2>\n<p>Damit kehren wir zur Access-Datenbank zur&uuml;ck. Hier finden wir, da wir weiter oben die Tabelle <b>tblBilder <\/b>zum SQL Server migriert haben, nunmehr die Originaltabelle mit dem Namen <b>SSMA$tblBilder$local <\/b>vor sowie die verkn&uuml;pfte Tabelle namens <b>tblBilder<\/b>.<\/p>\n<p>Damit das Feld <b>Bild2<\/b>, das wir soeben zur SQL Server-Tabelle <b>tblBilder <\/b>hinzugef&uuml;gt haben, auch in Access sichtbar wird, m&uuml;ssen wir die Verkn&uuml;pfung aktualisieren. Das gelingt f&uuml;r eine einzelne Tabelle am einfachsten, indem wir f&uuml;r den Eintrag im Navigationsbereich den Kontextmen&uuml;-Befehl <b>Link aktualisieren <\/b>aufrufen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_008.png\" alt=\"Aktualisieren einer verkn&uuml;pften Tabelle\" width=\"424,5589\" height=\"806,863\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Aktualisieren einer verkn&uuml;pften Tabelle<\/span><\/b><\/p>\n<p>Wenn wir uns nun die aktualisierte Tabellenverkn&uuml;pfung ansehen, finden wir das Feld <b>Bild2<\/b> mit dem Datentyp <b>OLE-Objekt <\/b>vor (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_009.png\" alt=\"Das image-Feld erscheint in Access als OLE-Objekt\" width=\"424,5589\" height=\"264,0549\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das image-Feld erscheint in Access als OLE-Objekt<\/span><\/b><\/p>\n<p>Wechseln wir nun zur Datenblattansicht, um uns den Inhalt anzusehen, finden wir lediglich den Text OLE-Objekt vor (siehe Bild 10). Hier war nicht viel mehr zu erwarten, denn Tabellen k&ouml;nnen eben nur Texte und gegebenenfalls noch ein Kontrollk&auml;stchen anzeigen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_010.png\" alt=\"Der Inhalt wird ebenfalls als OLE-Objekt angezeigt.\" width=\"549,559\" height=\"174,609\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Der Inhalt wird ebenfalls als OLE-Objekt angezeigt.<\/span><\/b><\/p>\n<p>Wie aber sieht es im Formular aus? Hier konnten wir die &uuml;ber den SQL Server eingef&uuml;gten Bilddateien in keinem der verf&uuml;gbaren Steuerelemente sichtbar machen.<\/p>\n<h2>image-Datentyp ist veraltet<\/h2>\n<p>Neben der Tatsache, dass es keinen einfachen Weg zu geben scheint, den Inhalt unseres <b>image<\/b>-Feldes in einem Access-Formular sichtbar zu machen, ist der <b>image<\/b>-Datentyp auch noch als veraltet gekennzeichnet.<\/p>\n<p>Das hei&szlig;t, er wird nur noch aus Gr&uuml;nden der Kompatibilit&auml;t beibehalten. Der Datentyp kann aber auch in einer der folgenden SQL Server-Versionen schlicht entfallen.<\/p>\n<p>Also schauen wir uns direkt nach Alternativen um.<\/p>\n<h2>Der Datentyp varbinary(max)<\/h2>\n<p>Eine weitere M&ouml;glichkeit, Bilder oder Dateien in einem Feld einer SQL Server-Datenbank zu speichern, ist der Datentyp <b>varbinary(max)<\/b>.<\/p>\n<p>Dieser erlaubt es ebenfalls, Bilder mit der folgenden Anweisung hineinzuschreiben:<\/p>\n<pre>INSERT INTO tblBilder(BildVarBinary) \r\nSELECT BulkColumn \r\nFROM OPENROWSET(BULK ''C:\\...\\pic001.png'', SINGLE_BLOB) \r\n   AS BildVarBinary<\/pre>\n<p>Im Gegensatz zum Datentyp <b>image <\/b>ist der Datentyp <b>varbinary(max) <\/b>nicht veraltet.<\/p>\n<p>Das Anzeigen von Bildern aus <b>varbinary(max)<\/b>-Feldern ist, soviel k&ouml;nnen wir bereits vorwegnehmen, auf verschiedene Arten m&ouml;glich.<\/p>\n<p>Damit allein ist es jedoch nicht getan, denn wir m&uuml;ssen uns um folgende Aufgaben k&uuml;mmern:<\/p>\n<ul>\n<li>Bilder zu einem Datensatz anlegen: Wir m&uuml;ssen eine Schaltfl&auml;che hinterlegen, mit der wir einen Dateiauswahldialog &ouml;ffnen und anschlie&szlig;end die gew&auml;hlte Bilddatei in der SQL Server-Tabelle speichern.<\/li>\n<li>Bilder auslesen und im Bild-Steuerelement anzeigen<\/li>\n<\/ul>\n<p>Der erste Punkt ist etwas komplizierter, als er aussieht. Wir k&ouml;nnen hier nicht einfach die Methoden nutzen, die das Anlegefeld uns bietet, sondern m&uuml;ssen direkt auf den SQL Server zugreifen. Wie das gelingt, schauen wir uns nun an. Danach schauen wir uns zwei Methoden an, um Bilder im Bild-Steuerelement anzuzeigen.<\/p>\n<h2>Verweis auf die ADODB-Bibliothek hinzuf&uuml;gen<\/h2>\n<p>Wir werden in diesem Beitrag auf die Methoden der ADODB-Bibliothek zugreifen. Diese bietet f&uuml;r unseren Anwendungsfall deutlich einfachere Methoden als die DAO-Bibliothek.<\/p>\n<p>Dazu &ouml;ffnen wir im VBA-Editor den <b>Verweise<\/b>-Dialog, in dem wir den Eintrag <b>Microsoft ActiveX Data Objects 6.1 Library <\/b>ausw&auml;hlen (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_011.png\" alt=\"Verweis auf die ADODB-Bibliothek\" width=\"499,5589\" height=\"393,8207\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Verweis auf die ADODB-Bibliothek<\/span><\/b><\/p>\n<p>In dem Zuge legen wir auch gleich noch einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>an, den wir sp&auml;ter f&uuml;r die Verwendung von Dateidialogen ben&ouml;tigen.<\/p>\n<h2>Zwei Methoden: Umweg &uuml;ber Datei oder direkter Weg<\/h2>\n<p>In den folgenden Abschnitten schauen wir uns zwei Varianten an, um ein Bild aus einem <b>varbinary(max)<\/b>-Feld einer SQL Server-Tabelle in einem Bild-Steuerelement anzuzeigen.<\/p>\n<p>Die erste speichert das Bild im Dateisystem und referenziert dieses dann mit dem Bild-Steuerelement.<\/p>\n<p>Die zweite liest das Bild aus dem <b>varbinary(max)<\/b>-Feld ein und weist es direkt dem Bild-Steuerelement zu.<\/p>\n<h2>Formular anlegen<\/h2>\n<p>Wir beginnen mit der Variante, mit der wir das Bild zun&auml;chst in der aktuellen Datenbank speichern. Dazu legen wir erst einmal das Formular <b>frmBildVarBinary_Temp <\/b>an. Diesem weisen wir die per ODBC verkn&uuml;pfte Tabelle <b>tblBilder <\/b>als Datensatzquelle zu.<\/p>\n<p>Wir f&uuml;gen die beiden Felder <b>BildID <\/b>und <b>Bezeichnung <\/b>aus dieser Tabelle ein und legen zus&auml;tzlich eine Schaltfl&auml;che und ein Bild-Steuerelement an (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_012.png\" alt=\"Entwurf des Formulars zur Anzeige von Dateien aus dem varbinary(max)-Feld\" width=\"499,5589\" height=\"414,6061\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Entwurf des Formulars zur Anzeige von Dateien aus dem varbinary(max)-Feld<\/span><\/b><\/p>\n<p>F&uuml;r das <b>Bild<\/b>-Steuerelement stellen wir die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf <b>Beide <\/b>ein. So wird das Steuerelement vergr&ouml;&szlig;ert, wenn wir das Formular vergr&ouml;&szlig;ern.<\/p>\n<h2>Hinzuf&uuml;gen eines Bildes<\/h2>\n<p>Zum Hinzuf&uuml;gen eines Bildes programmieren wir die Schaltfl&auml;che <b>cmdBildAuswaehlen<\/b> wie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBildAuswaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     strPfad = ChooseAttachment\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strPfad)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>IsNull(Me.BildID)<span style=\"color:blue;\"> Then<\/span>\r\n             strDateiname = <span style=\"color:blue;\">Mid<\/span>(strPfad, <span style=\"color:blue;\">InStrRev<\/span>(strPfad, \"\\\") + 1)\r\n             Me.Bezeichnung = strDateiname\r\n             Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         SpeichereBildInDatenbank strPfad, Me.BildID\r\n         BildInBildSteuerelement Me.BildID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Start der Auswahl und der Anzeige einer Bilddatei<\/span><\/b><\/p>\n<p>Diese Prozedur ruft zun&auml;chst die Funktion <b>ChooseAttachment <\/b>auf, die wie in Listing 2 aussieht und einen Dateidialog zur Auswahl der gew&uuml;nschten Bilddatei &ouml;ffnet.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ChooseAttachment()\r\n     <span style=\"color:blue;\">Dim <\/span>objFileDialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objFileDialog = Application.FileDialog(msoFileDialogFilePicker)\r\n     <span style=\"color:blue;\">With<\/span> objFileDialog\r\n         .Title = \"Datei ausw&auml;hlen\"\r\n         .ButtonName = \"Ausw&auml;hlen\"\r\n         .InitialFilename = CurrentProject.Path & \"\\\"\r\n         .Filters.Clear\r\n         .Filters.Add \"Alle Dateitypen\", \"*.*\"\r\n         .Filters.Add \"PNG-Datei\", \"*.png\"\r\n         <span style=\"color:blue;\">If <\/span>.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = .SelectedItems(1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ChooseAttachment = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Ausw&auml;hlen einer Bilddatei<\/span><\/b><\/p>\n<p>Das Ergebnis speichert die Prozedur <b>cmdBildAuswaehlen <\/b>in der Variablen <b>strPfad<\/b>. Dann pr&uuml;ft sie als Erstes, ob <b>strPfad <\/b>&uuml;berhaupt eine Datei enth&auml;lt. Dazu nutzen wir die <b>Dir<\/b>-Funktion und untersuchen damit <b>strPfad<\/b>.<\/p>\n<p><b>Dir <\/b>liefert in diesem Fall den Namen der Datei aus dem Pfad zur&uuml;ck und wenn dieser eine L&auml;nge gr&ouml;&szlig;er als <b>0 <\/b>hat, ist die Datei vorhanden.<\/p>\n<p>Dann pr&uuml;ft die Prozedur, ob <b>BildID <\/b>den Wert <b>Null <\/b>hat. Das ist nur der Fall, wenn es sich um einen neuen, leeren Datensatz handelt.<\/p>\n<p>In diesem Fall ermitteln wir den Namen der Bilddatei, tragen diesen in das Feld <b>Bezeichnung <\/b>ein und speichern den Datensatz, indem wir die Eigenschaft <b>Dirty <\/b>auf den Wert <b>False <\/b>einstellen.<\/p>\n<p>Wir erreichen damit, dass nun bereits ein Datensatz vorliegt und dass wir dessen Wert aus dem Feld <b>BildID <\/b>auslesen k&ouml;nnen.<\/p>\n<h2>Bild in Datenbank speichern<\/h2>\n<p>Dies nutzen wir nun aus, wenn wir die Prozedur <b>SpeichereBildInDatenbank <\/b>aufrufen. Diese erwartet zwei Parameter und wird weiter unten beschreiben:<\/p>\n<ul>\n<li><b>strPfad<\/b>: Pfad des einzulesenden Bildes<\/li>\n<li><b>lngBildID<\/b>: Den Prim&auml;rschl&uuml;sselwert des Datensatzes, in dessen Feld <b>Bild <\/b>die Datei gespeichert werden soll.<\/li>\n<\/ul>\n<p>Danach liegt uns ein Datensatz vor, der ein Bild im Feld <b>Bild<\/b> enth&auml;lt. Damit k&ouml;nnen wir schlie&szlig;lich die Prozedur <b>BildInBildSteuerelement <\/b>aufrufen, dem wir lediglich den Prim&auml;rschl&uuml;sselwert des betroffenen Datensatzes &uuml;bergeben. Diese sorgt daf&uuml;r, dass das Bild auf der Festplatte gespeichert und im Bild-Steuerelement angezeigt wird.<\/p>\n<p>Damit erhalten wir ein Ergebnis wie in Bild 13. F&uuml;r diese Darstellung haben wir die Eigenschaft <b>Gr&ouml;&szlig;enanpassung <\/b>&uuml;brigens auf <b>Zoomen <\/b>eingestellt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_013.png\" alt=\"Formular mit Bild aus dem SQL Server im Bild-Steuerelement\" width=\"574,559\" height=\"419,5023\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Formular mit Bild aus dem SQL Server im Bild-Steuerelement<\/span><\/b><\/p>\n<h2>Bild in der Datenbank speichern<\/h2>\n<p>Das Speichern des Bildes in der Datenbank &uuml;bernimmt die Prozedur <b>SpeichereBildInDatenbank<\/b> (siehe Listing 3). Diese Prozedur verwendet Elemente der ADODB-Bibliothek, um auf die SQL Server-Datenbank zuzugreifen. Voraussetzung hierf&uuml;r ist, dass eine geeignete Verbindungszeichenfolge vorhanden ist. Da wir diese noch an weiteren Stellen ben&ouml;tigen, speichern wir sie in einer Konstanten namens <b>cStrConnection<\/b>, und zwar im Standardmodul <b>mdlTools<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SpeichereBildInDatenbank(strDateiPfad<span style=\"color:blue;\"> As String<\/span>, lngBildID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cnn<span style=\"color:blue;\"> As <\/span>ADODB.Connection\r\n     <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>ADODB.Command\r\n     <span style=\"color:blue;\">Dim <\/span>objStream<span style=\"color:blue;\"> As <\/span>ADODB.Stream\r\n     <span style=\"color:blue;\">Dim <\/span>bytBild()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     '' Verbindung zur SQL Server-Datenbank herstellen\r\n     <span style=\"color:blue;\">Set<\/span> cnn = <span style=\"color:blue;\">New<\/span> ADODB.Connection\r\n     cnn.Open cStrConnection\r\n     '' Datei in ein Byte-Array laden\r\n     <span style=\"color:blue;\">Set<\/span> objStream = <span style=\"color:blue;\">New<\/span> ADODB.Stream\r\n     <span style=\"color:blue;\">With<\/span> objStream\r\n         .Type = adTypeBinary\r\n         .Open\r\n         .LoadFromFile strDateiPfad\r\n         bytBild = .Read\r\n         .Close\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objStream = Nothing\r\n     '' SQL-UPDATE zum Speichern der Datei in der Datenbank\r\n     strSQL = \"UPDATE tblBilder SET BildVarBinary = ? WHERE BildID = ?\"\r\n     '' SQL-Befehl vorbereiten und ausf&uuml;hren\r\n     <span style=\"color:blue;\">Set<\/span> cmd = <span style=\"color:blue;\">New<\/span> ADODB.Command\r\n     cmd.ActiveConnection = cnn\r\n     cmd.CommandText = strSQL\r\n     cmd.CommandType = adCmdText\r\n     cmd.Parameters.Append cmd.CreateParameter(\"BildDaten\", adVarBinary, adParamInput, <span style=\"color:blue;\">UBound<\/span>(bytBild) - _\r\n         <span style=\"color:blue;\">LBound<\/span>(bytBild) + 1, bytBild)\r\n     cmd.Parameters.Append cmd.CreateParameter(\"BildID\", adInteger, adParamInput, , lngBildID)\r\n     cmd.Execute\r\n     '' Objekte freigeben\r\n     cnn.Close\r\n     <span style=\"color:blue;\">Set<\/span> cmd = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> cnn = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Speichern eines Bildes in der SQL Server-Tabelle<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cStrConnection<span style=\"color:blue;\"> As String<\/span> = \"Provider=SQLOLEDB;Data Source=amvdesktop2023;Initial Catalog=Bilder;Integrated Security=SSPI;\"<\/pre>\n<p>Hier sind unser Server und unsere Datenbank namens Bilder angegeben, diese Daten m&uuml;ssen noch durch Ihre Daten ersetzt werden.<\/p>\n<p>Wie deklarieren in der Prozedur ein <b>Connection<\/b>&#8211; und ein <b>Command<\/b>-Objekt sowie ein <b>Stream<\/b>-Objekt aus der <b>ADODB<\/b>-Bibliothek.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir ein Byte-Array und eine String-Variable zum Speichern der SQL-Anweisung, mit der wir das Bild speichern.<\/p>\n<p>Die Prozedur erstellt ein neues <b>Connection<\/b>-Objekt und referenziert es mit der Variablen <b>cnn<\/b>. Es &ouml;ffnet eine Verbindung auf Basis der Verbindungszeichenfolge aus <b>cStrConnection<\/b>.<\/p>\n<p>Dann erstellt sie f&uuml;r die Variable <b>objStream <\/b>ein neues <b>Stream<\/b>-Objekt und stellt den Typ auf <b>adTypeBinary <\/b>ein. Dann &ouml;ffnet sie die Verbindung mit der <b>Open<\/b>-Methode und verwendet die <b>LoadFromFile<\/b>-Methode, um die mit <b>strDateiPfad <\/b>angegebene Bilddatei einzulesen.<\/p>\n<p>Das Ergebnis der <b>Read<\/b>-Funktion landet schlie&szlig;lich im <b>Byte<\/b>-Array <b>bytBild<\/b>, sodass die Verbindung wieder geschlossen und das Stream-Objekt geleert werden kann.<\/p>\n<p>Dann stellt die Prozedur die SQL-Anweisung zum Speichern der Bilddatei in der Variablen <b>strSQL <\/b>zusammen. Dabei verwenden wir zwei Fragezeichen als Platzhalter f&uuml;r das zu f&uuml;llende Feld <b>BildVarBinary <\/b>und f&uuml;r die Bedingung <b>BildID<\/b>.<\/p>\n<p>Nun wird das <b>Command<\/b>-Objekt in der Variablen <b>cmd <\/b>erstellt. Als Verbindung weisen wir die Variable <b>cnn <\/b>zu. Den <b>CommandText <\/b>beziehen wir aus der zuvor gef&uuml;llten Variablen <b>strSQL<\/b>. Den <b>CommandType <\/b>legen wir auf <b>acCmdText <\/b>fest.<\/p>\n<p>Schlie&szlig;lich hinterlegen wir zwei Parameter namens <b>BildDaten <\/b>und <b>BildID<\/b>. Der ersten <b>Append<\/b>-Anweisung der <b>Parameters<\/b>-Auflistung des <b>Command<\/b>-Objekts &uuml;bergeben wir das Ergebnis der <b>CreateParameter<\/b>-Methode des <b>Command<\/b>-Objekts. Diese erwartet die folgenden Einstellungen:<\/p>\n<ul>\n<li><b>Name<\/b>: Name f&uuml;r den Parameter<\/li>\n<li><b>Type<\/b>: Typ des Parameters<\/li>\n<li><b>Direction<\/b>: Input oder Output<\/li>\n<li><b>Size<\/b>: Gr&ouml;&szlig;e des Inhalts<\/li>\n<li><b>Value<\/b>: Wert des Parameters<\/li>\n<\/ul>\n<p>Beim ersten Parameter, mit dem wir den Inhalt f&uuml;r das Feld <b>BildVarBinary <\/b>&uuml;bergeben wollen, geben wir als Name <b>BildDaten<\/b>, als Typ <b>adVarBinary<\/b>, als Richtung <b>adParamInput<\/b>, als Gr&ouml;&szlig;e die Anzahl der Elemente des Byte-Arrays und als Inhalt den Wert der Variablen <b>bytBild<\/b>.<\/p>\n<p>F&uuml;r den Vergleichsparameter f&uuml;r das Feld <b>BildID <\/b>geben wir als Name <b>BildID<\/b>, als Typ <b>adInteger<\/b>, als Richtung ebenfalls <b>adParamInput<\/b>, keine Gr&ouml;&szlig;e und als Wert den mit dem Parameter <b>lngBildID <\/b>der Prozedur &uuml;bergebenen Prim&auml;rschl&uuml;sselwert des Datensatzes, der das Bild erhalten soll.<\/p>\n<p>Diese werden in dieser Reihenfolge den Fragezeichen-Platzhaltern (<b>?<\/b>) der SQL-Anweisung in <b>strSQL<\/b> zugewiesen.<\/p>\n<p>Schlie&szlig;lich f&uuml;hren wir das <b>Command<\/b>-Objekt mit der <b>Execute<\/b>-Methode aus.<\/p>\n<p>Zu guter Letzt schlie&szlig;en wir die Verbindung und leeren die Objektvariablen <b>cmd <\/b>und <b>cnn<\/b>.<\/p>\n<h2>Prozedur zum Hinzuf&uuml;gen eines Bildes testen<\/h2>\n<p>Ausgehend von einer leeren Tabelle <b>tblBilder <\/b>k&ouml;nnen wir durch das Anklicken der Schaltfl&auml;che <b>cmdBildAuswaehlen <\/b>des Formulars <b>frmBildVarBinary_Temp <\/b>den Dateiauswahl-Dialog &ouml;ffnen, mit diesem eine Bilddatei ausw&auml;hlen und die Datei im <b>varbinary(max)<\/b>-Feld speichern.<\/p>\n<p>In der Access-Tabellenverkn&uuml;pfung sieht das erst einmal recht spartanisch aus (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_014.png\" alt=\"Ein Bild im varbinary(max)-Feld in Access\" width=\"499,5589\" height=\"179,5455\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Ein Bild im varbinary(max)-Feld in Access<\/span><\/b><\/p>\n<p>Im SQL Server Management Studio wird uns immerhin ein etwas aussagekr&auml;ftigerer Text geboten (siehe Bild 15). Davon abgesehen ist es aber letztlich nur eine Menge an Bytes, die wir in das Feld gespeichert haben. Ob hier tats&auml;chlich das Bild gelandet ist und wie wir es weiterverwenden k&ouml;nnen, schauen wir uns in den n&auml;chsten Abschnitten an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_02\/pic_1538_015.png\" alt=\"Ein Bild im varbinary(max)-Feld im SQL Server Management Studio\" width=\"499,5589\" height=\"208,0615\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Ein Bild im varbinary(max)-Feld im SQL Server Management Studio<\/span><\/b><\/p>\n<h2>Bild aus varbinary(max)-Feld im Ordner speichern und anzeigen<\/h2>\n<p>Nun wollen wir das Bild aus dem <b>varbinary(max)<\/b>-Feld im Bild-Steuerelement anzeigen. Dazu w&auml;hlen wir im ersten Anlauf den Umweg &uuml;ber das Dateisystem.<\/p>\n<p>Das hei&szlig;t, wir speichern die Datei aus dem Tabellenfeld im Verzeichnis der Datenbankdatei und stellen die Eigenschaft <b>Picture <\/b>des Bild-Steuerelements auf diesen Pfad ein.<\/p>\n<p>Dazu rufen wir die Prozedur <b>BildInBildsteuerelement_Pfad<\/b> auf, der wir wiederum den Wert des Prim&auml;rschl&uuml;sselfeldes des aktuellen Datensatzes &uuml;bergeben.<\/p>\n<p>Die Prozedur aus Listing 4 deklariert ein <b>Recordset<\/b>&#8211; und ein <b>Connection<\/b>-Objekt f&uuml;r den Zugriff auf die Datenbanktabelle, ein Byte-Array, um das Bild einzulesen, den Pfad der tempor&auml;ren Bilddatei, ein <b>Stream<\/b>-Objekt und eine <b>String<\/b>-Variable f&uuml;r die SQL-Abfrage.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BildInBildsteuerelement_Pfad(lngBildID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>cnn<span style=\"color:blue;\"> As <\/span>ADODB.Connection\r\n     <span style=\"color:blue;\">Dim <\/span>bytBild()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTempDatei<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objStream<span style=\"color:blue;\"> As <\/span>ADODB.Stream\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     Me!pic.Picture = \"\" ''Sicherstellen, dass das Bildsteuerelement erst einmal leer ist\r\n     '' Verbindung zur SQL Server-Datenbank herstellen\r\n     <span style=\"color:blue;\">Set<\/span> cnn = <span style=\"color:blue;\">New<\/span> ADODB.Connection\r\n     cnn.Open cStrConnection\r\n     '' SQL-Abfrage f&uuml;r das gew&uuml;nschte Bild\r\n     strSQL = \"SELECT BildVarBinary FROM tblBilder WHERE BildID = \" & lngBildID\r\n     '' Daten abrufen\r\n     <span style=\"color:blue;\">Set<\/span> rst = <span style=\"color:blue;\">New<\/span> ADODB.Recordset\r\n     rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic\r\n     '' Pr&uuml;fen, ob Daten vorhanden sind und ob das Feld nicht NULL ist\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(rst!BildVarBinary)<span style=\"color:blue;\"> Then<\/span>\r\n             bytBild = rst.Fields(\"BildVarBinary\").Value '' Bin&auml;rdaten auslesen\r\n             '' Tempor&auml;re Datei im Windows-Temp-Ordner erstellen\r\n             strTempDatei = CurrentProject.Path & \"\\tempbild.jpg\"\r\n             '' Bin&auml;rdaten in Datei speichern\r\n             <span style=\"color:blue;\">Set<\/span> objStream = <span style=\"color:blue;\">New<\/span> ADODB.Stream\r\n             <span style=\"color:blue;\">With<\/span> objStream\r\n                 .Type = adTypeBinary\r\n                 .Open\r\n                 .Write bytBild\r\n                 .SaveToFile strTempDatei, adSaveCreateOverWrite\r\n                 .Close\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objStream = Nothing\r\n             '' Bild in Access anzeigen\r\n             Me!pic.Picture = strTempDatei\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Me.pic.Picture = \"\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.pic.Picture = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     '' Objekte freigeben\r\n     rst.Close: cnn.Close\r\n     <span style=\"color:blue;\">Set<\/span> rst = Nothing: <span style=\"color:blue;\">Set<\/span> cnn = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Anzeigen eines Bildes aus einem varbinary(max)-Feld &uuml;ber das Speichern im Dateisystem<\/span><\/b><\/p>\n<p>Da es auch sein kann, dass wir einen neuen, leeren Datensatz vorliegen haben oder einen, f&uuml;r den noch kein Bild gespeichert ist, stellen wir eingangs die Eigenschaft <b>Picture <\/b>f&uuml;r das Bild-Steuerelement namens <b>pic <\/b>auf eine leere Zeichenkette ein.<\/p>\n<p>Danach erstellen und &ouml;ffnen wir die Verbindung, wieder auf Basis der Verbindungszeichenfolge aus der Konstanten <b>cStrConnection<\/b>. Die SQL-Anweisung stellen wir diesmal direkt zusammen und ohne Verwendung von Parametern. Dazu f&uuml;gen wir als Vergleichswert des Kriteriums den Prim&auml;rschl&uuml;sselwert aus <b>lngBildID <\/b>hinzu.<\/p>\n<p>Damit ausgestattet, k&ouml;nnen wir nun ein neues Recordset erstellen und dieses mit der <b>Open<\/b>-Anweisung und der &Uuml;bergabe der SQL-Anweisung, der Verbindung und weiteren Informationen &ouml;ffnen.<\/p>\n<p>In einer <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen wir, ob das Recordset nicht leer ist. Sollte der Datensatz leer sein, was in der Regel nicht geschehen sollte, wird die Prozedur beendet und vorsichtshalber nochmals <b>Me.pic.Picture <\/b>auf eine leere Zeichenfolge eingestellt.<\/p>\n<p>Enth&auml;lt das Recordset jedoch einen Datensatz, pr&uuml;ft eine weitere <b>If&#8230;Then<\/b>-Bedingung, ob das Feld <b>BildVarBinary<\/b> gef&uuml;llt ist. Ist das der Fall, lesen wir dieses in die Variable f&uuml;r das Byte-Array namens <b>bytBild <\/b>ein.<\/p>\n<p>Dazu brauchen wir dieser lediglich die Eigenschaft <b>Value <\/b>dieses Feldes zuzuweisen.<\/p>\n<p>Danach stellen wir in <b>strTempDatei <\/b>den Pfad f&uuml;r die tempor&auml;re Datei f&uuml;r dieses Bild zusammen. Diese besteht aus dem Ordner, in dem sich auch die aktuelle Datenbank befindet, und den wir mit <b>CurrentProject.Path <\/b>ermitteln. Au&szlig;erdem f&uuml;gen wir noch den Dateinamen mit <b>\\tempbild.png <\/b>hinzu.<\/p>\n<p><b>Hinweis<\/b>: Wir gehen in diesem Beitrag davon aus, dass nur Bilder mit dem Datentyp <b>.png <\/b>gespeichert werden sollen. F&uuml;r andere Datentypen muss der Code entsprechend angepasst werden.<\/p>\n<p>Nun folgt der Auftritt des <b>Stream<\/b>-Objekts. Dieses erstellen wir mit dem Schl&uuml;sselwort <b>New <\/b>und weisen es der Variablen <b>objStream <\/b>zu.<\/p>\n<p>Dann stellen wir den Typ auf <b>adTypeBinary <\/b>ein, &ouml;ffnen es mit der <b>Open<\/b>-Methode, schreiben mit der <b>Write<\/b>-Methode den Inhalt der Variablen <b>bytBild <\/b>hinein und speichern die Datei mit der <b>SaveToFile<\/b>-Methode unter dem angegebenen Dateinamen. Dabei geben wir als zweiten Parameter die Konstante <b>adSaveCreateOverWrite <\/b>an und sorgen so daf&uuml;r, dass eine eventuell bereits vorhandene Datei gleichen Namens &uuml;berschrieben wird. Danach schlie&szlig;en wir das <b>Stream<\/b>-Objekt mit der <b>Close<\/b>-Methode.<\/p>\n<p>Der letzte Schritt besteht darin, der <b>Picture<\/b>-Eigenschaft des Bild-Steuerelements <b>pic<\/b> den Pfad zu der anzuzeigenden Datei zuzuweisen. Damit erhalten wir im Formular die Anzeige der gespeicherten Datei.<\/p>\n<h2>Bild aus varbinary(max)-Feld direkt im Bild-Steuerelement anzeigen<\/h2>\n<p>Nun w&auml;ren wir nicht Access im Unternehmen, wenn wir nicht noch eine etwas elegantere L&ouml;sung f&uuml;r diese Aufgabe h&auml;tten. Diese besteht darin, die Bilddatei ohne Umweg &uuml;ber das Dateisystem direkt im Bild-Steuerelement anzuzeigen.<\/p>\n<p>Wie das gelingt, sehen wir in der Prozedur in Listing 5. Die Prozedur ben&ouml;tigt eine <b>Recordset<\/b>&#8211; und eine <b>Connection<\/b>-Variable f&uuml;r den Zugriff auf die Datenbank. Au&szlig;erdem ben&ouml;tigen wir ein Byte-Array und eine <b>String<\/b>-Variable f&uuml;r die SQL-Abfrage.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BildInBildSteuerelement(lngBildID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>cnn<span style=\"color:blue;\"> As <\/span>ADODB.Connection\r\n     <span style=\"color:blue;\">Dim <\/span>bytBild()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     '' Stelle sicher, dass das Bildsteuerelement leer ist\r\n     Me!pic.PictureData = Null\r\n     '' Verbindung zur SQL Server-Datenbank herstellen\r\n     <span style=\"color:blue;\">Set<\/span> cnn = <span style=\"color:blue;\">New<\/span> ADODB.Connection\r\n     cnn.Open cStrConnection\r\n     '' SQL-Abfrage f&uuml;r das gew&uuml;nschte Bild\r\n     strSQL = \"SELECT BildVarBinary FROM tblBilder WHERE BildID = \" & lngBildID\r\n     \r\n     '' Daten abrufen\r\n     <span style=\"color:blue;\">Set<\/span> rst = <span style=\"color:blue;\">New<\/span> ADODB.Recordset\r\n     rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic\r\n     '' Pr&uuml;fen, ob Daten vorhanden sind\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(rst!BildVarBinary)<span style=\"color:blue;\"> Then<\/span>\r\n             bytBild = rst.Fields(\"BildVarBinary\").Value '' Bin&auml;rdaten auslesen\r\n             \r\n             '' Bin&auml;rdaten direkt in das Image-Steuerelement laden\r\n             Me!pic.PictureData = bytBild\r\n             \r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Me!pic.PictureData = Null '' Falls kein Bild vorhanden ist\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!pic.PictureData = Null\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     '' Objekte freigeben\r\n     rst.Close\r\n     cnn.Close\r\n     <span style=\"color:blue;\">Set<\/span> rst = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> cnn = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Prozedur zum Anzeigen eines Bildes aus einem varbinary(max)-Feld ohne Umweg &uuml;ber das Dateisystem<\/span><\/b><\/p>\n<p>In diesem Fall leeren wir das Bild-Steuerelement, indem wir seine Eigenschaft <b>PictureData <\/b>auf den Wert <b>Null <\/b>einstellen. Dann erstellen wir die Verbindung zur Datenbank und speichern diese in der Variablen <b>cnn<\/b>.<\/p>\n<p>In der Variablen <b>strSQL <\/b>hinterlegen wir die Abfrage, um das Bild aus dem Feld <b>BildVarBinary <\/b>auszulesen. Als Kriterium geben wir wieder den Prim&auml;rschl&uuml;sselwert des Datensatzes an, f&uuml;r den wir das Bild anzeigen wollen.<\/p>\n<p>Danach &ouml;ffnen wir das Recordset f&uuml;r diesen SQL-Ausdruck. In einer ersten <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen wir, ob das Recordset nicht leer ist. Enth&auml;lt dieses einen Datensatz, pr&uuml;fen wir, ob das Feld <b>BildVarBinary <\/b>den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p>Ist auch das nicht der Fall, k&ouml;nnen wir den Inhalt einlesen. Dazu weisen wir einfach dem Byte-Array namens <b>bytBild <\/b>den Inhalt des Feldes <b>BildVarBinary <\/b>zu. Den Inhalt des Byte-Arrays schreiben wir danach in die Eigenschaft <b>PictureData<\/b>.<\/p>\n<p>Danach erscheint das Bild, soweit eines vorhanden ist, automatisch wie im vorherigen Beispiel im Bild-Steuerelement.<\/p>\n<p>Mit dieser zweiten Methode umgehen wir noch einige potenzielle Probleme, die durch das Speichern des Bildes im Dateisystem entstehen k&ouml;nnen. Au&szlig;erdem d&uuml;rfte diese Methode, auch wenn man es bei kleineren Bilddateien kaum merken d&uuml;rfte, performanter sein als die mit dem Umweg &uuml;ber das Dateisystem.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Wenn man die Tabellen seiner Access-Anwendung zum SQL Server migriert, kann man die meisten Tabellen und die enthaltenen Felder mit mehr oder weniger vorbereitenden Schritten oder nachtr&auml;glichen Anpassungen mit dem SQL Server Migration Assistant zum SQL Server &uuml;bertragen. Bei Bildern, die beispielsweise im Anlage-Feld einer Access-Tabelle gespeichert sind, haben wir jedoch nicht nur das Problem, dass die Daten gar nicht erst migriert werden. Wir haben auch keine M&ouml;glichkeit, genau wie zuvor die Bilder direkt im Bild-Steuerelement anzuzeigen.<\/p>\n<p>In diesem Beitrag haben wir deshalb gleich zwei Techniken vorgestellt, die in diesem Zusammenhang wichtig sind:<\/p>\n<ul>\n<li>Wir haben gezeigt, wie man ein Bild aus dem Dateisystem in das <b>varbinary(max)<\/b>-Feld einer SQL Server-Tabelle speichert.<\/li>\n<li>Wir haben zwei Methoden vorgestellt, mit denen man die Bilder aus dem <b>varbinary(max)<\/b>-Feld in einem Bild-Steuerelement in der Access-Datenbank anzeigen kann, die mit dieser Tabelle verkn&uuml;pft ist.<\/li>\n<\/ul>\n<p>Damit ist die Arbeit jedoch noch nicht getan. Immerhin haben wir hier erst einmal nur gezeigt, wie eine Bilddatei aus dem Dateisystem in einem varbinary(max)-Feld landet.<\/p>\n<p>Wenn wir jedoch die Daten aus einer Tabelle mit einem Anlagefeld in eine SQL Server-Tabelle &uuml;bertragen wollen, sind dazu noch weitere Schritte n&ouml;tig.<\/p>\n<p>Die erste Frage ist: K&ouml;nnen wir &uuml;berhaupt aus einem Migrationsprozess, der gegebenenfalls &uuml;ber den SQL Server Migration Assistant gesteuert wird, eine Tabelle herausnehmen, die wir komplett selbst migrieren?<\/p>\n<p>In der Regel wird dies nicht gut funktionieren, weil man &uuml;ber die Migration mit dem Migrationsassistenten bereits die Tabelle inklusive aller Beziehungen und weiterer Informationen in einem Rutsch &uuml;bertragen m&ouml;chte.<\/p>\n<p>Da ist es unpraktisch, wenn man eine Tabelle herausnimmt und sich zus&auml;tzlich auch noch um das Herstellen der ganzen Beziehungen k&uuml;mmern muss, die mit dieser Tabelle zusammenh&auml;ngen.<\/p>\n<p>Wir w&uuml;rden also eher eine Vorgehensweise vorschlagen, bei der wir die Tabelle zun&auml;chst ganz einfach mit den &uuml;brigen Tabellen per SQL Server Migration Assistant migrieren und das Anlage-Feld einfach als <b>varchar(8000) <\/b>&uuml;bertragen, wie vom SSMA vorgeschlagen.<\/p>\n<p>Danach k&ouml;nnen wir uns um das Anlage-Feld k&uuml;mmern und die Inhalte Datensatz f&uuml;r Datensatz &uuml;bertragen.<\/p>\n<p>Gegebenenfalls ist hier auch noch zus&auml;tzlicher Aufwand zu erwarten. Dieser tritt auf, wenn das Anlage-Feld nicht nur ein Bild je Datensatz speichert, sondern der Entwickler vorgesehen hat, dass mehrere Bilder zu jedem Datensatz hinterlegt werden k&ouml;nnen.<\/p>\n<p>In diesem Fall w&uuml;rde man eine weitere Tabelle hinterlegen, in der die Anlagen zu den verschiedenen Datens&auml;tzen gespeichert werden und die &uuml;ber ein Fremdschl&uuml;sselfeld mit dem Hauptdatensatz verkn&uuml;pft sind.<\/p>\n<p>Die zum Migrieren eines Anlage-Feldes in ein <b>varbinary(max)<\/b>-Feld n&ouml;tigen Schritte erl&auml;utern wir im Beitrag <b>Anlagefeld zum SQL Server migrieren <\/b>(<b>www.access-im-unternehmen.de\/1542<\/b>) in der folgenden Ausgabe.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BilderImSQLServer.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/9B340E00-F53E-43C6-B239-14041F6F7A94\/aiu_1538.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie man Bilder in Access speichert, ist seit der Version 2010 eindeutig vorgegeben &#8211; n&auml;mlich in Anlagefeldern. Die Inhalte dieser Felder k&ouml;nnen auch leicht im Bild-Steuerelement angezeigt werden, dazu braucht man nur eine einfache Bindung an das entsprechende Feld. Allerdings bietet der SQL Server keinen solchen Datentyp, sondern nur verschiedene Alternativen. Dabei handelt es sich beispielsweise um den Datentyp VarBinary(max) oder um FILESTREAM. Die erstgenannte Alternative schauen wir uns im vorliegenden Beitrag an.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022025,662025,44000022],"tags":[],"class_list":["post-55001538","post","type-post","status-publish","format-standard","hentry","category-66022025","category-662025","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bilder im SQL Server mit varbinary(max) - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bilder im SQL Server mit varbinary(max)\" \/>\n<meta property=\"og:description\" content=\"Wie man Bilder in Access speichert, ist seit der Version 2010 eindeutig vorgegeben - n&auml;mlich in Anlagefeldern. Die Inhalte dieser Felder k&ouml;nnen auch leicht im Bild-Steuerelement angezeigt werden, dazu braucht man nur eine einfache Bindung an das entsprechende Feld. Allerdings bietet der SQL Server keinen solchen Datentyp, sondern nur verschiedene Alternativen. Dabei handelt es sich beispielsweise um den Datentyp VarBinary(max) oder um FILESTREAM. Die erstgenannte Alternative schauen wir uns im vorliegenden Beitrag an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-05T17:22:27+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Bilder im SQL Server mit varbinary(max)\",\"datePublished\":\"2025-03-05T17:22:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/\"},\"wordCount\":3793,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5e2b2080479f43f5a4bfad20971437ac\",\"articleSection\":[\"2\\\/2025\",\"2025\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/\",\"name\":\"Bilder im SQL Server mit varbinary(max) - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5e2b2080479f43f5a4bfad20971437ac\",\"datePublished\":\"2025-03-05T17:22:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5e2b2080479f43f5a4bfad20971437ac\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/5e2b2080479f43f5a4bfad20971437ac\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bilder_im_SQL_Server_mit_varbinarymax\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bilder im SQL Server mit varbinary(max)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bilder im SQL Server mit varbinary(max) - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/","og_locale":"de_DE","og_type":"article","og_title":"Bilder im SQL Server mit varbinary(max)","og_description":"Wie man Bilder in Access speichert, ist seit der Version 2010 eindeutig vorgegeben - n&auml;mlich in Anlagefeldern. Die Inhalte dieser Felder k&ouml;nnen auch leicht im Bild-Steuerelement angezeigt werden, dazu braucht man nur eine einfache Bindung an das entsprechende Feld. Allerdings bietet der SQL Server keinen solchen Datentyp, sondern nur verschiedene Alternativen. Dabei handelt es sich beispielsweise um den Datentyp VarBinary(max) oder um FILESTREAM. Die erstgenannte Alternative schauen wir uns im vorliegenden Beitrag an.","og_url":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-03-05T17:22:27+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Bilder im SQL Server mit varbinary(max)","datePublished":"2025-03-05T17:22:27+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/"},"wordCount":3793,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/5e2b2080479f43f5a4bfad20971437ac","articleSection":["2\/2025","2025","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/","url":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/","name":"Bilder im SQL Server mit varbinary(max) - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/5e2b2080479f43f5a4bfad20971437ac","datePublished":"2025-03-05T17:22:27+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/5e2b2080479f43f5a4bfad20971437ac","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/5e2b2080479f43f5a4bfad20971437ac"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Bilder_im_SQL_Server_mit_varbinarymax\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Bilder im SQL Server mit varbinary(max)"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001538"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001538\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}