2017-02-10 1 views
1

Ich arbeite an einer JAVA-App, die die Daten- und Protokollgrößen aller Datenbanken einer Instanz auswertet und einen monatlichen Bericht versendet. Ich arbeite derzeit mit SQLServer2014. Ich verwende eine SQL-Abfrage, die die Größe aller Datenbanken durch Abfragen von sys.master_files berechnet.Können Sie JDBC verwenden, um nur eine Instanz zu verbinden, ohne eine Datenbank anzugeben?

Das Problem ist, dass, wenn JDBC mit der Abfrage zu machen, den Fehler zurückgibt:

java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost" 

Ich habe versucht, auf bestimmte Datenbanken verbinden und das funktioniert gut. Gibt es eine Möglichkeit, diese Abfrage mithilfe von JDBC direkt an sys.master_files zu senden? Oder gibt es insgesamt einen klügeren Weg, um das gleiche Ergebnis zu erzielen?

Dank

+1

Normalerweise ist das RDBMS, das mit Ihrer Anwendung ausgeführt wird, beim Bereitstellen bekannt. Können Sie näher erläutern, warum Sie denken, dass Sie das brauchen? –

+1

Ihre URL ist falsch, die richtige URL für SQL Server beginnt mit 'jdbc: sqlserver:', nicht 'jdbc: microsoft: sqlserver:'; Sehen Sie sich https://docs.microsoft.com/en-us/sql/connect/jdbc/building-the-connection-url für die richtige URL an. und gemäß dieser Dokumentation ist der Datenbankname optional (er stellt dann eine Verbindung zur Standarddatenbank her). –

Antwort

1

Ihre „No gefunden passenden Treiber“ Fehler einfach aufgrund einer URL beschädigten Verbindung sind. jdbc:microsoft:sqlserver ist nicht gültig.

Was zu einer Instanz verbinden, ohne dass eine bestimmte Datenbank angibt, das funktioniert gut für mich:

// NB: no databaseName specified in the following 
String connectionUrl = "jdbc:sqlserver://localhost;instanceName=SQLEXPRESS;integratedSecurity=true"; 

try (Connection conn = DriverManager.getConnection(connectionUrl)) { 
    String sql = "SELECT name FROM sys.master_files WHERE type_desc='ROWS' ORDER BY database_id"; 
    try (
      Statement st = conn.createStatement(); 
      ResultSet rs = st.executeQuery(sql)) { 
     while (rs.next()) { 
      System.out.println(rs.getString(1)); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(System.err); 
} 

Beachten Sie, dass sys.master_files ist eine Systemansicht, die in allen Datenbanken zur Verfügung steht, so AFAIK ist es egal, was die aktuelle Datenbank (Katalog) ist, wenn Sie sie aufrufen.

Verwandte Themen