我有以下代码作为方法的一部分,该方法从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;
答案 0 :(得分:1)
查看PreparedStatement而不是通过字符串连接查询。这将让DB驱动程序为您处理转义和转换值。
答案 1 :(得分:0)
有两种可能性:
token
为空;或GeneralMethods.dateFormat(token)
被调用并返回一个空字符串。要找出它是哪种,请打印出更多诊断信息,或者使用调试器。
P.S。由于您为insecure practice攻击和其他问题打开了自己,因此逐位构建SQL查询非常SQL injection。我强烈建议您重写代码以使用PreparedStatement
。