0

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 文字 (以下またはそれ以上) が含まれています。

私は何を間違っていますか?

varchar の代わりに varbinary を使用してみてください。この質問を見てください。SQL Server 2008 r2 に格納されている base64 例外をエンコードおよびデコードしようとしましたが、問題がありました。

助けてください

4

1 に答える 1

1

コメントしたように、古いバージョンの SQL Server にはvarbinaryvarchar. getBytesドライバーがまたはをサポートしていないかgetString、古い JDBC ドライバーを使用している可能性があります。java.sql.types.LONGVARBINARY別の可能性として、OUT パラメータを(または)として登録する必要がありますLONGVARCHAR

いずれにせよ(他の質問でも)、データを保存する前に最初にbase64でエンコードするのはなぜだろうと思っています。生のバイトをVARBINARY.

于 2013-06-08T08:49:10.027 に答える