Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 |
| geometry | VARBINARY | byte[] |
| Geography | VARBINARY | byte[] |
| image | LONGVARBINARY | byte[] |
| int | INTEGER | int |
| json | microsoft.sql.Types.JSON | String |
| 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 |
| sqlvariant | microsoft.sql.Types.SQL_VARIANT | Object |
| 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 |
| vecteur | microsoft.sql.Types.VECTOR | microsoft.sql.Vector |
| Xml | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String SQLXML |
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
Pour lire les valeurs mappées à un type de base JDBC en tant que chaîne ou lorsqu’une valeur fortement typée n’est pas requise, utilisez 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
GetUnicodeStream et getBigDecimal avec des méthodes de mise à l’échelle sont déconseillées et ne sont pas prises en charge par le pilote JDBC.
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 de plus de 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 découvrir 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();
}
Remarque
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
Lorsque vous utilisez des valeurs de paramètre BigDecimal, la précision et l’échelle peuvent être passées avec la valeur via setBigDecimal. L’utilisation de setBigDecimal avec cette méthode évite la troncation de valeur potentielle. Sinon, si l’option calcBigDecimalPrecision de chaîne de connexion est définie truesur , le pilote calcule la précision de l’entrée BigDecimal au nom de l’utilisateur, au coût 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.