将图像插入 sql server 并检索它
Posted
技术标签:
【中文标题】将图像插入 sql server 并检索它【英文标题】:Insert images into sql server and retrieve it 【发布时间】:2020-10-09 00:44:12 【问题描述】:我想在我的 SQL 服务器中添加一些图像。我的问题是来自插入还是获取图像代码?
现在我检索图像的图像视图是空白的。
这是我插入图片的代码:
else
DatabaseHelper mDatabaseHelper = new DatabaseHelper(MainActivity.this);
Cursor cursor2 = mDatabaseHelper.GetPath();
while (cursor2.moveToNext())
Bitmap bitmap = BitmapFactory.decodeFile(cursor2.getString(0));
ByteArrayOutputStream blob = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 /* Ignored for PNGs */ , blob);
byte[] bitmapdata = blob.toByteArray();
String id = getIntent().getStringExtra("id");
String query = "INSERT INTO StoresData VALUES('" + arabic + "','" + english + "','1','1','1','1','1','','" + lat + "','" + longi + "','" + mob + "','','','','','','','','0','','','','" + bitmapdata + "','" + user + "','" + passwords + "','0',NULL,'" + id + "')";
Statement stmt = con.createStatement();
stmt.executeUpdate(query);
Cursor cursor = mDatabaseHelper.DeleteDataOfTableImagesAr();
while (cursor.moveToNext())
Toast.makeText(MainActivity.this, "Deleted images", Toast.LENGTH_LONG).show();
取回图片:
Blob blob = parkingList.get(position).getStoreicon();
if (blob != null)
byte[] byteArray = new byte[0];
try
int length = (int) blob.length();
byteArray = blob.getBytes(1, length);
catch (SQLException e)
e.printStackTrace();
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
intent.putExtra("storeicon", bm);
else
是的,我正在将图像放入列表视图中。
检索和获取图像是在两个不同的应用程序中完成的,这就是我没有使用 SQLite 的原因。
【问题讨论】:
我认为你可以通过使用调试器来解决这个问题。在这一行设置断点 "byteArray = blob.getBytes(1, length);"并确保您在代码中达到了这一点。当您到达那里时,请确保长度变量不为 0。如果您没有到达那一点,那么 blob 很可能为空,您需要调试代码的“插入”部分。 @JoshMaag 长度工作正常我在行后设置了一个 system.out.println 并且它正在打印并且工作正常。 @JoshMaag 有什么想法吗?非常感谢您的帮助! 我想接下来我会尝试查看输入中的第一个和最后 5-10 个字节的 bitmapdata 和检索部分中的 byteArray,并确保它们匹配。如果他们不这样做,那么它可能是保存在数据库中的方式存在问题。如果它们确实匹配,那么它可能与位图工厂段或分配它有关。如果是这种情况,请检查“bm”是否为空。位图工厂的文档说返回是:“解码的位图,如果图像数据无法解码,则返回 null”(强调我的)。 @JoshMaag 我检查了它是否为空,你在哪里是对的。那么接下来我该怎么办? 【参考方案1】:我无法添加评论(声誉太低),但我认为
int length = (int) blob.length();
byteArray = blob.getBytes(1, length);
lenght 可以,正如您所说,.getBytes 从 1 开始到 lenght 并将其存储在数组中... 但是:
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length)
不应该
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length - 1)
? 长度从 1 开始,数组从 0 开始。
【讨论】:
1.非常感谢您的贡献和诚实! 2.我认为这不是问题,因为我刚刚尝试过它仍然无法正常工作。但我有一种强烈的感觉,插入图像的代码是问题所在,因为我尝试了在另一个应用程序中获取图片的完全相同的代码,它工作得非常好,但我是从桌面应用程序插入图像。所以也许是代码插入是问题吗?! 好的,我可以在这里发表评论 :) 我正在查看插入:您使用 " 表示位图数据,但它不是字符串,可能有问题吗? 你的意思是查询字符串中的“如果是的话那么这里的”不是用来表示它是一个字符串,它是用来停止字符串。我的意思是它是另一个的最后一个分号一开始是一个 另一件事,我从 uri 插入图像,然后将其转换为位图,然后转换为 blob 或 byteArray 对不起,如果我坚持...但在 SQL Server '" + bitmapdata + "' 这是一个字符串。关于uri,要检查之前的步骤(图像的下载和位图的转换),我会将func复制到另一个项目中,而不是在blob中转换它,而是在图像视图中显示它,以确保问题出在 blob 中,而不是其他地方...以上是关于将图像插入 sql server 并检索它的主要内容,如果未能解决你的问题,请参考以下文章
仅使用 SQL 将图片插入 SQL Server 2005 图像字段
为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?
SQL Server Compact 4.0 图像列被截断为 8000
拉拉维尔。从 SQL SERVER 检索图像。数据类型:图片