我正在尝试使用PreparedStatement将记录插入Oracle数据库,但我只收到此错误.在这一点上,我克服它的努力远远超过了我的进步,所以另一组眼睛可能有所帮助.无效字符在哪里?我发现的很多东西都暗示了一个尾随的“;”在...

我正在尝试使用PreparedStatement将记录插入Oracle数据库,但我只收到此错误.在这一点上,我克服它的努力远远超过了我的进步,所以另一组眼睛可能有所帮助.无效字符在哪里?
我发现的很多东西都暗示了一个尾随的“;”在你的sql内部字符串可能是罪魁祸首,但我从一开始就没有在我的声明中有一个.
我的连接本身,在程序的其他几个地方完美运行:
Properties props = new Properties();
props.setProperty( "user", username );
props.setProperty( "password", password );
props.setProperty( "defaultRowPrefetch", "10" );
props.setProperty( "defaultBatchValue", "10" );
props.setProperty( "processEscapes", "false" );
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection(DB_URL_SVC, props);
我希望它完成它的方式(除了我将它包装在一个接受三个字符串的方法中)但它抛出一个SQLSyntaxErrorException
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // ORA-00911: invalid character error
这有效,但由于参数是硬编码的,因此无法使用PreparedStatement:
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( 'JHT' , 'USA' , '2500' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();
作品.但是,我理解用单引号和双引号连接变量也不是最好的方法因为PreparedStatement应该减轻我们不得不处理语法的那部分:
String value1 = "JHT";
String value2 = "USA";
int value3 = 2500;
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '" + value1 + "', '" + value2 + "', '" + value3 + "' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();
失败,出现SQLSyntaxErrorException.所以即使我自己使用代码引用语法,我仍然无法将这些变量放在preStatement.setString()中,这至少可以提供一点灵活性.
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "' + value1 + '");
preStatement.setString(2, "' + value2 + '");
preStatement.setInt(3, "' + value3 + '");
preStatement.executeUpdate(); // ORA-00911: invalid character error
失败.用单引号括住我的String中的占位符会导致SQLException.
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , '?' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // invalid column index
失败.用单引号括住我的String中的两个String(但不是int)占位符会导致SQLException.
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // invalid column index
这不会失败,但也不会写入数据库(即使我没有禁用自动提交).
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeBatch();
我也用反斜杠,双反斜杠,反引号,quitsies, no-startsies, erasies, double-stamps, and tofus-make-it-true尝试了所有的逃生问题!也许那里有人知道会帮助我的伏都教?!
解决方法:
你有props.setProperty(“processEscapes”,“false”)是否有原因;?
我相信这会关闭使用的能力?作为绑定参数占位符.我相信如果启用了转义处理,JDBC会做一些“魔术”吗?在将SQL字符串传递给Oracle之前占位符.否则,?字符按原样发送到数据库.
偶尔会有用于禁用转义处理的用途.我在a previous answer用它来涉及一个问题?密码中的字符.我相信它可以在连接或语句级别禁用;要在PreparedStatement上重新启用转义处理,请尝试调用preStatement.setEscapeProcessing(true);.我希望你的第一个失败的例子能够成功使用这个选项集.
至于你失败的例子,未转义的那些会导致问题吗?不是SQL中的有效字符.周围?在单引号中将其转换为单字符字符串,因此即使启用了转义处理,它也不会是绑定参数.我不能说为什么最后一个不写入数据库.
本文标题为:java – SQLSyntaxErrorException:ORA-00911:无效字符


基础教程推荐
- Java定时器Timer的源码分析 2023-07-01
- 使用jib插件为Java应用构建镜像的方法 2023-04-17
- Java必会的Synchronized底层原理剖析 2023-06-17
- Mybatis表的关联查询详情 2023-05-24
- 关于JSP用户登录连接数据库详情 2023-07-30
- 出现SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.的解决方法 2023-02-27
- java实现简单学生成绩档案管理系统 2022-11-28
- Spring Cloud OpenFeign 远程调用 2022-09-03
- Feign超时 在yml文件里的配置方式 2023-01-13
- java – 为什么带有分页的spring nativeQuery抛出一个SQLGrammarException? 2023-10-31