0

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

3 回答 3

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

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

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

pst1.setObject(1, cellStoreVector.get(0));
于 2012-10-17T03:48:40.523 回答
1

cellStoreVector包含HSSFCell. 但是,由于您使用的是非泛型集合,因此当您检索元素时,您会将它们获取为Object,这就是编译器抱怨的原因,因为String应该使用 an 。

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

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

HSSFCell#getStringCellValue

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

所以如果它们都是字符串单元,我认为这就是你可以做的

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

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

但是,这只是一个想法,你将确保你得到什么。此外,在处理集合时,最好使用泛型版本来保证类型安全。

于 2012-10-17T04:02:54.917 回答
0

这是一个基本的编程错误,错误消息是不言自明的。该方法的第二个参数是字符串,而不是对象。所以你必须把它转换成一个字符串,如果它真的是一个字符串,在这种情况下不是。您需要检查您的数据类型。您应该为 cellStoreVector 使用泛型以使其更清晰和更类型安全。

于 2012-10-17T03:46:24.090 回答