![](/img/trans.png)
[英]The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, String[])
[英]error : The method setString(int, String) in the type PreparedStatement is not applicable for the arguments (int, Object)
我有下面的类文件。 如果我尝试将值从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();
您的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));
你cellStoreVector
包含的实例HSSFCell
。 但是由于你使用非泛型集合,当你检索元素时,你会将它们作为Object
,这就是编译器抱怨的原因,因为预期会出现String
。
由于细胞可以是不同的类型,你应该如何处理它真的取决于它们是什么类型的细胞。
例如,如果所有单元格都用于字符串数据,那么有一种方法可以将单元格中的值作为String
。
获取单元格的值作为字符串 - 对于数字单元格,我们抛出异常。 对于空白单元格,我们返回一个空字符串 对于不是字符串公式的formulaCells,我们抛出异常
所以,如果他们都是字符串细胞,我想这就是你能做的
pst1.setString(1, ((HSSFCell) cellStoreVector.get(0)).getStringCellValue());
将从向量中获取的对象转换为HSSFCell
,然后将值作为String
。
但是,这只是一个想法,你将确保你得到的。 此外,在处理集合时,总是很好地使用通用版本来确保类型安全。
这是一个基本的编程错误,错误信息是不言自明的。 该方法的第二个参数是String,而不是Object。 所以你必须将它转换为String,如果它确实是一个String,在这种情况下它不是。 您需要检查您的数据类型。 您应该使用Generics作为cellStoreVector,以使其更清晰,更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.