繁体   English   中英

错误:PreparedStatement类型中的方法setString(int,String)不适用于参数(int,Object)

[英]error : The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, Object)

我有下面的类文件。 如果我尝试将值从Vector插入数据库,那么它将显示以下错误。 我想在这种情况下使用Vector并查看如何解决此问题。

error : The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, Object) 

下面是类代码:

public class ReadExcelFile {

        public static void main(String[] args) {

                String fileName = "C:\\excelFile.xls";
                Vector dataHolder = ReadCSV(fileName);
                printCellDataToConsole(dataHolder);
        }

        public static Vector ReadCSV(String fileName) {
                Vector cellVectorHolder = new Vector();

                try {
                        FileInputStream myInput = new FileInputStream(fileName);

                        POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);

                        HSSFWorkbook myWorkBook = new HSSFWorkbook(myFileSystem);

                        HSSFSheet mySheet = myWorkBook.getSheetAt(0);

                        Iterator rowIter = mySheet.rowIterator();

                        while (rowIter.hasNext()) {
                                HSSFRow myRow = (HSSFRow) rowIter.next();
                                Iterator cellIter = myRow.cellIterator();
                                Vector cellStoreVector = new Vector();
                                while (cellIter.hasNext()) {
                                        HSSFCell myCell = (HSSFCell) cellIter.next();
                                        cellStoreVector.addElement(myCell);
                                }
                                cellVectorHolder.addElement(cellStoreVector);
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return cellVectorHolder;
        }

        public static void printCellDataToConsole(Vector dataHolder) {

                for (int i = 0; i < dataHolder.size(); i++) {
                        Vector cellStoreVector = (Vector) dataHolder.elementAt(i);
                     //   System.out.println(cellStoreVector);
                        for (int j = 0; j < cellStoreVector.size(); j++) {
                              HSSFCell myCell = (HSSFCell) cellStoreVector.elementAt(j);
                              String stringCellValue = myCell.toString();
                              System.out.print(stringCellValue + "\t\t");
                        }
                        System.out.println();
                }
        }


}

//下面是数据库查询

String sql = "INSERT INTO table_name(EMP_ID,FNAME, LNAME, CATEGORY, DEPARTMENT, Title, REASON, Manager, sDate, eDate, ID) VALUES(?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pst1 = conn.prepareStatement(sql);
pst1.setString(1, cellStoreVector.get(0));
pst1.setString(2, cellStoreVector.get(1));
pst1.setString(3, cellStoreVector.get(2));
pst1.setString(4, cellStoreVector.get(3));
pst1.setString(5, cellStoreVector.get(4));
pst1.setString(6, cellStoreVector.get(5));
pst1.setString(7, cellStoreVector.get(6));
pst1.setString(8, cellStoreVector.get(7));
pst1.setString(9, cellStoreVector.get(8));
pst1.setString(10, cellStoreVector.get(9));
pst1.setString(11, "555");  //Hardcoded for testing. 
pst1.execute();

您的Vector被定义为保存Objects

Vector#get将返回一个Object

PreparedStatement#setString方法期待一个String ,这是一个简单的类型不匹配问题。

你可以声明Vector ,这样它只包含String ...

Vector<String> myVector = new Vector<String>(25);

......但我不认为你可以从你的榜样......

您可以将Vector的值转换为String

pst1.setString(1, (String)cellStoreVector.get(0));

但这很危险,因为在运行时,您不会发现Vector不包含String元素

或者你可以让PreparedStatement处理它......

pst1.setObject(1, cellStoreVector.get(0));

cellStoreVector包含的实例HSSFCell 但是由于你使用非泛型集合,当你检索元素时,你会将它们作为Object ,这就是编译器抱怨的原因,因为预期会出现String

由于细胞可以是不同的类型,你应该如何处理它真的取决于它们是什么类型的细胞。

例如,如果所有单元格都用于字符串数据,那么有一种方法可以将单元格中的值作为String

HSSFCell#getStringCellValue

获取单元格的值作为字符串 - 对于数字单元格,我们抛出异常。 对于空白单元格,我们返回一个空字符串 对于不是字符串公式的formulaCells,我们抛出异常

所以,如果他们都是字符串细胞,我想这就是你能做的

pst1.setString(1, ((HSSFCell) cellStoreVector.get(0)).getStringCellValue());

将从向量中获取的对象转换为HSSFCell ,然后将值作为String

但是,这只是一个想法,你将确保你得到的。 此外,在处理集合时,总是很好地使用通用版本来确保类型安全。

这是一个基本的编程错误,错误信息是不言自明的。 该方法的第二个参数是String,而不是Object。 所以你必须将它转换为String,如果它确实是一个String,在这种情况下它不是。 您需要检查您的数据类型。 您应该使用Generics作为cellStoreVector,以使其更清晰,更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM