Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Microsoft JDBC Driver para SQL Server usa os tipos de dados básicos JDBC para converter os tipos de dados do SQL Server em um formato compreendido pela linguagem de programação Java e vice-versa. O driver JDBC fornece suporte para a API JDBC 4.0, que inclui o tipo de dados SQLXML e os tipos de dados National (Unicode), como NCHAR, NVARCHAR, LONGNVARCHAR e NCLOB.
Mapeamentos de tipo de dados
A tabela a seguir lista os mapeamentos padrão entre os tipos de dados básicos do SQL Server, JDBC e linguagem de programação Java:
| Tipos de SQL Server | Tipos JDBC (java.sql.Types) | Tipos de linguagem Java |
|---|---|---|
| bigint | BIGINT | long |
| binário | BINARY | byte[] |
| pouco | POUCO | Booleano |
| char | CHAR | Cordão |
| date | DATE | java.sql.Data |
| datetime3 | DATA E HORA | java.sql.Carimbo de data/hora |
| datetime2 | DATA E HORA | java.sql.Carimbo de data/hora |
| datetimeoffset2 | microsoft.sql.Types.DATETIMEOFFSET | microsoft.sql.DateTimeOffset |
| decimal | DECIMAL | java.math.BigDecimal |
| float | DUPLO | duplo |
| geometria | VARBINARY | byte[] |
| geografia | VARBINARY | byte[] |
| imagem | LONGVARBINARY | byte[] |
| int | INTEGER | int |
| Json | microsoft.sql.Types.JSON | Cordão |
| dinheiro | DECIMAL | java.math.BigDecimal |
| Nchar | CHAR NCHAR (Java SE 6.0) |
Cordão |
| ntexto | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
Cordão |
| numérico | NUMÉRICO | java.math.BigDecimal |
| Nvarchar | VARCHAR NVARCHAR (Java SE 6.0) |
Cordão |
| nvarchar (máx.) | VARCHAR NVARCHAR (Java SE 6.0) |
Cordão |
| real | REAL | float |
| smalldatetime | DATA E HORA | java.sql.Carimbo de data/hora |
| Smallint | SMALLINT | curtas |
| dinheiro pequeno | DECIMAL | java.math.BigDecimal |
| SQLVARIANT | microsoft.sql.Types.SQL_VARIANTE | Objeto |
| enviar SMS | LONGVARCHAR | Cordão |
| time | TEMPO1 | java.sql.Time1 |
| carimbo de data/hora | BINARY | byte[] |
| tinyint | TINYINT | curtas |
| UDT | VARBINARY | byte[] |
| uniqueidentifier | CHAR | Cordão |
| Varbinary | VARBINARY | byte[] |
| varbinário (máx.) | VARBINARY | byte[] |
| Varchar | VARCHAR | Cordão |
| varchar (máx.) | VARCHAR | Cordão |
| vetor | microsoft.sql.Types.VETOR | microsoft.sql.Vetor |
| XML | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
Cordão SQLXML |
1 Para usar java.sql.Time com o tipo de SQL Server de hora, você deve definir a propriedade de conexão sendTimeAsDatetime como false.
2 Você pode acessar programaticamente valores de datetimeoffset com DateTimeOffset Class.
3 java.sql.Os valores de carimbo de data/hora não podem mais ser usados para comparar valores de uma coluna datetime a partir do SQL Server 2016. Esta limitação deve-se a uma alteração do lado do servidor que converte datetime em datetime2 de forma diferente, resultando em valores não iguais. A solução alternativa para esse problema é alterar colunas datetime para datetime2(3), usar String em vez de java.sql.Timestamp ou alterar o nível de compatibilidade do banco de dados para 120 ou inferior.
As seções a seguir fornecem exemplos de como você pode usar o JDBC Driver e os tipos de dados básicos. Para obter um exemplo mais detalhado de como usar os tipos de dados básicos em um aplicativo Java, consulte Exemplo de tipos de dados básicos.
Recuperando dados como uma cadeia de caracteres
Para ler valores mapeados para qualquer tipo básico JDBC como uma cadeia de caracteres ou quando um valor fortemente tipado não é necessário, use o método getString da classe SQLServerResultSet . O exemplo a seguir mostra esse uso:
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");
}
Recuperando dados por tipo de dados
Se você precisar recuperar dados de uma fonte de dados e souber o tipo de dados que está sendo recuperado, use um dos métodos get<Type> da classe SQLServerResultSet, também conhecida como métodos getter. Você pode usar um nome de coluna ou um índice de coluna com os métodos get<Type> , como no exemplo a seguir:
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");
}
Observação
Os métodos getUnicodeStream e getBigDecimal com escala foram preteridos e não são suportados pelo driver JDBC.
Atualização de dados por tipo de dados
Se você precisar atualizar o valor de um campo em uma fonte de dados, use um dos métodos Update<Type> da classe SQLServerResultSet. No exemplo a seguir, o método updateInt é usado com o método updateRow para atualizar os dados na fonte de dados:
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();
}
Observação
O driver JDBC não pode atualizar uma coluna do SQL Server com um nome de coluna com mais de 127 caracteres. Se uma atualização para uma coluna cujo nome tem mais de 127 caracteres for tentada, uma exceção será lançada.
Atualizando dados por consulta parametrizada
Se você atualizar dados em uma fonte de dados usando uma consulta parametrizada, poderá definir o tipo de dados dos parâmetros usando um dos métodos set<Type> da classe SQLServerPreparedStatement . Esses métodos também são conhecidos como métodos setter. No exemplo a seguir, o método prepareStatement é usado para pré-compilar a consulta parametrizada e, em seguida, o método setString é usado para definir o valor da cadeia de caracteres do parâmetro antes que o método executeUpdate seja chamado.
try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
String name = "Bob";
pstmt.setString(1, name);
int rowCount = pstmt.executeUpdate();
}
Para obter mais informações sobre consultas parametrizadas, consulte Usando uma instrução SQL com parâmetros.
Passando parâmetros para um procedimento armazenado
Se você tiver que passar parâmetros digitados para um procedimento armazenado, você pode definir os parâmetros por índice ou nome usando um dos métodos set<Type> da classe SQLServerCallableStatement . No exemplo a seguir, o método prepareCall é usado para configurar a chamada para o procedimento armazenado e, em seguida, o método setString é usado para definir o parâmetro para a chamada antes que o método executeQuery seja chamado.
try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
String lname = "Brown";
cstmt.setString(1, lname);
ResultSet rs = cstmt.executeQuery();
}
Observação
Neste exemplo, um conjunto de resultados é retornado com os resultados da execução do procedimento armazenado.
BigDecimal
Ao usar valores de parâmetros BigDecimal, a precisão e a escala podem ser passadas junto com o valor através do setBigDecimal. O uso setBigDecimal dessa forma evita o truncamento de valor potencial. Como alternativa, se a opção calcBigDecimalPrecision de cadeia de conexão estiver definida como true, o driver calculará a precisão para a entrada BigDecimal em nome do usuário, ao custo do desempenho. Se o valor for passado sozinho, sem calcBigDecimalPrecision definido, ou a opção definida como false, o driver assume o valor máximo permitido (38) para precisão para esse valor BigDecimal.
Para obter mais informações sobre como usar o driver JDBC com procedimentos armazenados e parâmetros de entrada, consulte Usando um procedimento armazenado com parâmetros de entrada.
Recuperando parâmetros de um procedimento armazenado
Se você tiver que recuperar parâmetros de volta de um procedimento armazenado, você deve primeiro registrar um out parâmetro por nome ou índice usando o método registerOutParameter da classe SQLServerCallableStatement. Em seguida, atribua o parâmetro retornado a uma variável apropriada depois de executar a chamada para o procedimento armazenado. No exemplo a seguir, o método prepareCall é usado para configurar a chamada para o procedimento armazenado, o método registerOutParameter é usado para configurar o out parâmetro e, em seguida, o método setString é usado para definir o parâmetro para a chamada antes que o método executeQuery seja chamado. O valor do parâmetro do procedimento armazenado é recuperado out usando o método 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);
}
Observação
Além do parâmetro retornado, um conjunto de resultados também pode ser retornado com os resultados da execução do procedimento armazenado.
Para obter mais informações sobre como usar o driver JDBC com procedimentos armazenados e parâmetros de saída, consulte Usando um procedimento armazenado com parâmetros de saída.