2012-10-17 103 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:不客氣。 –

相關問題