Seite 1 von 1
InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Montag 23. Januar 2017, 17:27
von rolapp
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
Re: InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Montag 23. Januar 2017, 18:54
von 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.
Re: InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Montag 23. Januar 2017, 21:08
von rolapp
Danke für den Tipp, da weis schon mal wo ich ansetzten muss
Re: InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Mittwoch 25. Januar 2017, 14:08
von rolapp
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.
Re: InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Mittwoch 25. Januar 2017, 14:13
von 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.
Re: InterfaceError: Error binding parameter 0 - probably unsupported type.
Verfasst: Mittwoch 25. Januar 2017, 14:18
von rolapp
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