将图像插入 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 检索图像。数据类型:图片

检索 ODBC 表并插入 SQL Server CE 数据库

使用 SQL Server 后端将图片插入到 Access 表中