如何使用JDBC对我的数据库实例执行以下查询,我尝试的所有内容都返回“无结果集”错误。
com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
当我不是真正回看数据时,该怎么办?
.sql文件
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @fileFolder VARCHAR(20) -- used for file name
-- specify database backup directory
SET @path = 'C:\SQLBackups\'
-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
我执行查询的代码(到目前为止)
public static void connect(String instance, String saPassword, String query) {
Connection conn = null;
query = "DECLARE @name VARCHAR(50) -- database name " +
"DECLARE @path VARCHAR(256) -- path for backup files " +
"DECLARE @fileName VARCHAR(256) -- filename for backup " +
"DECLARE @fileDate VARCHAR(20) -- used for file name " +
"-- specify database backup directory " +
"SET @path = 'C:\\SQLBackups\\' " +
"-- specify filename format " +
"SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) " +
"DECLARE db_cursor CURSOR FOR " +
"SELECT name " +
"FROM master.dbo.sysdatabases " +
"WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases " +
"OPEN db_cursor " +
"FETCH NEXT FROM db_cursor INTO @name " +
"WHILE @@FETCH_STATUS = 0 " +
"BEGIN " +
" SET @fileName = @path + @name + '_' + @fileDate + '.BAK' " +
" BACKUP DATABASE @name TO DISK = @fileName " +
" FETCH NEXT FROM db_cursor INTO @name " +
"END " +
"CLOSE db_cursor " +
"DEALLOCATE db_cursor ";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
String dbURL = "jdbc:sqlserver://10.0.0.0\\"+ instance;
String user = "user";
String pass = saPassword;
conn = DriverManager.getConnection(dbURL, user, pass);
Statement stmt = conn.createStatement();
stmt.executeQuery(query);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
我可以在SSMS中执行我的查询,将.sql文本转换为字符串会导致问题吗?我对这里的结果不太感兴趣,因为它应该在服务器上创建很多.bak文件(当我通过SSMS执行时会发生这种情况,我通过抓取一个简单的SELECT结果集来改变查询结果,所以我现在有点迷失。
覆盖方法中的(查询)仅用于测试目的,一旦我将.bak文件登陆到远程服务器目录,我就会整理它,凭据掩盖了明显的原因。
谢谢
答案 0 :(得分:2)
在您的Java代码中调用execute()
而不是executeQuery()
。后者假设您的查询需要返回结果集,但前者不假设。
所以,而不是:
stmt.executeQuery(query);
呼叫:
stmt.execute(query);
答案 1 :(得分:2)
您的代码不可读(因此难以维护),因为您混合使用SQL& Java语言在一起,所以我强烈建议您使用callableStatement
,您可以查看here一个简单示例。
简单来说,您需要将所有SQL代码移动到数据库中的过程,然后移动callableStatement.execute()