java - 插入 blob 作为数据类型时出现数据截断错误

标签 java mysql insert javafx prepared-statement

目前我正在创建产品。在创建产品时,您需要插入图像。所以我使用 JavaFx 编写了一个文件选择器代码。当按钮被点击时,它会调用这个 Action 事件来提示用户从机器中选择图像。

public void handle(ActionEvent event){
     FileChooser fileChooser = new FileChooser();

        //Set extension filter
        FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
        FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
        fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

        //Show open file dialog
        File file = fileChooser.showOpenDialog(null);

        try {
            BufferedImage bufferedImage = ImageIO.read(file);
            Image image = SwingFXUtils.toFXImage(bufferedImage, null);
            myImageView.setImage(image);
        } catch (IOException ex) {
            Logger.getLogger(CreateProductUI.class.getName()).log(Level.SEVERE, null, ex);
        }
}

它工作得很好,我可以简单地获取并显示选择的图像:

 myImageView.setImage(image);
 Image image = panel.getMyImageView().getImage();

但是,当我尝试将此图像插入数据库表时,我收到一条错误消息。这是我的插入 SQL 方法:

 public boolean create() {
    boolean success = false;
    try {
        DBController db = new DBController();
        String dbQuery;
        db.getConnection();

        dbQuery = "INSERT INTO sm_product(productName,productDescription,productPrice,productQuantity,dateOfCreation,productStatus,productImage) VALUES (?,?,?,?,?,?,?)";

        PreparedStatement psmnt = db.getConnection().prepareStatement(dbQuery);
        psmnt.setString(1, name);
        psmnt.setString(2, desc);
        psmnt.setDouble(3, price);
        psmnt.setInt(4, quantity);
        psmnt.setString(5, datestr);
        psmnt.setString(6, "Available");

        File imageFile = new File("test.png");
        RenderedImage renderedImage = SwingFXUtils.fromFXImage(image, null);
        ImageIO.write(renderedImage, "png", imageFile); //Change extension appropriately
        FileInputStream fis = new FileInputStream(imageFile);
        psmnt.setBinaryStream(7, (InputStream) fis, (int) (imageFile.length()));
        int s = psmnt.executeUpdate();

        //check the value of s and initialize success appropriately

        return success;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;

}

我的图像列的数据类型是 Blob。它返回给我一条“数据截断:第 1 行的‘productImage’列数据太长”错误消息。我什至尝试将数据类型更改为 varchar(100) 但它不起作用。我想知道为什么。

提前致谢。

最佳答案

正如异常所示。与图像列容量相比,您的图像太长。

您的productImage是BLOB,但为什么您甚至尝试更改为varchar(100),这很奇怪。

您必须将图像列数据类型更改为 BLOB。 更多信息可以查看这里http://dev.mysql.com/doc/refman/5.0/en/blob.html

希望这有帮助

关于java - 插入 blob 作为数据类型时出现数据截断错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204743/

相关文章:

java - 将多个表映射到一个 List Hibernate

python - sqlite3 如果不存在则插入(使用 Python)

SQL基于计数器通过复制插入记录

java - InterstitialAd的构造函数

java - 在调用几个重载方法中的任何一个后调用一次方法

java - 正则表达式:星号重复运算符的所有格量词,即\d**

java - 通过添加camel功能扩展现有的spring应用程序

php - MySQL 查询后,行显示空白值

mysql - 如何使用 Laravel 迁移脚本创建 MD5 字段?

database - MAC 上的 cassandra.yaml 位置在哪里?