Comment récupérer les valeurs dans une requête
Bonjour:D
J'ai maintenant une couche driver qui marche, je travaille sur la couche de plus haut niveau et j'ai une question à ce sujet:
Dans un premier temps je vous net le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
try
{
while( InterbaseManager.myReader.next());
{
WorkElement.Id = InterbaseManager.myReader.getInt( 0);
WorkElement.wsText = InterbaseManager.myReader.getString( 1);
pListText.add(WorkElement);
}
}
catch(Exception ex)
{
ex.printStackTrace();
} |
puis le message d'erreur:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] Index de descripteur non valide
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
at com.all4tec.matelo.linguistique.wizards.MissionDatabaseManager.ReadWork(MissionDatabaseManager.java:81)
at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard.RecupereNomDesFichier(LinguistiqueImportWizard.java:61)
at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard$1.run(LinguistiqueImportWizard.java:87)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121) |
Je vous demande comment adresser les champs dans la boucle while du code.
J'ai essayé dans un premier temps de partir à 1 puis j'ai essayé de partir à 0
Quand on compte à partir de 1 on récupère:
Code:
java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] État de curseur non valide
à Noter que dans la base siIdDocument est le premier enregistrement et vcDocument est le deuxième
J'ai modifié le programme pour me rendre indépendant de la question "est ce que on doit dire sur l'index":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
try
{
while( InterbaseManager.myReader.next()&& iNbResultFound > 0);
{
String nom;
nom = "siIdDocument";
int index = InterbaseManager.myReader.findColumn(nom);
WorkElement = new Structure.ElementWork();
WorkElement.Id = InterbaseManager.myReader.getInt( index);
index++;
WorkElement.wsText = InterbaseManager.myReader.getString( index);
pListText.add( WorkElement);
iNbResultFound--;
}
}
catch( Exception ex)
{
ex.printStackTrace();
} |
mais cette méthode n'a rien changé le premier index est positionné a 1 et il part en carafe( en exception)
Je me demande si on ne doit pas coder int index dans un type plus spécialisé?
Celui qui m'aidera sera :ccool:
les besoins sont ils complet
J'ai fait pas mal d'ajouts dans ce thread, Que manque t il? peut être le code réactualisé
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| int iNbResultFound;
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
ResultSetMetaData metadata = InterbaseManager.myReader.getMetaData();
int typeSQL = metadata.getColumnType( 1);
String nomTypeSQL = metadata.getColumnTypeName( 1);
String typeJava = metadata.getColumnClassName( 1);
try
{
while( InterbaseManager.myReader.next()&& iNbResultFound > 0);
{
java.lang.Integer index = InterbaseManager.myReader.findColumn( "siIdDocument");
WorkElement = new Structure.ElementWork();
int id = InterbaseManager.myReader.getInt( "siIdDocument");
String str = InterbaseManager.myReader.getString( "vcDocument");
WorkElement.Id = id;
WorkElement.wsText = str;
pListText.add( WorkElement);
iNbResultFound--;
}
}
catch( Exception ex)
{
ex.printStackTrace();
} |
Je donne le code d'interbase et le code de MissionDatabase
D'abord MissionDatabase
simplement la methode
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| static Structure.ElementWork WorkElement;
static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
{
ArrayList<Structure.ElementWork> pListText;
int iNbResultFound;
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
ResultSet resultset = InterbaseManager.myReader;
ResultSetMetaData rsmd = resultset.getMetaData();
try
{
iNbResultFound++;
while( resultset.next())
{
WorkElement = new Structure.ElementWork();
if(java.sql.Types.VARCHAR ==rsmd.getColumnType(2))
{
WorkElement.wsText = resultset.getString(2);
}
else
{
System.out.println("On est pas sur du varchar");
}
if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
{
WorkElement.Id = resultset.getInt(1);
}
else
{
System.out.println("On est pas sur de l'integer");
}
pListText.add( WorkElement);
}
}
catch( Exception ex)
{
ex.printStackTrace();
}
return( pListText);
} |
puis interbase:la Methode
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| static int ExecuteSelectRequest( String wsRequest) throws SQLException
{
int iNbResultFound = 0;
String Result;
String stream;
boolean Status;
// IF myConnection" is not NULL) THEN
if( stmt == null)
{
connection = ConnectServer( "", "", "");
}
//
try
{
stmt.execute( wsRequest);
myReader = stmt.getResultSet();
}
catch( Exception ex)
{
ex.printStackTrace();
Status = false;
}
return( iNbResultFound);
}
} |
J'ai modifié le code pour résoudre le problème du while.Compte tenu des différentes modification le getString se passe bien il reste l'int qui part en exeption,je repose la question le fait qu'il soit identity ne pose pas de problème?
le message d'erreur de l'exception est:
Code:
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Index de descripteur non valide
J'ai retiré des static et le compilatuer me les a fait remettre
je te met le bloc des exceptions
Code:
1 2 3 4 5 6 7 8 9 10 11
| java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Index de descripteur non valide
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
at com.all4tec.matelo.linguistique.wizards.MissionDatabaseManager.ReadWork(MissionDatabaseManager.java:89)
at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard.RecupereNomDesFichier(LinguistiqueImportWizard.java:61)
at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard$1.run(LinguistiqueImportWizard.java:87)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121) |
Compte tenu des différentes modification le getString se passe bien il reste l'int qui part en exception,je repose la question le fait qu'il soit identity ne pose pas de problème? Le type de la donnée porté par getInt est int identity (voir plus haut comment on l'a récupéré)
Je te met le code à jour mais il a toujours le même résultat
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
{
ArrayList<Structure.ElementWork> pListText;
int iNbResultFound;
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
ResultSet resultset = InterbaseManager.myReader;
ResultSetMetaData rsmd = resultset.getMetaData();
iNbResultFound = 0;
try
{
while( resultset.next())
{
iNbResultFound++;
WorkElement = new Structure.ElementWork();
WorkElement.wsText = resultset.getString( "vcDocument");
if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
{
int id;
id = resultset.getInt( "siIdDocument");
WorkElement.Id = id;
}
pListText.add( WorkElement);
}
}
catch( Exception ex)
{
ex.printStackTrace();
}
return( pListText);
} |
Je voudrai savoir comment je dois déclarer id pour que ça marche J'ai essaye int identify id; mais c'est refusé par le compilateur
si ce n'est pas l'int, je voudrais savoir si on peut déclarerla base avec un int et...
mettre la copie de l'int identity. éventuelement je peux le faire dans le programme écrit en C++ qui charge la base
Je vous met le code à jour
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
{
ArrayList<Structure.ElementWork> pListText;
int iNbResultFound;
pListText = new ArrayList<Structure.ElementWork>();
String cmd = "SELECT iIdDoc, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
iNbResultFound = 0;
iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
ResultSet resultset = InterbaseManager.myReader;
ResultSetMetaData rsmd = resultset.getMetaData();
iNbResultFound = 0;
try
{
while( resultset.next())
{
iNbResultFound++;
WorkElement = new Structure.ElementWork();
WorkElement.wsText = resultset.getString( "vcDocument");
if(java.sql.Types.INTEGER == rsmd.getColumnType(1))
{
WorkElement.Id = resultset.getInt( "iIdDoc");
}
pListText.add( WorkElement);
}
}
catch( Exception ex)
{
ex.printStackTrace();
}
return( pListText);
} |
J'ai modifié la base et j'ai la même erreur
Je vous met aussi le code de interbasemanger
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| static Connection ConnectServer( String wsLogin, String wsPassword, String wsDatabaseFullPathName) throws SQLException
{
long ErrorCode = 0;
if( ErrorCode == 0)
{
// Provider=SQLNCLI11;User Instance=true;MARS Connection=true;AttachDbFilename=C:\\Programmes\\Microsoft SQLServer\\MSSQL10_50.SQLEXPRESS\\MSSQL\\DATA\\Coherence.mdf;Driver={SQL Server Native Client 11.0};Initial Catalog=Northwind
try
{
// Chargement du pilote JDBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" ).newInstance();
//"Integrated Security=true;Pooling=true;Max Pool Size=100;Timeout=15;MultipleActiveResultSets=true;Type System Version=SQL Server 2014;database=COHERENCE;server=xantia\\SQLEXPRESS"
Properties props = new Properties();
props.setProperty( "Initial Catalog", "Northwind");
props.setProperty( "Auto Reconnect", "true");
props.setProperty( "AttachDbFilename", "C:\\Programmes\\Microsoft SQL Server\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\Coherence.mdf");
props.setProperty( "Type System Version", "SQL Server 2014");
props.setProperty( "Pooling", "true");
props.setProperty( "MaxPoolSize", "100");
props.setProperty( "MultipleActiveResultSets", "true");
props.setProperty( "Timeout", "15");
//props.setProperty( "Driver", "Microsoft SQL Server Express Edition (64-bit)");
//props.setProperty( "Driver Version", "12.0.2000 RTM");
props.setProperty( "databaseName", "Coherence");
props.setProperty( "integratedSecurity", "true");
props.setProperty( "instance","Xantia\\SQLEXPRESS");
props.setProperty( "user","XANTIA\\JeanNoël");
// URL de connexion
String url = "jdbc:odbc:login_DSN";
connection = DriverManager.getConnection( url, props);
stmt = connection.createStatement();
Data.m_bServerConnected = true;
}
catch( Exception ex)
{
ex.printStackTrace();
Data.m_bServerConnected = false;
}
finally
{
}
}
return( connection);
//OD
}
static int ExecuteSelectRequest( String wsRequest) throws SQLException
{
int iNbResultFound = 0;
String Result;
String stream;
boolean Status;
// IF myConnection" is not NULL) THEN
if( stmt == null)
{
connection = ConnectServer( "", "", "");
stmt = connection.createStatement();
}
//
try
{
stmt.execute( wsRequest);
myReader = stmt.getResultSet();
}
catch( Exception ex)
{
ex.printStackTrace();
Status = false;
}
return( iNbResultFound);
}
} |