通过java中的字符串连接生成查询 - 不替换变量值

时间:2012-05-17 15:24:26

标签: java database csv concatenation

我有以下代码作为方法的一部分,该方法从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 ('' , '' )

我认为问题出在以下两个方面:

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

我在日志中打印了(令牌)变量,它正在从CSV文件中获取值。 谁知道问题出在哪里?

我也尝试了这个:

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

2 个答案:

答案 0 :(得分:1)

查看PreparedStatement而不是通过字符串连接查询。这将让DB驱动程序为您处理转义和转换值。

答案 1 :(得分:0)

有两种可能性:

  • token为空;或
  • GeneralMethods.dateFormat(token)被调用并返回一个空字符串。

要找出它是哪种,请打印出更多诊断信息,或者使用调试器。

P.S。由于您为insecure practice攻击和其他问题打开了自己,因此逐位构建SQL查询非常SQL injection。我强烈建议您重写代码以使用PreparedStatement