J'ai une base de données MSSQL
et j'exécute la requête suivante:
select * from projects; select * from user
La requête ci-dessus renvoie deux ensembles de résultats à la fois, et je ne peux pas déclencher les deux requêtes séparément. Comment puis-je gérer simultanément le jeu de résultats dans une classe Java?
Code correct pour traiter plusieurs ResultSet
s renvoyés par une instruction JDBC:
PreparedStatement stmt = ...;
boolean isResultSet = stmt.execute();
int count = 0;
while(true) {
if(isResultSet) {
rs = stmt.getResultSet();
while(rs.next()) {
processEachRow(rs);
}
rs.close();
} else {
if(stmt.getUpdateCount() == -1) {
break;
}
log.info("Result {} is just a count: {}", count, stmt.getUpdateCount());
}
count ++;
isResultSet = stmt.getMoreResults();
}
Bits importants:
getMoreResults()
et execute()
retournent false
pour indiquer que le résultat de l'instruction est juste un nombre et non une ResultSet
.stmt.getUpdateCount() == -1
pour savoir s’il ya plus de résultats.stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)
.Vous pouvez utiliser Statement.execute (), getResultSet ();
PreparedStatement stmt = ... prepare your statement result
boolean hasResults = stmt.execute();
while (hasResults) {
ResultSet rs = stmt.getResultSet();
... your code parsing the results ...
hasResults = stmt.getMoreResults();
}
Oui, vous pouvez. Voir cet article MSDN https://msdn.Microsoft.com/en-us/library/ms378758(v=sql.110).aspx
public static void executeStatement(Connection con) {
try {
String SQL = "SELECT TOP 10 * FROM Person.Contact; " +
"SELECT TOP 20 * FROM Person.Contact";
Statement stmt = con.createStatement();
boolean results = stmt.execute(SQL);
int rsCount = 0;
//Loop through the available result sets.
do {
if(results) {
ResultSet rs = stmt.getResultSet();
rsCount++;
//Show data from the result set.
System.out.println("RESULT SET #" + rsCount);
while (rs.next()) {
System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
}
rs.close();
}
System.out.println();
results = stmt.getMoreResults();
} while(results);
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
J'ai testé ça et ça marche bien.
public static void executeProcedure(Connection con) {
try {
CallableStatement stmt = con.prepareCall(...);
..... //Set call parameters, if you have IN,OUT, or IN/OUT parameters
boolean results = stmt.execute();
int rsCount = 0;
//Loop through the available result sets.
while (results) {
ResultSet rs = stmt.getResultSet();
//Retrieve data from the result set.
while (rs.next()) {
....// using rs.getxxx() method to retieve data
}
rs.close();
//Check for next result set
results = stmt.getMoreResults();
}
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
Avant d'utiliser Java, vous devez consulter la clause RESULT SETS.
MSSQL possède cette fonctionnalité qui peut vous aider avec votre code Java, de manière plus pratique.
Cet exemple va exécuter deux requêtes:
EXEC('SELECT id_person, name, age FROM dbo.PERSON; SELECT id_url, url FROM dbo.URL;')
WITH RESULT SETS
(
(
id_person BIGINT,
name VARCHAR(255),
age TINYINT
),
(
id_url BIGINT,
url VARCHAR(2000)
)
);
Vous pouvez également utiliser des procédures stockées avec RESULT SETS.
En savoir plus sur: https://technet.Microsoft.com/en-us/library/ms188332(v=sql.110).aspx