Java jdbc在sql server 2008 r2上存储的png图像提供了不完整的数据

Java jdbc在sql server 2008 r2上存储的png图像提供了不完整的数据,java,jdbc,sql-server-2008-r2,Java,Jdbc,Sql Server 2008 R2,我想将base64映像保存到我的SQL Server 2008 R2,我使用了以下方法: Connection con = Database.getConnection(); CallableStatement callableStatement = null; try { callableStatement = con.prepareCall("{call insertRestaurantFoodImage2(?,?)}"); callableStatem

我想将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,所以请看这个问题,我试过了,但遇到了问题


请提供帮助

,因为我还评论了较旧版本的SQL Server对
varbinary
varchar
的限制为8kb。要么驱动程序根本不支持更长的
getBytes
getString
,要么您可能正在使用旧的JDBC驱动程序。另一种可能是,您需要将OUT参数注册为
java.sql.types.LONGVARBINARY
(或
LONGVARCHAR


在任何情况下(也在另一个问题中),我想知道为什么在存储数据之前首先使用base64编码。只需将原始字节存储在
VARBINARY

中,图像不是字符串数据,请使用
VARBINARY
代替。正如我在问题中告诉你的那样,我遇到了这个问题,检索到的数据长度为8000,发送的数据长度为22270。另一个问题是,您对imagedata也使用了
String
,这对我来说没有意义。问题还可能与
VARBINARY
的8000限制有关。您可能需要使用其中一种流方法来获取值,请参见预览任务中的@MarkRotterVeel yes我看到我返回的字符串不是base64,即使在使用appache Decode和encode时,结果仍然相同,您是说varbinarry只使用8000吗?