Uso di tipi di dati di base

Scaricare il driver JDBC

Microsoft JDBC Driver per SQL Server utilizza i tipi di dati JDBC di base per convertire i tipi di dati SQL Server in un formato comprensibile al linguaggio di programmazione Java e viceversa. Il driver JDBC offre supporto per l'API di JDBC 4.0, che include il tipo di dati SQLXML e i tipi di dati National (Unicode) come NCHAR, NVARCHAR, LONGNVARCHAR e NCLOB.

Mapping di tipi di dati

Nella tabella seguente sono elencati i mapping predefiniti tra i tipi di dati di base di SQL Server, JDBC e del linguaggio di programmazione Java:

Tipi di SQL Server Tipi JDBC (java.sql.Types) Tipi del linguaggio Java
bigint bigint long
binary BINARY byte[]
bit BIT boolean
char CHAR String
data DATE java.sql.Date
datetime3 TIMESTAMP java.sql.Timestamp
datetime2 TIMESTAMP java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
decimal 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
Testo 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
ntext VARCHAR String
xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Oggetto
geometria VARBINARY byte[]
geografia VARBINARY byte[]

1 Per usare java.sql.Time con il tipo time di SQL Server, è necessario impostare la proprietà di connessione sendTimeAsDatetime su false.

2 È possibile accedere a livello di codice ai valori di datetimeoffset con la classe DateTimeOffset.

3 A partire da SQL Server 2016 non è più possibile usare i valori java.sql.Timestamp per confrontare i valori di una colonna datetime. Questa limitazione è dovuta a una modifica sul lato server che converte datetime in datetime2 in modo diverso, ottenendo valori valori non uguali. La soluzione alternativa a questo problema consiste nel modificare le colonne di tipo datetime in datetime2(3), usare un String anziché java.sql.Timestamp o modificare il livello di compatibilità del database su 120 o inferiore.

Nelle sezioni seguenti vengono forniti esempi di come sia possibile utilizzare il driver JDBC e i tipi di dati di base. Per un esempio più dettagliato dell'utilizzo dei tipi di dati di base in un'applicazione Java, vedere Esempio di tipi di dati di base.

Recupero di dati in forma di stringa

Se è necessario recuperare dati da un'origine dati con mapping a uno qualsiasi dei tipi di dati JDBC di base, per visualizzarli come stringa, o se non sono richiesti dati fortemente tipizzati, è possibile usare il metodo getString della classe SQLServerResultSet. Nell'esempio riportato di seguito viene illustrata questa situazione:

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

Recupero di dati per tipo di dati

Se è necessario recuperare dati di cui si conosce il tipo da un'origine dati, usare uno dei metodi get<Type> della classe SQLServerResultSet, noti anche come metodi getter. Con i metodi get<Type> è possibile usare un nome o un indice di colonna, come nell'esempio seguente:

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

Nota

I metodi con scala getUnicodeStream e getBigDecimal sono deprecati e non sono supportati dal driver JDBC.

Aggiornamento di dati per tipo di dati

Se è necessario aggiornare il valore di un campo in un'origine dati, usare uno dei metodi update<Type> della classe SQLServerResultSet. Nell'esempio seguente il metodo updateInt viene usato insieme al metodo updateRow per aggiornare i dati nell'origine dati:

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

Nota

Il driver JDBC non è in grado di aggiornare una colonna SQL Server il cui nome contiene più di 127 caratteri. Se si tenta di aggiornare una colonna il cui nome contiene più di 127 caratteri, verrà generata un'eccezione.

Aggiornamento di dati mediante query con parametri

Se è necessario aggiornare dati in un'origine dati usando una query con parametri, è possibile impostare il tipo di dati dei parametri usando uno dei metodi set<Type> della classe SQLServerPreparedStatement. Questi metodi sono noti anche come metodi setter. Nell'esempio seguente viene usato il metodo prepareStatement per precompilare la query con parametri, quindi viene usato il metodo setString per impostare il valore stringa del parametro prima di chiamare il metodo executeUpdate.

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

Per altre informazioni sulle query con parametri, vedere Uso di istruzioni SQL con parametri.

Passaggio di parametri a una stored procedure

Se è necessario passare parametri tipizzati in una stored procedure, è possibile impostare i parametri in base all'indice o al nome usando uno dei metodi set<Type> della classe SQLServerCallableStatement. Nell'esempio seguente viene usato il metodo prepareCall per impostare la chiamata alla stored procedure, quindi viene usato il metodo setString per impostare il parametro per la chiamata prima di chiamare il metodo executeQuery.

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

Nota

In questo esempio viene restituito un set di risultati con i risultati dell'esecuzione della stored procedure.

BigDecimal

Quando si usano i valori dei parametri BigDecimal, è possibile passare la precisione e la scala insieme al valore tramite setBigDecimal. L'utilizzo di setBigDecimal in questo modo evita il potenziale troncamento del valore. In alternativa, se l'opzione della stringa di connessione calcBigDecimalPrecision è impostata su true, il driver calcolerà la precisione per l'input BigDecimal per conto dell'utente, a scapito delle prestazioni. Se il valore viene passato da solo, senza l'impostazione calcBigDecimalPrecision, o l'opzione è impostata su false, il driver considera il valore massimo consentito (38) per la precisione per tale valore BigDecimal.

Per altre informazioni sull'uso del driver JDBC con stored procedure e parametri di input, vedere Uso di una stored procedure con parametri di input.

Recupero di parametri da una stored procedure

Se è necessario recuperare parametri da una stored procedure, occorre innanzitutto registrare un parametro out in base al nome o all'indice, usando il metodo registerOutParameter della classe SQLServerCallableStatement. Assegnare quindi il parametro out restituito a una variabile appropriata dopo l'esecuzione della chiamata alla stored procedure. Nell'esempio seguente viene usato il metodo prepareCall per configurare la chiamata alla stored procedure, quindi viene usato il metodo registerOutParameter per configurare il parametro out e infine viene usato il metodo setString per impostare il parametro per la chiamata prima di chiamare il metodo executeQuery. Il valore restituito dal parametro out della stored procedure viene recuperato usando il metodo 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);
}

Nota

Oltre al parametro out, può essere restituito anche un set di risultati con i risultati dell'esecuzione della stored procedure.

Per altre informazioni sull'uso del driver JDBC con stored procedure e parametri di output, vedere Uso di una stored procedure con parametri di output.

Vedi anche

Informazioni sui tipi di dati del driver JDBC