Udostępnij za pośrednictwem


Korzystanie z podstawowych typów danych

pobierz sterownik JDBC

Sterownik JDBC firmy Microsoft dla programu SQL Server używa podstawowych typów danych JDBC do konwertowania typów danych programu SQL Server na format zrozumiały dla języka programowania Java i na odwrót. Sterownik JDBC zapewnia obsługę interfejsu API JDBC 4.0, który obejmuje typ danych SQLXML i typy danych National (Unicode), takie jak NCHAR, NVARCHAR, LONGNVARCHAR i NCLOB.

Mapowania typów danych

W poniższej tabeli wymieniono domyślne mapowania między podstawowymi typami danych programu SQL Server, JDBC i Języka programowania Java:

Typy programu SQL Server Typy JDBC (java.sql.Types) Typy języków Java
bigint BIGINT long
binarny BINARY byte[]
bit BIT typ logiczny (boolowski)
char CHAR Sznurek
date DATE java.sql.Date
data/godzina3 ZNACZNIK CZASU java.sql.Sygnatura czasowa
datetime2 ZNACZNIK CZASU java.sql.Sygnatura czasowa
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
liczba dziesiętna DZIESIĘTNY java.math.BigDecimal
float PODWÓJNY podwójny
geometria VARBINARY byte[]
geografia VARBINARY byte[]
obraz LONGVARBINARY byte[]
int INTEGER int
JSON microsoft.sql.Types.JSON Sznurek
pieniądze DZIESIĘTNY java.math.BigDecimal
nchar CHAR

NCHAR (Java SE 6.0)
Sznurek
ntekst LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Sznurek
numeryczny Liczbowy java.math.BigDecimal
nvarchar VARCHAR

NVARCHAR (Java SE 6.0)
Sznurek
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
Sznurek
real PRAWDZIWY float
smalldatetime ZNACZNIK CZASU java.sql.Sygnatura czasowa
smallint SMALLINT krótki
smallmoney DZIESIĘTNY java.math.BigDecimal
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
SMS LONGVARCHAR Sznurek
time GODZINA1 java.sql.Time1
sygnatura czasowa BINARY byte[]
tinyint TINYINT krótki
Udt VARBINARY byte[]
uniqueidentifier CHAR Sznurek
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR Sznurek
varchar(max) VARCHAR Sznurek
wektor microsoft.sql.Types.VECTOR microsoft.sql.Vector
XML LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Sznurek

SQLXML

1 Aby użyć java.sql.Time z typem programu SQL Server, należy ustawić właściwość połączenia sendTimeAsDatetime na wartość false.

2 Za pomocą klasy DateTimeOffset można programowo uzyskać dostęp do wartości typu datetimeoffset.

3 java.sql.Wartości sygnatury czasowej nie mogą być już używane do porównywania wartości z kolumny datetime rozpoczynającej się od programu SQL Server 2016. To ograniczenie jest spowodowane zmianą po stronie serwera, która konwertuje datę/godzinę na data/godzina2 inaczej, co powoduje, że wartości nie są równe. Obejściem tego problemu jest zmiana kolumn daty/godziny na datetime2(3), użycie ciągu zamiast java.sql.Sygnatura czasowa lub zmiana poziomu zgodności bazy danych na 120 lub niższą.

W poniższych sekcjach przedstawiono przykłady użycia sterownika JDBC oraz podstawowe typy danych. Aby uzyskać bardziej szczegółowy przykład używania podstawowych typów danych w aplikacji Java, zobacz Przykład podstawowe typy danych.

Pobieranie danych jako ciągu

Aby odczytać wartości zamapowane na dowolny podstawowy typ JDBC jako ciąg lub gdy silnie typowana wartość nie jest wymagana, użyj metody getString klasy SQLServerResultSet . W poniższym przykładzie pokazano to użycie:

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

Pobieranie danych według typu danych

Jeśli musisz pobrać dane ze źródła danych i znasz typ pobieranych danych, użyj jednej z metod get<type> klasy SQLServerResultSet, znanej również jako metody getter. Możesz użyć nazwy kolumny lub indeksu kolumny z metodami get<Type> , jak w poniższym przykładzie:

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

Uwaga / Notatka

Metody getUnicodeStream i getBigDecimal z metodami skalowania są przestarzałe i nie są obsługiwane przez sterownik JDBC.

Aktualizowanie danych według typu danych

Jeśli musisz zaktualizować wartość pola w źródle danych, użyj jednej z metod typu aktualizacji<> klasy SQLServerResultSet. W poniższym przykładzie metoda updateInt jest używana z metodą updateRow w celu zaktualizowania danych w źródle danych:

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

Uwaga / Notatka

Sterownik JDBC nie może zaktualizować kolumny programu SQL Server o nazwie kolumny, która jest dłuższa niż 127 znaków. Jeśli podjęto próbę aktualizacji do kolumny, której nazwa jest większa niż 127 znaków, zgłaszany jest wyjątek.

Aktualizowanie danych według zapytania sparametryzowanego

W przypadku aktualizowania danych w źródle danych przy użyciu zapytania sparametryzowanego można ustawić typ danych parametrów przy użyciu jednej z metod typu< zestawu>klasy SQLServerPreparedStatement. Te metody są również nazywane metodami ustawiania. W poniższym przykładzie metoda prepareStatement służy do wstępnego kompilowania sparametryzowanego zapytania, a następnie metoda setString służy do ustawiania wartości ciągu parametru przed wywołaniem metody executeUpdate .

try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
    String name = "Bob";
    pstmt.setString(1, name);
    int rowCount = pstmt.executeUpdate();
}

Aby uzyskać więcej informacji na temat sparametryzowanych zapytań, zobacz Używanie instrukcji SQL z parametrami.

Przekazywanie parametrów do procedury składowanej

Jeśli musisz przekazać parametry wpisane do procedury składowanej, możesz ustawić parametry według indeksu lub nazwy przy użyciu jednej z ustawionych<metod typu> klasy SQLServerCallableStatement . W poniższym przykładzie metoda prepareCall służy do konfigurowania wywołania procedury składowanej, a następnie metoda setString służy do ustawiania parametru wywołania przed wywołaniem metody executeQuery .

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
}

Uwaga / Notatka

W tym przykładzie zestaw wyników jest zwracany z wynikami uruchomienia procedury składowanej.

BigDecimal

W przypadku używania wartości parametrów BigDecimal precyzja i skala można przekazać wraz z wartością za pomocą metody setBigDecimal. Użycie setBigDecimal w ten sposób pozwala uniknąć obcinania potencjalnych wartości. Alternatywnie, jeśli opcja calcBigDecimalPrecision parametrów połączenia jest ustawiona na true, sterownik oblicza precyzję danych wejściowych BigDecimal w imieniu użytkownika, kosztem wydajności. Jeśli wartość jest przekazywana samodzielnie, bez calcBigDecimalPrecision ustawienia lub opcja ustawiona na falsewartość , sterownik przyjmuje maksymalną dozwoloną wartość (38) dla precyzji dla tej wartości BigDecimal.

Aby uzyskać więcej informacji na temat używania sterownika JDBC z procedurami składowanymi i parametrami wejściowymi, zobacz Używanie procedury składowanej z parametrami wejściowymi.

Pobieranie parametrów z procedury składowanej

Jeśli musisz pobrać parametry z procedury składowanej, musisz najpierw zarejestrować out parametr według nazwy lub indeksu przy użyciu metody registerOutParameter klasy SQLServerCallableStatement. Następnie przypisz zwrócony parametr do odpowiedniej zmiennej po uruchomieniu wywołania procedury składowanej. W poniższym przykładzie metoda prepareCall służy do konfigurowania wywołania procedury składowanej, metoda registerOutParameter służy do konfigurowania parametru out , a następnie metoda setString służy do ustawiania parametru dla wywołania przed wywołaniem metody executeQuery. Wartość out parametru procedury składowanej jest pobierana przy użyciu metody 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);
}

Uwaga / Notatka

Oprócz zwróconego parametru zestaw wyników może być również zwracany z wynikami uruchomienia procedury składowanej.

Aby uzyskać więcej informacji na temat używania sterownika JDBC z procedurami składowanymi i parametrami wyjściowymi, zobacz Używanie procedury składowanej z parametrami wyjściowymi.

Zobacz także

Opis typów danych sterownika JDBC