Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将blob作为数据类型插入时发生数据截断错误_Java_Mysql_Insert_Javafx_Prepared Statement - Fatal编程技术网

Java 将blob作为数据类型插入时发生数据截断错误

Java 将blob作为数据类型插入时发生数据截断错误,java,mysql,insert,javafx,prepared-statement,Java,Mysql,Insert,Javafx,Prepared Statement,目前我正在做创建产品。在创建产品时,需要插入图像。所以我用JavaFx编写了一个文件选择器代码。当按钮点击时,它将调用此操作事件以提示用户从机器中选择图像 public void handle(ActionEvent event){ FileChooser fileChooser = new FileChooser(); //Set extension filter FileChooser.ExtensionFilter extFilterJPG =

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

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();
然而,当我尝试将此图像插入数据库表时,收到一条错误消息。以下是我的Insert 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。 有关更多信息,请参见此处


希望这有助于

yai使用blob,然后出现错误。当我换成longBlob时,没有错误。但是程序只是停留在它保持运行的状态,没有显示成功消息。如果成功插入调试,它应该在那里。您应该使用BLOB,然后保存一个较小的图像。或者您可以将数据类型更改为LONGBLOB,数据类型长度规范可以在这里找到,我想知道它是否存储为数据库表中的Blob,而不是确切的图像位置路径?因为我以前从来没有用过这个,而且对我来说这似乎很新。你实际上是在尝试将图像插入数据库,而不是图像位置。哦,好的,那么图像列中的blob值应该是正确的吗?但是,即使数据已经插入到表中,为什么jfxsa运行仍会继续运行而不显示成功消息呢?