因此,我正在将信息从.csv文件导入数据库。但是我在csv文件中用户输入的描述遇到了麻烦,因为它们包含的单引号破坏了SQL导入。
我的导入语句是字符串sqlJob =
"INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name,"
+ " Duration, Job_Location, Job_Completion_Date, Job_Technician,"
+ " Job_Asset, Job_Type, Job_Description) VALUES ('"
+csvRecord.get(i)+"', '"+csvRecord.get(26)+"', '"+csvRecord.get(16)
+"', '"+csvRecord.get(2)+"', '"+csvRecord.get(31)+"', '"+csvRecord.get(27)
+"', '"+csvRecord.get(28)+"', '"+csvRecord.get(29)+"', '"+csvRecord.get(30)
+"', '"+csvRecord.get(33)+"', '"+csvRecord.get(34)+"');";
简化形式为
"INSERT INTO job (ID, Description) VALUES ('"
+ csvRecord.get(i) + "', '" + csvRecord.get(34) + "');";
问题是csvRecord.get(34)
有时会包含撇号。例如,“我的名字叫Bob”,而Bob中的撇号打破了声明该值是SQL字符串所需的周围的撇号。
是否有一种简单的方法来解析字符串并在撇号前面添加转义字符,或者是否应以其他方式格式化原始SQL命令。
谢谢!
答案 0 :(得分:8)
问题是您正在将SQL语句组装为字符串,并串联参数值。绝对不建议这样做。
使用PreparedStatement
代替,它们更易于使用。您可以传递参数而无需进行任何修改,并且它们不会干扰SQL语句的正确执行。
作为一项宝贵的奖励,您的代码将摆脱SQL注入问题。
JDBC Tutorial中的示例:
String updateString = "update COFFEES set SALES = ? where COF_NAME = ?";
PreparedStatement updateSales = con.prepareStatement(updateString);
updateSales.setInt(1, numSales);
updateSales.setString(2, coffeeName);
updateSales.executeUpdate();
如您所见,参数未连接到字符串中,但是它们将代替?
符号。
即使coffeeName
的值是"Africa's Best"
(包括撇号),查询也可以正常工作。
答案 1 :(得分:1)
使用 PreparedStatement ,这样您就可以保存了。
String name = request.getParameter( "ID" );
String message = request.getParameter( "Job_Contact" );
Connection c = null;
try
{
String url = "jdbc:mysql://localhost/**"databasename"**;
String username = "**<Database Login>**";
String password = "**<Database password>**";
**// at the ? section you can add any quantity you need to**
String sql = "insert into **<databasename>**(name, message) values (?, ?)";
c = DriverManager.getConnection( url, username, password );
PreparedStatement pstmt = c.prepareStatement( sql );
pstmt.setString( 1, name );
pstmt.setString( 2, message );
pstmt.executeUpdate();
}
catch( SQLException e )
{
throw new ServletException( e );
}
finally
{
try
{
if( c != null ) c.close();
}
catch( SQLException e )
{
throw new ServletException( e );
}
}