J'écris une application pour ma thèse de diplôme et mon partenaire a un Mariadb externe. Je peux facilement obtenir et définir des données sur le mariadb, mais chaque fois que nous essayons de télécharger une image, nous rencontrons le problème suivant, que je ne sais pas comment.

Dans ma classe SetData Kotlin, j'ai le code suivant:

val query =
                "INSERT INTO Profiles (p_name, notification, unit, p_picture) VALUES ('$nam', $noti, $uni, $pic)"
            val stmt: Statement = connect!!.createStatement()
            val rs: ResultSet = stmt.executeQuery(query)

Pour la conversion de l'image choisie en bitmaps, byteArrays & co. J'ai ces lignes:

bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, imageUri)

var bos = ByteArrayOutputStream()
    bitmap!!.compress(Bitmap.CompressFormat.PNG, 100, bos)
    val bArray = bos.toByteArray()
    var p_picture: String = Base64.encodeToString(bArray, Base64.DEFAULT)

Et puis en invoquant ma fonction où je transporte les paramètres de la "requête" déjà mentionnée:

setData.setValues(p_name, p_notification, p_unit, p_picture)

Lorsque vous travaillez sans image (dans ce cas, p_picture est nul) tout fonctionne correctement et la base de données a une entité now. Mais si vous essayez la même chose avec une image choisie, j'obtiens l'erreur suivante dans la ligne "requête":

2021-02-10 17: 11: 13.899 5974-5974 / com.example.dbtesting E / Erreur 1: (conn = 149) Vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MariaDB pour la bonne syntaxe à utiliser près de 'nFS9W5McSY8lBsBvccmsItlfr82Y1mTSrKRfs0 / 6 / 09jspHZfN0kqzIzLu4OYB9ORJBTD23N7mJk

J'ai déjà passé en revue d'autres questions sur SOF, mais personne ne voulait la même chose, ils l'ont toujours fait avec PHP, alors que nous avons une connexion "directe" à la base de données externe.

Sideinformation: Le type de données de l'image dans la base de données est un BLOP.

Mon problème est donc simplement, que dois-je faire, que la syntaxe est correcte. Peut-être un autre type de données? Peut-être le faire différemment? Mais pour être honnête, nous n'utiliserons pas PHP, car il fonctionne tout sauf cette petite fonctionnalité supplémentaire.

Merci d'avance!

0
Halilaj.exe 10 févr. 2021 à 19:21

1 réponse

Meilleure réponse

La solution est d'utiliser prepareStatements, avec simplement des injections SQL comme celle que j'ai utilisée dans ma question, vous ne réussirez pas. En utilisant prepareStatements, des fonctions telles que setBinaryStream et getBinaryStream sont désormais possibles et peuvent / seront utilisées pour charger / télécharger des BLOB à partir de bases de données externes. J'espère que certaines personnes auront une révélation en lisant ma réponse. Le commentaire de @danblack m'a beaucoup aidé, car je me suis concentré sur les déclarations préparées et j'ai trouvé des informations utiles.

0
Halilaj.exe 8 mars 2021 à 12:01