I am working with java and SQL server and i noticed an error when i used ODBC instead JDBC with the code below :


public class ListeFamillesMetiersRqt implements IListeFamillesMetiersRqt,
ListeFamillesMetiersEnum {

private final String LOG_FILE = "log_accesbase_gpec";

public ListeFamillesMetiersRqt() {
}

public IResultatRqt chercherListeFamilles (String _anneeTravail,
String _rech,
int _type_rech,
boolean _effectif,
String _typeComptage,
int _numPage,
int _nbRcdParPage) throws SQLException {
Statement stmt = null;
Connection conn = null;
ResultSet rs = null;
String requete = "";
IResultatRqt resultatRqt = null;

_rech=AutresOutils.getApostrophe(_rech);



try {

// prépare le statement
StringBuffer buf = new StringBuffer(200);
buf.append ("SELECT famille.id idfamille, famille.code codefamille, famille.des desfamille, famille.com comfamille, metier.id idmetier, metier.code codemetier, metier.des desmetier, metier.com commetier, emploi.id idemploi, emploi.code codeemploi, emploi.des desemploi, emploi.com comemploi, poste.id idposte, poste.code codeposte, poste.des desposte, poste.com composte ");
if (_effectif && _typeComptage == TYPE_COMPTAGE_POSTE) {
buf.append(",tmp.effectif effectifPoste,tmp2.effectif effectifEmploi ");
}
else if (_effectif && _typeComptage == TYPE_COMPTAGE_EMPLOI){
buf.append(",tmp2.effectif effectifEmploi ");
}
buf.append ("FROM dtable famille ");

buf.append ("LEFT OUTER JOIN dtable metier ON famille.id = metier.lien ");
buf.append ("LEFT OUTER JOIN dtable emploi ON metier.id = emploi.lien ");
buf.append ("LEFT OUTER JOIN dtable poste ON emploi.id = poste.lien ");

if (_effectif &&
(_typeComptage == TYPE_COMPTAGE_EMPLOI ||
_typeComptage == TYPE_COMPTAGE_POSTE)) {

buf.append ("LEFT OUTER JOIN ( ");
buf.append ("SELECT emploi.id emploiid, count(*) effectif ");
buf.append ("FROM dtable famille, dtable metier, dtable emploi, pers_v volet_personne ");
buf.append ("WHERE famille.nom_table = 'NOMGPE0' ");
buf.append ("AND famille.id = metier.lien ");
buf.append ("AND metier.id = emploi.lien ");
buf.append ("AND emploi.id = volet_personne.id_table ");
if (_rech.compareTo("*") != 0) {
if (_type_rech == PAR_FAMILLE) {
buf.append (" AND famille.des like '");
}
else if (_type_rech == PAR_METIER) {
buf.append (" AND metier.des like '");
}
else if (_type_rech == PAR_EMPLOI) {
buf.append (" AND emploi.des like '");
}
else if (_type_rech == PAR_POSTE) {
buf.append (" AND poste.des like '");
}
buf.append (_rech+"%' ");
}
buf.append ("GROUP BY emploi.id) tmp2 ");
buf.append ("ON tmp2.emploiid = emploi.id ");
}
if (_effectif && _typeComptage == TYPE_COMPTAGE_POSTE) {

buf.append ("LEFT OUTER JOIN ( ");
buf.append ("SELECT poste.id posteid, count(*) effectif ");
buf.append ("FROM dtable famille, dtable metier, dtable emploi, dtable poste, pers_v volet_personne ");
buf.append ("WHERE famille.nom_table = 'NOMGPE0' ");
buf.append ("AND famille.id = metier.lien ");
buf.append ("AND metier.id = emploi.lien ");
buf.append ("AND emploi.id = poste.lien ");
buf.append ("AND poste.id = volet_personne.id_table " );
if (_rech.compareTo("*") != 0) {
if (_type_rech == PAR_FAMILLE) {
buf.append (" AND famille.des like '");
}
else if (_type_rech == PAR_METIER) {
buf.append (" AND metier.des like '");
}
else if (_type_rech == PAR_EMPLOI) {
buf.append (" AND emploi.des like '");
}
else if (_type_rech == PAR_POSTE) {
buf.append (" AND poste.des like '");
}
buf.append (_rech+"%' ");
}
buf.append ("GROUP BY poste.id ) tmp " );
buf.append ("ON tmp.posteid = poste.id ");
}

buf.append ("WHERE famille.nom_table = 'NOMGPE0' ");
if (_rech.compareTo("*") != 0) {
if (_type_rech == PAR_FAMILLE) {
buf.append (" AND famille.des like '");
}
else if (_type_rech == PAR_METIER) {
buf.append (" AND metier.des like '");
}
else if (_type_rech == PAR_EMPLOI) {
buf.append (" AND emploi.des like '");
}
else if (_type_rech == PAR_POSTE) {
buf.append (" AND poste.des like '");
}
buf.append (_rech+"%' ");
}

buf.append (" ORDER BY famille.des, metier.des, emploi.des, poste.des");

requete = buf.toString();
conn = ConnectionDriver.getConnectionDriver(_anneeTravail );
stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(requete);
resultatRqt = new ResultatRqt (rs, _numPage, _nbRcdParPage);
}
catch (SQLException ex) {
String[] data = {MessageLogger.formatData ("Requête", requete)};
MessageLogger.writeMessage(LOG_FILE, 44, data, ex);
throw ex;
}
finally {
try {
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}
catch (SQLException ex) {
MessageLogger.writeMessage(LOG_FILE, 45, null, ex);
}
}
return resultatRqt;
}
}

When _effectif is TRUE and there is no result found, the code create an exeption :
java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] État de curseur non valide

If you can help me this will be wonderfull because i work like a dog on this.

thank you in advance

fabrice