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

时间:2012-10-17 03:41:37

标签: java

我有下面的类文件。如果我尝试将值从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();

3 个答案:

答案 0 :(得分:1)

您的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));

但是这很危险,因为在运行时<{1}}之前不会发现Vector不包含String元素

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

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

答案 1 :(得分:1)

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

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

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

HSSFCell#getStringCellValue

  

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

因此,如果它们都是字符串单元格,我认为这就是你能做的事情

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

将您从矢量中获取的对象投射到HSSFCell,然后将值设为String

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

答案 2 :(得分:0)

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