adodbapi varbinary(max) >8000

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hallöchen,

ich versuche mich gerade an einer kleinen Anwendung, die mir helfen soll, meine Musik zu organisieren. Dazu möchte ich Thumbnails in einer Datenbank (MS SQL Server 2008 R2) speichern.
Der Test-Code dafür sieht wie folgt aus:

Code: Alles auswählen

import adodbapi
import hashlib

conn_string = '''Driver={SQL Server Native Client 10.0};
                   Server=DBSMusic;
                   Database=CoverThumbs;
                   Trusted_Connection=yes;
                '''
conn = adodbapi.connect(conn_string)
curs = conn.cursor()

file_path = r"C:\Dump\thumb_001.png"

with open(file_path, "rb") as _f_:
        m = hashlib.md5()
        img_data = _f_.read()
        m.update(img_data)
        the_hash = m.hexdigest()

        thumb = adodbapi.Binary(img_data)
        curs.execute("INSERT INTO thumbnails (hash, image_data) VALUES(?, ?)",
            [the_hash, thumb])
hash ist in der DB vom Type varchar(50) und image_data vom Typ varbinary(max).

Wenn ich obigen Code nun mit einem Bild versuche, welches < 8Kb ist, funktioniert es, bei Bildgrößen jenseits der 8Kb nicht mehr.
Ich bekomme dann folgenden Fehler:

Code: Alles auswählen

adodbapi.adodbapi.DatabaseError: (-2147352567, 'Exception occurred.', (0, u'Microsoft OLE DB Provider for ODBC Drivers', u'[Microsoft][SQL Server Native Client 10.0]String data, right truncation', None, 0, -2147217833), None)
Kann mich bitte jemand in die richtige Richtung schubsen? Was mache ich falsch oder was fehlt denn, damit ich wirklich die 2GB eines varbinary(max) Feldes nutzen kann?
Vielleicht kann da jemand helfen. :)

Danke im Voraus, beste Grüße
~Mad
Zuletzt geändert von Madmartigan am Montag 22. Juli 2013, 07:24, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Madmartigan: Cooler Nickname :-)

@Frage: Hm... bist Du sicher, dass die Feldgröße 8KB wirklich überschreiten darf? Der MS SQL Server unterscheidet ja zwischen der Express- und Professional-Edition. Ich weiß jetzt nicht aus dem Kopf, ob das auch interne Datentypen betrifft oder "nur" die Infrastruktur (single core, 1GB RAM usw). Evtl. könntest Du da mal recherchieren.

Kurze Nachfrage noch: Muss es dieses RDBMS sein? Ich muss beruflich damit arbeiten und finde nichts daran wirklich so besonders, als dass ich den MS SQL Server wirklich toll fände... insbesondere weil man in der kostenlosen Version eben zig Beschränkungen unterliegt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

@Madmartigan: Cooler Nickname :-)
Dachte ich mir auch ^^


Danke für den Hinweis, habe gleich mal nachgeschaut. Laut den Angaben hier bin ich in der Feldgröße nicht limitiert, nur in der Gesamtgröße der DB sind 10Gb die obere Grenze (plus ein paar andere, für mich irrelevante Einschränkungen).
Im Prinzip würden 8Kb auch völlig ausreichen, wenn ich nur die Thumbnails speichern will. Meine Idee war es aber, eventuell auch Booklets (als Flipbook) zu speichern.

Ich hatte erste Versuche über pyodbc gestartet und hab damit auch wirklich große Testbilder in der DB ablegen können. Allerdings sagt mir pyodbc vom Syntax her nicht wirklich zu, Stored Procedures und die Parameterübergaben sind mir schlicht zu unübersichtlich. Daher wollte ich gern adodbapi probieren. Ich bin da aber auch nicht wirklich festgelegt. MS SQL kenne ich halt noch aus meinem Job, zumindest kann ich da noch mit einigen spärlichen Kenntnissen aufwarten, mit anderen DBMS habe ich keinerlei Erfahrung.
Vielleicht schaue ich mir doch erstmal Alternativen an. :)

Besten Dank und viele Grüße
~Mad
Antworten