2012-10-17 87 views
0

我有下面的类文件。如果我尝试从Vector中插入值到数据库,那么它会显示下面的错误。我想在这种情况下使用Vector并寻找如何解决此问题。下面错误:类型PreparedStatement中的方法setString(int,String)不适用于参数(int,Object)

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

回答

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

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

1

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

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

例如,如果所有的细胞在字符串数据则是在细胞中作为String返回值的方法。

HSSFCell#getStringCellValue

得到该小区作为一个字符串的值 - 为数字细胞,我们抛出一个异常。对于空白单元格,我们返回空字符串。对于不属于串式formulaCells,我们抛出一个异常

所以,如果他们都串细胞,我觉得这是你能做什么

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

投你的对象从向量HSSFCell然后获得值为String

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

+0

我从你的描述中学到了确切的概念。谢谢。 – user1710288

+0

@ user1710288:不客气。 –

相关问题