问题描述
我正在为我的毕业论文编写应用程序,而我的合作伙伴有一个外部 Mariadb。我可以轻松地在 mariadb 上获取和设置数据,但是每当我们尝试上传图片时,都会遇到以下问题,我不知道是怎么回事。
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)
对于将所选图片转换为位图,byteArrays & co。我有这些行:
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)
setData.setValues(p_name,p_notification,p_unit,p_picture)
在没有图片的情况下工作(在这种情况下 p_picture 为空)一切正常,数据库现在有一个实体。但是,如果对选定的图片尝试相同的操作,我会在“查询”行中收到以下错误:
2021-02-10 17:11:13.899 5974-5974/com.example.dbtesting E/Error 1: (conn=149) 您的 sql 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 'nFS9W5McSY8lBsBvccmsItlfr82Y1mTSrKRfs0/6/09jspHZfN0kqzIzLu4OYB9ORJBTD23N7mJk
附近使用的正确语法我已经查看了关于 SOF 的其他问题,但没有人想要同样的事情,他们总是用 PHP 来做,而我们与外部数据库有“直接”连接。
Sideinformation:数据库中图片的数据类型是BLOP。
所以我的问题很简单,我该怎么做,语法是正确的。也许其他数据类型?也许以不同的方式做?但老实说,我们不会使用 PHP,因为除了这个额外的小功能外,它可以正常工作。
提前致谢!
解决方法
解决方案是使用preparedStatements,像我在我的问题中使用的那样简单的SQL注入,你不会成功。通过使用preparedStatements,现在可以使用setBinaryStream 和getBinaryStream 等函数,并且可以/将用于从外部数据库上传/下载BLOB。我希望有些人在阅读我的答案时会顿悟。 @danblack 的评论对我帮助很大,因为我专注于 PrepareStatements 并找到了一些有用的信息。