Uso di tipi di dati di base
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 |
decimale | 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 |
Ora | 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 | Object |
geometry | VARBINARY | byte[] |
geography | 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 un'istruzione 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.