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

YourVectorは を保持するように定義されてい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。しかし、非ジェネリック コレクションを使用しているため、要素を取得すると として取得されます。これが、代わりに an が期待されるObjectため、コンパイラが不平を言っている理由です。String

細胞にはさまざまな種類があるため、どのように扱うべきかは、細胞の種類によって異なります。

たとえば、すべてのセルが文字列データの場合、セルの値を として返すメソッドがありますString

HSSFCell#getStringCellValue

セルの値を文字列として取得します。数値セルの場合は例外をスローします。空白セルの場合、空の文字列を返します。文字列数式ではない formulaCell の場合、例外をスローします。

もしそれらがすべて文字列セルだったら、これはあなたができることだと思います

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

ベクトルから取得したオブジェクトをキャストしHSSFCell、値を として取得しますString

しかし、それは単なるアイデアです。何が得られるかを確認する必要があります。また、コレクションを扱うときは、タイプ セーフのためにジェネリック バージョンを使用することをお勧めします。

于 2012-10-17T04:02:54.917 に答える
0

これは基本的なプログラミング エラーであり、エラー メッセージは一目瞭然です。そのメソッドの 2 番目の引数は、オブジェクトではなく文字列です。したがって、実際に文字列である場合は文字列にキャストする必要がありますが、この場合はそうではありません。データ型を確認する必要があります。これをより明確にし、よりタイプセーフにするために、cellStoreVector に Generics を使用する必要があります。

于 2012-10-17T03:46:24.090 に答える