java - jdbc 在 sql server 2008 r2 中存储的 png 图像给出的数据不完整

标签 java jdbc sql-server-2008-r2

我想将 Base64 图像保存到我的 SQL Server 2008 R2,我使用了这个:

Connection con = Database.getConnection();
CallableStatement callableStatement = null;

try
{
    callableStatement = con.prepareCall("{call insertRestaurantFoodImage2(?,?)}");
    callableStatement.setInt(1, ID);
    
    callableStatement.setString(2, stringImage);
    callableStatement.executeUpdate();
} 
catch (SQLException e) 
{
    e.printStackTrace();
}

保存字符串的存储过程是:

ALTER PROCEDURE dbo.insertRestaurantFoodImage2
    (@restaurantFoodID INT,
     @image VARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON

    UPDATE Food_Restaurant
    SET [image] = @image
    WHERE ID = @restaurantFoodID
END

检索数据如下:

Connection con = Database.getConnection();
CallableStatement callableStatement = null;

try 
{
    callableStatement = con.prepareCall("{call getRestaurantFoodImage2(?,?)}");
    callableStatement.setInt(1, getID());
    callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
    callableStatement.execute();

    image = callableStatement.getString(2);
} 
catch (SQLException e) 
{
    e.printStackTrace();
}

获取图像的存储过程是:

ALTER PROCEDURE dbo.insertRestaurantFoodImage2
    (@restaurantFoodID INT,
     @image VARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON

    UPDATE Food_Restaurant
    SET [image] = @image
    WHERE ID = @restaurantFoodID
END

当我在插入字符串之前和检索字符串之后检查字符串时,结果不相等,检索到的图像大约有前 500 个(更少或更多)字符。

请问我做错了什么?

我知道你会告诉我,尝试使用 varbinary 而不是 varchar,所以请看这个问题,我尝试过但遇到了问题 encode and decode base64 excpetion storing to sql server 2008 r2

请帮忙

最佳答案

正如我所评论的,旧版本的 SQL Server 对于 varbinaryvarchar 的大小限制为 8kb。该驱动程序根本不支持 getBytesgetString,或者您可能正在使用较旧的 JDBC 驱动程序。另一种可能性是您需要将 OUT 参数注册为 java.sql.types.LONGVARBINARY(或 LONGVARCHAR)。

无论如何(也在另一个问题中),我想知道为什么您在存储数据之前首先使用 Base64 进行编码。只需将原始字节存储在 VARBINARY 中即可。

关于java - jdbc 在 sql server 2008 r2 中存储的 png 图像给出的数据不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16981631/

相关文章:

SQL 2008 FILESTREAM - 如何在更改数据库之前检查数据库是否已启用文件流

SQL - 动态 SQL 查询将用分号 (;) 分隔的单列字符串转换为多列

sql - 插入具有来自另一行的值的行,除了一个?

java - 如何在方法抛出 Checked-Exception 时使用 Suppliers.memoize

java - 如何修复 java.util.NoSuchElementException 错误

java - 带有 MS Access 的 JDBC 中的 "architecture mismatch between the Driver and Application"

Java + MySQL - 语法错误但语句正确

mysql - 使用 mysql 5.5 (mariadb) : Failed to start SonarQube 在 Centos 7 上设置 SonarQube

java - 关于相同/不同对象上的 java 线程的混淆

Java 周末计算器 API/库