2

PreparedStatement在使用该类的以下 SQL 查询中:

String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)";
PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
pstmt2.setInt(1, rs4);
pstmt2.setString(2, itemdescription);
pstmt2.setString(3, itemdescription.substring(0,39));
pstmt2.executeUpdate();       

我有时会在我的项目描述中得到撇号和单引号和双引号。例如,我最近的一个项目是“Planar 22”监视器”。当然,字符串被误解了,认为描述值只是“Planar 22”。处理字符串中特殊字符的最佳方法是什么?

我读过有些人正在使用正则表达式,但是这些似乎是针对具体情况的。我正在研究的另一种方法是逐字符读取字符串数组。我希望有一种更有效、资源更少的方式来做到这一点。

更新在一些更广泛的测试之后,事实证明我的代码中出现了更多问题。这也是一个 URL 编码问题。当jsp代码填充html表单时,它会尝试将描述字段移动到在线表单,它会在表单而不是查询中截断它。jTDS 还纠正了接收特殊字符的问题。因为 jTDS 是一个 jar,它还有助于避免重新启动机器。我将奖励 jTDS 线程,因为那是我部分使用的。

提前致谢

4

4 回答 4

15

由于您使用的是 PreparedStatement,因此您根本不需要做任何事情,它将由 JDBC 驱动程序为您处理。您唯一需要注意的是非 ASCII 字符,特别是您必须确保 DB 表对可以处理您将使用的所有字符的文本列使用编码。但这是一个 SQL 问题,而不是 Java 问题。

于 2009-05-26T17:31:05.717 回答
3

就像其他人所说的那样,您不必做任何事情来处理特殊字符。您需要尝试不同的 JDBC 驱动程序。

尝试使用jTDS 驱动程序,看看它是否对您的 PreparedStatement 有帮助。它是 SQL Server 的开源数据库驱动程序。我现在在工作中使用它,它像冠军一样工作,实际上符合 JDBC 规范,不像 MS 驱动程序。

于 2009-05-29T02:52:59.907 回答
3

如果您将这些字符作为参数绑定到 PreparedStatement,则不需要特别处理这些字符,就像您正在做的那样。这是准备好的陈述方法的主要好处之一。

于 2009-05-26T17:31:42.940 回答
0

I'm fairly certain the problem isn't with the code you posted. To help troubleshoot:

  1. Have you tried running the code snippet above in a debugger? What's the value of "itemdescription" before you pass it to the database call?
  2. How are you actually verifying the value in the database? Is this more Java code? Or are you looking at it with SQLCMD or something like that?
于 2009-06-01T12:50:25.787 回答