0

CSVファイルから読み取り、挿入ステートメントを生成して実行することにより、その内容をDBに保存するメソッドの一部として、次のコードがあります。

 ....
 try 
    {
        while( (strLine = br.readLine()) != null)
        {
            query = baseQuery;
            st = new StringTokenizer(strLine, ",");   
            while(st.hasMoreTokens())
            {
                token = st.nextToken();
                if("TIMESTAMP".equals(values.get(tokenNumber)))
                    query += "'" + GeneralMethods.dateFormat(token) + "' , ";
                else
                    query += "'" + token + "' , ";
            }
            query = query.substring(0, query.length()-2) + ")";
            ds.insertData(query );
        }
    } catch (IOException e) 
    {            
        logger.error("IOException Occured while trying to read lines of CSV file: \n  " + e.getMessage());
        status = false;
    }

クエリが空の値で生成されることを除いて、すべて正常に機能します。これはログに出力されます。

Failed to execute query: INSERT INTO c1_ds1 ( TIME , USER ) VALUES ('' , '' )

問題は次の 2 行にあると思います。

if("TIMESTAMP".equals(values.get(tokenNumber)))
                    query += "'" + GeneralMethods.dateFormat(token) + "' , ";
                else
                    query += "'" + token + "' , ";

ログに (トークン) 変数を出力しましたが、CSV ファイルから値を取得しています。誰が問題がどこにあるか知っていますか?

私もこれを試しました:

query += "'"; query += token; 
4

2 に答える 2

1

文字列を介してクエリを連結する代わりに、PreparedStatementを調べてください。これにより、DB ドライバーが値のエスケープと変換を処理できるようになります。

于 2012-05-17T15:27:23.360 に答える
0

正確に 2 つの可能性があります。

  • どちらかtokenが空です。また
  • GeneralMethods.dateFormat(token)が呼び出され、空の文字列を返します。

それがどれであるかを調べるには、さらに診断を出力するか、デバッガを使用してください。

PS SQL インジェクション攻撃やその他の問題にさらされるため、SQL クエリを少しずつ作成するのは非常に安全ではありません。を使用するようにコードを書き直すことを強くお勧めします。PreparedStatement

于 2012-05-17T15:29:17.747 に答える