InterfaceError: Error binding parameter 0 - probably unsupported type.

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
rolapp
User
Beiträge: 4
Registriert: Montag 23. Januar 2017, 15:58

Ich programmiere ein Plugin für das Mediencenter Kodi.

ich habe eine Routine die mir alle 5 Minuten die Datenbank überprüft und Updates einspielt. das funktioniert auch so weit ganz gut.
Frage ich jetzt mit einer anderen Funktion die Datenbank ab funktioniert das auch.
Ist aber meiner Routine wieder an der Reihe kommt folgender Fehler.

Code: Alles auswählen

   c.execute('SELECT * FROM programs WHERE channel in (' + channelKeys + ') AND start_date < ? AND end_date > ?', [endTime, startTime])
 InterfaceError: Error binding parameter 0 - probably unsupported type..
Was mich jetzt wundert und wo ich auch keine Lösung finde ist die Tatsache das die Datenbankabfrage mehrfach hintereinander funktioniert bis die Datenbank von einer anderen Funktion aufgerufen wird. Die andere Funktion kann ich mehrfach ohne Fehler aufrufen.

Ich stehe hier komplett auf dem Schlauch

Gruß
Steffen
Zuletzt geändert von Anonymous am Montag 23. Januar 2017, 18:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@rolapp: Was nicht wirklich gut ist, ist das `channelKeys` offenbar Werte als Zeichenkette in eine SQL-Anfrage einsetzt, das sollte man nicht machen. Dafür sollte man Platzhalter im SQL verwenden und die Werte dann als zweites Argument von `execute()` übergeben. Wenn die Anzahl variabel ist, muss man die Anzahl der Platzhalter und Werte auch variabel gestalten.

Ansonsten kann man da jetzt nicht wirklich etwas zum Problem sagen, weil hier keiner weiss wie denn nun die Werte aussehen die Du da übergibst, und welchen globalen Zustand Du eventuell in Deinem Programm hast, der dann von der anderen Funktion verändert wird.

Lass Dir doch mal die Werte ausgeben die Du bei der Abfrage verwendest, und gegebenenfalls auch deren Typen.
rolapp
User
Beiträge: 4
Registriert: Montag 23. Januar 2017, 15:58

Danke für den Tipp, da weis schon mal wo ich ansetzten muss
rolapp
User
Beiträge: 4
Registriert: Montag 23. Januar 2017, 15:58

BlackJack hat geschrieben:@rolapp: Was nicht wirklich gut ist, ist das `channelKeys` offenbar Werte als Zeichenkette in eine SQL-Anfrage einsetzt, das sollte man nicht machen. Dafür sollte man Platzhalter im SQL verwenden und die Werte dann als zweites Argument von `execute()` übergeben. Wenn die Anzahl variabel ist, muss man die Anzahl der Platzhalter und Werte auch variabel gestalten.
Ich habe erst einmal deinen Rat angenommen und habe die Abfrage umgebaut, habe da IN (Stringliste) über eine Schleife gelöst. Musste natürlich das komplette Script umbauen. Soweit hat als alles funktioniert. Der berühmte Fehler kam wieder allerdings mit Parameter 1.

Das Rätsels Lösung war eigentlich wie immer ganz einfach. Das eine Script starte ich mit import DB hier stehen die ganzen Datenbank abfragen drin.
Dann läuft eine Schleife die alle 5min die Datenbank abfragt. soweit so gut läuft das. Rufe ich die Datenbank mit dem anderen Script ab ist mein DB connector in der Schleife kaputt, weil der import außerhalb liegt. Wenn man es dann weis ist der Fehler auch logisch der DB Cursor zeigt irgendwohin.

Danke für den Ansatz zur Fehlersuche.
BlackJack

@rolapp: Das klingt irgendwie kaputt. Wie können denn zwei verschiedene Funktionen etwas mit dem selben Cursor-Objekt machen? Das ist doch hoffentlich ein lokaler Name in einer Funktion und keine global verfügbare Variable, dann auch noch mit dem Namen `c`? Der Name wäre als lokaler Name auch schon keine gute Wahl.
rolapp
User
Beiträge: 4
Registriert: Montag 23. Januar 2017, 15:58

der ist local nur in der Funktion. Ich entwickele das script auch nur weite weil der Ursprüngliche Entwickler sich zurückgezogen hat. Mit dem c gebe ich dir recht ein eindeutiger Variablenname ist immer besser.

Danke für den Tipp
Antworten