如何使用JDBC执行此sql备份脚本?

时间:2017-04-02 13:15:10

标签: java sql-server jdbc

如何使用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文件登陆到远程服务器目录,我就会整理它,凭据掩盖了明显的原因。

谢谢

2 个答案:

答案 0 :(得分:2)

在您的Java代码中调用execute()而不是executeQuery()。后者假设您的查询需要返回结果集,但前者不假设。

所以,而不是:

stmt.executeQuery(query);

呼叫:

stmt.execute(query);

答案 1 :(得分:2)

您的代码不可读(因此难以维护),因为您混合使用SQL& Java语言在一起,所以我强烈建议您使用callableStatement ,您可以查看here一个简单示例。 简单来说,您需要将所有SQL代码移动到数据库中的过程,然后移动callableStatement.execute()