JDBC SQL SERVER:该语句未返回结果集
我正在从Microsoft SQL Server Studio执行以下查询,该查询工作正常并显示结果:
SELECT * INTO #temp_table FROM md_criteria_join WHERE user_name = 'tecgaw' UPDATE #temp_table SET user_name = 'tec' WHERE user_name != 'tec' SELECT * FROM md_criteria_join WHERE user_name = 'tec' AND view_name NOT IN (SELECT view_name FROM md_criteria_join WHERE user_name = 'tecgaw') UNION SELECT * FROM #temp_table ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq
但是,如果我在Java中执行相同的查询,则会抛出exception,指出“语句未返回结果集”。 这是Java代码:
statement = conn.getConnection().createStatement(); resultSet = stmt.executeQuery(sql.toString());
是因为我不能在一个语句中执行多个SQL查询(即,创建#temp_table
,更新它,然后使用我的select语句)?
我在StackOverflow中找到了类似的问题。 您应该启用连接以支持多个语句并使用它们分开;
。 具体的例子请看答案。 但它只适用于MySql。
另外我认为你可以将SQL重写为单个查询
SELECT columnA, columnB, 'tec' as user_name from md_criteria_join WHERE ( user_name = 'tec' AND view_name NOT IN ( SELECT view_name FROM md_criteria_join WHERE user_name = 'tecgaw') ) OR user_name = 'tecgaw' ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq
另一种选择是将语句移动到存储过程并使用CallableStatement从JDBC中调用它
或许你应该尝试用这样的多个jdbc语句执行它
Connection conn = conn.getConnection(); //just to make sure its on single connection conn.createStatement("SELECT INTO #temp_table").executeUpdate(); conn.createStatement("UPDATE #temp_table").executeUpdate(); conn.createStatement("SELECT ...").executeQuery();
请注意,您必须关闭资源,并且为了获得更好的性能,您可以使用addBatch和executeBatch方法
JDBC因行数而变得混乱。
您需要使用SET NOCOUNT ON
。
使用execute
语句进行数据操作,如insert,update和delete ,使用executeQuery
进行数据检索,如select
我建议你将你的程序分成两个语句,一个是execute
,一个是executeQuery
。
如果您不希望这样做,请尝试用分号分隔语句。 但是如果这给你一个结果集,我不确定这个动作。
在ms sql中你还必须在存储过程开始时设置nocount,同时用“;”终止select / update / insert块语句。