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.
Microsoft JDBC Driver pour SQL Server utilise les types de données avancés JDBC pour convertir les types de données SQL Server en un format compris par le langage de programmation Java.
Notes
Le tableau suivant liste les mappages par défaut entre les types de données avancés SQL Server, JDBC et du langage de programmation Java.
| Types SQL Server | Types JDBC (java.sql.Types) | Types langage Java |
|---|---|---|
| varbinary(max) image |
LONGVARBINARY | byte[] (par défaut), Blob, InputStream, String |
| text varchar(max) |
LONGVARCHAR | String (par défaut), Clob, InputStream |
| ntext nvarchar(max) |
LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String (par défaut), Clob, NClob |
| Xml | LONGVARCHAR SQLXML |
Chaîne (valeur par défaut), InputStream, Clob, byte[], Blob, SQLXML |
| Udt1 | VARBINARY | String (par défaut), byte[], InputStream |
| sqlvariant | SQLVARIANT | Object |
| geometry Geography |
VARBINARY | byte[] |
| json | microsoft.sql.Types.JSON | Chaîne (valeur par défaut), InputStream |
| vecteur | microsoft.sql.Types.VECTOR | microsoft.sql.Vector |
1 Le Pilote Microsoft JDBC pour SQL Server prend en charge l'envoi et la récupération d'UDT CLR sous forme de données binaires, et non la manipulation des métadonnées CLR.
Les sections suivantes proposent des exemples d'utilisation du pilote JDBC et des types de données avancés.
Types de données BLOB, CLOB et NCLOB
Le pilote JDBC implémente toutes les méthodes des interfaces java.sql.Blob, java.sql.Clob et java.sql.NClob.
Notes
Les valeurs CLOB peuvent être utilisées avec les types de données SQL Server 2005 (9.x) (ou version ultérieure) de grande valeur. Les types CLOB peuvent en particulier être utilisés avec les types de données varchar(max) et nvarchar(max) , les types BLOB peuvent être utilisés avec les types de données varbinary(max) et image et les types NCLOB peuvent être utilisés avec ntext et nvarchar(max) .
Types de données de grande valeur
Dans les versions antérieures de SQL Server, l'utilisation de types de données de grande valeur nécessitait un traitement spécial. Les types de données à valeur élevée sont des types qui dépassent la taille maximale de ligne de 8 Ko. SQL Server introduit un spécificateur max pour les types de données varchar, nvarchar et varbinary, qui permet le stockage de valeurs pouvant atteindre 2^31 octets. Les colonnes de table et les variables Transact-SQL peuvent spécifier les types de données varchar(max), nvarchar(max) ou varbinary(max).
Les principaux scénarios de travail sur des types de données de grande valeur impliquent l'extraction d'une base de données ou l'ajout à une base de données. Les sections suivantes décrivent les différentes approches de réalisation de ces tâches.
Récupération de types de données de grande valeur à partir d'une base de données
Lorsque vous récupérez un type de données de grande valeur nonbinaire, tel que le type de données varchar(max) d’une base de données, une approche consiste à lire ces données en tant que flux de caractères. L'exemple suivant utilise la méthode executeQuery de la classe SQLServerStatement pour extraire des données de la base de données et les retourner dans un jeu de résultats. Ensuite, la méthode getCharacterStream de la classe SQLServerResultSet est appelée pour lire les données de grande valeur dans le jeu de résultats.
ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);
Notes
Cette même approche peut également être utilisée pour les types de données Text, ntextet nvarchar (max) .
Pour récupérer un type de données à valeur élevée binaire, par exemple varbinary(max) , dans une base de données, plusieurs approches sont possibles. L’approche la plus efficace consiste à lire les données en tant que flux binaire, comme dans l’exemple suivant :
ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);
Vous pouvez également utiliser la méthode getBytes pour lire les données en tant que tableau d’octets, comme dans l’exemple :
ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);
Notes
Vous pouvez également lire les donnés en tant que BLOB. Toutefois, la lecture d’un objet BLOB est moins efficace que les deux méthodes indiquées précédemment.
Ajout de types de données de grande valeur à une base de données
Le téléchargement de données de grande valeur avec le pilote JDBC fonctionne correctement dans les cas de correspondance avec la taille de la mémoire ; dans les cas de dépassement de la taille de la mémoire, la transmission de flux de données en continu constitue l'option principale. Cependant, la méthode la plus efficace consiste à télécharger des données de grande valeur via les interfaces de flux.
L’utilisation d’une chaîne ou d’octets est également une option, comme dans l’exemple suivant :
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();
Notes
Cette approche peut également être utilisée pour les valeurs stockées dans des colonnes text, ntext et nvarchar(max) .
Si vous disposez d'une bibliothèque d'images sur le serveur et que vous devez charger des fichiers image binaires entiers dans une colonne varbinary(max) , la méthode la plus efficace impliquant le pilote JDBC consiste à utiliser directement les flux, comme dans l’exemple suivant :
try (PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)")) {
File inputFile = new File("CLOBFile20mb.jpg");
try (FileInputStream inStream = new FileInputStream(inputFile)) {
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
}
}
Notes
L’utilisation de la méthode CLOB ou BLOB n’est pas un moyen efficace de charger des données volumineuses.
Modification de types de données de grande valeur dans une base de données
Dans la plupart des cas, la méthode recommandée pour mettre à jour ou modifier des valeurs élevées dans la base de données est de passer des paramètres à travers les classes SQLServerPreparedStatement et SQLServerCallableStatement en utilisant des commandes Transact-SQL comme UPDATE, WRITE et SUBSTRING.
Si vous devez remplacer l’instance d’un mot dans un fichier texte volumineux, tel qu’un fichier HTML archivé, vous pouvez utiliser un objet Clob, comme dans l’exemple suivant :
String SQL = "SELECT * FROM test1;";
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)
ResultSet rs = stmt.executeQuery(SQL)) {
rs.next();
Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(pos, "cat");
rs.updateClob(2, clob);
rs.updateRow();
}
De plus, vous pouvez effectuer tout le travail sur le serveur et simplement transmettre les paramètres à une instruction UPDATE préparée.
Pour plus d'informations sur les types de données de grande valeur, consultez « Utilisation de types de données de grande valeur » dans la documentation en ligne de SQL Server.
Type de données XML
SQL Server propose un type de données xml qui vous permet de stocker des documents et des fragments XML dans une base de données SQL Server. Le type de données xml est intégré dans SQL Server et s’apparente à certains égards à d’autres types intégrés, comme int et varchar. Comme d’autres types intégrés, vous pouvez utiliser le type de données xml comme type de colonne pour créer une table, comme type de variable, type de paramètre ou type de retour de fonction, ou dans les fonctions Transact-SQL CAST et CONVERT.
Dans le pilote JDBC, le type de données xml peut être mappé en tant que chaîne, tableau d’octets, flux, objet CLOB, objet BLOB ou objet SQLXML. La chaîne est la valeur par défaut. Dans JDBC Driver version 2.0 et ultérieure, le pilote JDBC prend en charge l’API JDBC 4.0, qui introduit l’interface SQLXML. L’interface SQLXML définit des méthodes d’interaction et de manipulation des données XML. Le type de données SQLXML correspond au type de données SQL Server xml. Pour savoir comment lire et écrire des données XML dans la base de données relationnelle avec le type de données Java SQLXML, consultez Prise en charge des données XML.
L’implémentation du type de données xml dans le pilote JDBC permet la prise en charge des éléments suivants :
Accès à XML en tant que chaîne standard Java UTF-16 pour les scénarios de programmation les plus courants
Entrée de XML en UTF-8 ou codé sur 8 bits
Accès à XML en tant que tableau d'octets avec un BOM de début lors de l'encodage en UTF-16 pour l'échange avec d'autres processeurs XML et fichiers de disque
Avec SQL Server, il est nécessaire d’ajouter une marque d'ordre d'octet au début des fichiers XML encodés en UTF-16. L’application doit fournir le boM principal lorsque les valeurs de paramètre XML sont fournies en tant que tableaux d’octets. SQL Server retourne toujours les valeurs XML sous forme de chaînes UTF-16 sans marque d'ordre d'octet ou déclaration d’encodage incorporée. Lorsque les valeurs XML sont récupérées sous forme d’octet[], BinaryStream ou Blob, un boM UTF-16 est ajouté à la valeur.
Pour plus d’informations sur le type de données xml, voir « Type de données xml » dans la Documentation en ligne de SQL Server.
Type de données défini par l'utilisateur
L’introduction des types définis par l’utilisateur (UDT) dans SQL Server 2005 (9.x) étend le système de type SQL en permettant de stocker des objets et des structures de données personnalisées dans une base de données SQL Server. Les UDT peuvent contenir plusieurs types de données et avoir des comportements, ce qui les différencie des types de données d'alias traditionnels qui ne comportent qu'un seul type de données système SQL Server. Les UDT sont définis à l’aide de l’un des langages pris en charge par microsoft .NET Common Language Runtime (CLR) qui produisent du code vérifiable, y compris Microsoft Visual C# et Visual Basic .NET. Les données sont exposées sous forme de champs et de propriétés d’une classe ou d’une structure .NET Framework, les méthodes de la classe ou de la structure définissent des comportements.
Dans SQL Server, un type UDT peut être utilisé comme définition de colonne d’une table, comme variable dans un lot Transact-SQL ou comme argument d’une fonction ou d’une procédure stockée Transact-SQL.
Pour plus d’informations sur les types de données définis par l’utilisateur, voir « Utiliser et modifier des instances de types définis par l’utilisateur » dans la Documentation en ligne de SQL Server.
Type de données Sql_variant
Pour plus d’informations sur le type de données sql_variant, consultez Utilisation du type de données Sql_variant.
Types de données spatiales
Pour plus d’informations sur le type de données spatiales, consultez Utilisation du type de données spatiales.
Type de données JSON
Pour plus d’informations sur le type de données JSON, consultez le type de données JSON.
Type de données vectorielles
Pour plus d’informations sur le type de données vectorielles, consultez Le type de données Vector.