Java jdbc在sql server 2008 r2上存储的png图像提供了不完整的数据
我想将base64映像保存到我的SQL Server 2008 R2,我使用了以下方法: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
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吗?