我有下面的类文件。如果我尝试将值从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();
答案 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
返回。
将单元格的值作为字符串获取 - 对于数字单元格,我们抛出异常。对于空白单元格,我们返回一个空字符串对于不是字符串公式的formulaCells,我们抛出异常
因此,如果它们都是字符串单元格,我认为这就是你能做的事情
pst1.setString(1, ((HSSFCell) cellStoreVector.get(0)).getStringCellValue());
将您从矢量中获取的对象投射到HSSFCell
,然后将值设为String
。
但是,这只是一个想法,你将确保你得到的东西。此外,在处理集合时,总是很好地使用通用版本来实现类型安全。
答案 2 :(得分:0)
这是一个基本的编程错误,错误信息是不言自明的。该方法的第二个参数是String,而不是Object。所以你必须将它转换为String,如果它确实是一个String,在这种情况下它不是。您需要检查您的数据类型。您应该使用Generics作为cellStoreVector,以使其更清晰,更安全。