Använda avancerade datatyper

Ladda ned JDBC-drivrutin

Microsoft JDBC-drivrutinen för SQL Server använder JDBC-avancerade datatyper för att konvertera SQL Server-datatyperna till ett format som förstås av programmeringsspråket Java.

Anmärkningar

I följande tabell visas standardmappningar mellan avancerade datatyper för SQL Server, JDBC och Java-programmeringsspråk.

SQL Server-typer JDBC-typer (java.sql.Types) Java-språktyper
varbinary(max)

bild
LONGVARBINARY byte[] (standard), Blob, InputStream, String
texten

varchar(max)
LONGVARCHAR Sträng (standard), Clob, InputStream
ntext

nvarchar(max)
LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Sträng (standard), Clob, NClob
xml LONGVARCHAR

SQLXML
Sträng (standard), InputStream, Clob, byte[], Blob, SQLXML
Udt1 VARBINARY Sträng (standard), byte[], InputStream
sqlvariant SQLVARIANT Object
geometri

geografi
VARBINARY byte[]
json microsoft.sql.Types.JSON Sträng (standard), InputStream
vektor microsoft.sql.Types.VECTOR microsoft.sql.Vector

1 Microsoft JDBC-drivrutinen för SQL Server stöder sändning och hämtning av CLR UDT som binära data, men stöder inte manipulering av CLR-metadata.

Följande avsnitt innehåller exempel på hur du kan använda JDBC-drivrutinen och de avancerade datatyperna.

BLOB- och CLOB- och NCLOB-datatyper

JDBC-drivrutinen implementerar alla metoder i gränssnitten java.sql.Blob, java.sql.Clob och java.sql.NClob.

Anmärkning

CLOB-värden kan användas med SQL Server 2005 (9.x) (eller senare) stora datatyper. Mer specifikt kan CLOB-typer användas med datatyperna varchar(max) och nvarchar(max), BLOB-typer kan användas med varbinary(max) och bilddatatyper , och NCLOB-typer kan användas med ntext och nvarchar(max).

Datatyper med stort värde

I tidigare versioner av SQL Server krävs särskild hantering för att arbeta med datatyper med stora värden. Datatyper med stort värde är typer som överskrider den maximala radstorleken på 8 kB. SQL Server introducerar en maxspecificerare för datatyperna varchar, nvarchar och varbinary för att tillåta lagring av värden så stora som 2^31 byte. Tabellkolumner och Transact-SQL variabler kan ange datatyperna varchar(max), nvarchar(max) eller varbinary(max ).

De primära scenarierna för att arbeta med stora värdetyper är att hämta dem från en databas eller lägga till dem i en databas. I följande avsnitt beskrivs olika metoder för att utföra dessa uppgifter.

Hämta typer av stora värden från en databas

När du hämtar en ickebinär datatyp med stort värde, till exempel datatypen varchar(max) från en databas, är en metod att läsa dessa data som en teckenström. I följande exempel används metoden executeQuery för klassen SQLServerStatement för att hämta data från databasen och returnera dem som en resultatuppsättning. Sedan används metoden getCharacterStream för klassen SQLServerResultSet för att läsa data med stort värde från resultatuppsättningen.

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);

Anmärkning

Samma metod kan också användas för datatyperna text, ntext och nvarchar(max).

När du hämtar en binär datatyp med stort värde, till exempel datatypen varbinary(max) från en databas, finns det flera metoder som du kan använda. Den mest effektiva metoden är att läsa data som en binär ström, som i följande exempel:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);

Du kan också använda metoden getBytes för att läsa data som en bytematris, som i exemplet:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);

Anmärkning

Du kan också läsa data som en BLOB. Att läsa en BLOB är dock mindre effektivt än de två metoder som visades tidigare.

Lägga till stora värdetyper i en databas

Att ladda upp stora data med JDBC-drivrutinen fungerar bra för de minnesstora fallen, och i fall som är större än minnet är strömning det primära alternativet. Det mest effektiva sättet att ladda upp stora data är dock via strömgränssnitten.

Att använda en sträng eller byte är också ett alternativ, som i följande exempel:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();

Anmärkning

Den här metoden kan också användas för värden som lagras i kolumnerna text, ntext och nvarchar(max).

Om du har ett avbildningsbibliotek på servern och måste ladda upp hela binära avbildningsfiler till en kolumn med varbinary(max) är den mest effektiva metoden med JDBC-drivrutinen att använda strömmar direkt, som i följande:

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();
  }
}

Anmärkning

Att använda antingen CLOB- eller BLOB-metoden är inte ett effektivt sätt att ladda upp stora data.

Ändra typer av stora värden i en databas

I de flesta fall är den rekommenderade metoden för att uppdatera eller ändra stora värden i databasen att skicka parametrar via klasserna SQLServerPreparedStatement och SQLServerCallableStatement med hjälp av Transact-SQL kommandon som UPDATE, WRITEoch SUBSTRING.

Om du måste ersätta instansen av ett ord i en stor textfil, till exempel en arkiverad HTML-fil, kan du använda ett Clob-objekt, som i följande exempel:

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();
}

Dessutom kan du utföra allt arbete på servern och bara skicka parametrar till en förberedd UPDATE-instruktion.

Mer information om typer av stora värden finns i "Använda Large-Value typer" i SQL Server Books Online.

XML-datatyp

SQL Server tillhandahåller en XML-datatyp som gör att du kan lagra XML-dokument och fragment i en SQL Server-databas. XML-datatypen är en inbyggd datatyp i SQL Server och liknar på sätt och vis andra inbyggda typer, till exempel int och varchar. Precis som med andra inbyggda typer kan du använda xml-datatypen som kolumntyp när du skapar en tabell. som variabeltyp, parametertyp eller funktionsreturtyp. eller i Transact-SQL CAST- och CONVERT-funktioner.

I JDBC-drivrutinen kan xml-datatypen mappas som ett String-, byte-matris-, stream-, CLOB-, BLOB- eller SQLXML-objekt. Strängen är standard. I JDBC-drivrutinsversion 2.0 och senare ger JDBC-drivrutinen stöd för JDBC 4.0-API:et, som introducerar SQLXML-gränssnittet. SQLXML-gränssnittet definierar metoder för att interagera och manipulera XML-data. SQLXML-datatypen mappar tillSQL Server xml-datatypen. Mer information om hur du läser och skriver XML-data från och till relationsdatabasen med SQLXMLJava-datatypen finns i Stöd för XML-data.

Implementeringen av xml-datatypen i JDBC-drivrutinen ger stöd för följande:

  • Åtkomst till XML som en Java UTF-16-standardsträng för de vanligaste programmeringsscenarierna

  • Indata för UTF-8 och annan 8-bitars kodad XML

  • Åtkomst till XML som en bytematris med en ledande bom när den kodas i UTF-16 för utbyte med andra XML-processorer och diskfiler

SQL Server kräver en ledande BOM för UTF-16-kodad XML. Programmet måste ange den ledande bommen när XML-parametervärden anges som bytematriser. SQL Server matar alltid ut XML-värden som UTF-16-strängar utan bom eller inbäddad kodningsdeklaration. När XML-värden hämtas som byte[], BinaryStream eller Blob, förbereds en UTF-16 BOM till värdet.

Mer information om xml-datatypen finns i "xml Data Type" i SQL Server Books Online.

Användardefinierad datatyp

Introduktionen av användardefinierade typer (UDT) i SQL Server 2005 (9.x) utökar SQL-typsystemet genom att du kan lagra objekt och anpassade datastrukturer i en SQL Server-databas. UDT kan innehålla flera datatyper och kan ha beteenden, vilket skiljer dem från de traditionella aliasdatatyperna som består av en enda SQL Server-systemdatatyp. UDT definieras med något av de språk som stöds av Microsoft .NET Common Language Runtime (CLR) som producerar verifierbar kod, inklusive Microsoft Visual C# och Visual Basic .NET. Data exponeras som fält och egenskaper för en .NET Framework-baserad klass eller struktur, metoder för klassen eller strukturen definierar beteenden.

I SQL Server kan en UDT användas som kolumndefinition för en tabell, som en variabel i en Transact-SQL batch, eller som ett argument för en Transact-SQL funktion eller lagrad procedur.

Mer information om användardefinierade datatyper finns i "Använda och ändra instanser av användardefinierade typer" i SQL Server Books Online.

Sql_variant datatyp

Information om sql_variant datatyp finns i Använda Sql_variant datatyp.

Spatiala datatyper

Information om spatiala datatyper finns i Använda spatiala datatyper.

JSON-datatyp

Information om JSON-datatyp finns i JSON-datatyp.

Datatyp för vektor

Information om typ av vektordata finns i Vektordatatyp.

Se även

Förstå JDBC-drivrutinsdatatyperna