Utilisation des types de données de base
Le pilote Microsoft JDBC pour SQL Server utilise les types de données JDBC de base pour convertir les types de données SQL Server en un format compréhensible par le langage de programmation Java, et vice et versa. Le pilote JDBC prend en charge l'API JDBC 4.0, qui inclut le type de données SQLXML et les types de données nationaux (Unicode), par exemple NCHAR, NVARCHAR, LONGNVARCHAR et NCLOB.
Mappages de types de données
Le tableau suivant répertorie les mappages par défaut entre les types de données de base SQL Server, JDBC et du langage de programmation Java :
Types SQL Server | Types JDBC (java.sql.Types) | Types langage Java |
---|---|---|
bigint | bigint | long |
binary | BINARY | byte[] |
bit | BIT | boolean |
char | CHAR | String |
Date | DATE | java.sql.Date |
DateHeure3 | timestamp | java.sql.Timestamp |
datetime2 | timestamp | java.sql.Timestamp |
datetimeoffset2 | microsoft.sql.Types.DATETIMEOFFSET | microsoft.sql.DateTimeOffset |
Décimal | DECIMAL | java.math.BigDecimal |
float | DOUBLE | double |
image | LONGVARBINARY | byte[] |
int | INTEGER | int |
money | DECIMAL | java.math.BigDecimal |
NCHAR | CHAR NCHAR (Java SE 6.0) |
String |
ntext | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String |
numeric | NUMERIC | java.math.BigDecimal |
NVARCHAR | VARCHAR NVARCHAR (Java SE 6.0) |
String |
nvarchar(max) | VARCHAR NVARCHAR (Java SE 6.0) |
String |
real | real | float |
smalldatetime | timestamp | java.sql.Timestamp |
SMALLINT | SMALLINT | short |
SMALLMONEY | DECIMAL | java.math.BigDecimal |
text | LONGVARCHAR | String |
time | TIME1 | java.sql.Time1 |
timestamp | BINARY | byte[] |
TINYINT | TINYINT | short |
udt | VARBINARY | byte[] |
UNIQUEIDENTIFIER | CHAR | String |
varbinary | VARBINARY | byte[] |
varbinary(max) | VARBINARY | byte[] |
varchar | VARCHAR | String |
varchar(max) | VARCHAR | String |
Xml | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String SQLXML |
sqlvariant | microsoft.sql.Types.SQL_VARIANT | Object |
geometry | VARBINARY | byte[] |
Geography | VARBINARY | byte[] |
1 Pour utiliser java.sql.Time avec le type d’heure SQL Server, vous devez affecter à la propriété de connexion sendTimeAsDatetime la valeur False.
2 Vous pouvez accéder par programme aux valeurs de datetimeoffset avec la classe DateTimeOffset.
3 Les valeurs java.sql.Timestamp ne peuvent plus être utilisées pour comparer des valeurs d’une colonne DateHeure à partir de SQL Server 2016. Cette limitation est due à une modification côté serveur qui convertit DateHeure en DateHeure2 de façon différente, ce qui génère des valeurs inégales. Pour contourner ce problème, vous pouvez soit modifier les colonnes DateHeure en DateHeure2(3), utiliser String au lieu de java.sql.Timestamp ou modifier le niveau de compatibilité de la base de données par 120 ou en dessous.
Les sections suivantes proposent des exemples d'utilisation du pilote JDBC et des types de données de base. Pour obtenir un exemple plus détaillé sur l’utilisation des types de données de base dans une application Java, consultez Exemple de types de données de base.
Extraction de données sous la forme d'une chaîne
Si vous devez récupérer des données d’une source de données qui correspond à l’un des types de données de base JDBC pour les afficher en tant que chaîne, ou si des données fortement typées ne sont pas nécessaires, appliquez la méthode getString de la classe SQLServerResultSet. L’exemple suivant illustre cette utilisation :
try(Statement stmt = con.createStatement();) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getString("job_id");
}
Extraction de données par type de données
Si vous devez récupérer des données d’une source de données et que vous connaissez le type des données récupérées, utilisez l’une des méthodes get<Type> de la classe SQLServerResultSet, également appelées méthodes getter. Vous pouvez utiliser un nom de colonne ou un index de colonne avec les méthodes get<Type>, comme dans l'exemple suivant :
try(Statement stmt = con.createStatement();) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getShort("job_id");
}
Remarque
Le pilote JDBC déconseille et ne prend pas en charge les méthodes getUnicodeStream et getBigDecimal avec échelle.
Mise à jour des données par type de données
Si vous devez mettre à jour la valeur d’un champ dans une source de données, utilisez l’une des méthodes update<Type> de la classe SQLServerResultSet. Dans l’exemple suivant, la méthode updateInt est appliquée avec la méthode updateRow pour mettre à jour les données dans la source de données :
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
rs.next();
int empJobID = rs.getInt(2);
empJobID++;
rs.first();
rs.updateInt(2, empJobID);
rs.updateRow();
}
Remarque
Le pilote JDBC ne peut pas mettre à jour une colonne SQL Server avec un nom de colonne dont la longueur dépasse 127 caractères. Si une mise à jour est tentée sur une colonne dont le nom dépasse 127 caractères, une exception est levée.
Mise à jour des données par requête paramétrable
Si vous mettez à jour des données dans une source de données en utilisant une requête paramétrable, vous pouvez définir le type de données des paramètres en utilisant une des méthodes set<Type> de la classe SQLServerPreparedStatement. Ces méthodes sont également appelées méthodes setter. Dans l’exemple suivant, la méthode prepareStatement est utilisée pour précompiler la requête paramétrable, puis la méthode setString est utilisée pour définir la valeur de chaîne du paramètre avant d’appeler la méthode executeUpdate.
try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
String name = "Bob";
pstmt.setString(1, name);
int rowCount = pstmt.executeUpdate();
}
Pour plus d’informations sur les requêtes paramétrables, consultez Utilisation d’une instruction SQL avec des paramètres.
Transmission de paramètres à une procédure stockée
Si vous devez passer des paramètres typés dans une procédure stockée, vous pouvez définir les paramètres par index ou par nom en utilisant une des méthodes set<Type> de la classe SQLServerCallableStatement. Dans l’exemple suivant, la méthode prepareCall est utilisée pour configurer l’appel de la procédure stockée, puis la méthode setString est utilisée pour définir le paramètre de l’appel avant l’appel de la méthode executeQuery.
try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
String lname = "Brown";
cstmt.setString(1, lname);
ResultSet rs = cstmt.executeQuery();
}
Notes
Dans cet exemple, un jeu de résultats est retourné avec les résultats de l'exécution de la procédure stockée.
BigDecimal
Lors de l’utilisation de valeurs de paramètres BigDecimal, la précision et l’échelle peuvent être transmises avec la valeur par l’intermédiaire de setBigDecimal
. L’utilisation de setBigDecimal
avec cette méthode évite la troncation de valeur potentielle. Sinon, si l’option de chaîne de connexion calcBigDecimalPrecision
est définie sur true
, le pilote calcule la précision de l’entrée BigDecimal au nom de l’utilisateur, au détriment des performances. Si la valeur est transmise seule, sans calcBigDecimalPrecision
, ou si l’option est définie sur false
, le pilote prend la valeur maximale autorisée (38) pour la précision de cette valeur BigDecimal.
Pour plus d'informations sur l'utilisation du pilote JDBC avec les procédures stockées et les paramètres d'entrée, consultez Utilisation d'une procédure stockée avec des paramètres d'entrée.
Extraction de paramètres à partir d'une procédure stockée
Si vous devez récupérer des paramètres d’une procédure stockée, vous devez tout d’abord inscrire un paramètre out
par nom ou index à l’aide de la méthode registerOutParameter de la classe SQLServerCallableStatement. Attribuez ensuite le paramètre out retourné à une variable appropriée après l’exécution de l’appel de la procédure stockée. Dans l’exemple suivant, la méthode prepareCall est utilisée pour configurer l’appel de la procédure stockée, la méthode registerOutParameter est utilisée pour configurer le paramètre out
, puis la méthode setString est utilisée pour définir le paramètre pour l’appel avant l’appel de la méthode executeQuery. La valeur du paramètre out
de la procédure stockée est récupérée à l’aide de la méthode getShort.
try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
String lname = "Brown";
cstmt.setString(1, lname);
ResultSet rs = cstmt.executeQuery();
short empJobID = cstmt.getShort(2);
}
Remarque
Outre le paramètre OUT retourné, un jeu de résultats peut également être retourné avec les résultats de l'exécution de la procédure stockée.
Pour plus d'informations sur l'utilisation du pilote JDBC avec les procédures stockées et les paramètres de sortie, consultez Utilisation d'une procédure stockée avec des paramètres de sortie.