使用基本資料類型

下載 JDBC 驅動程式

Microsoft JDBC Driver for SQL Server 會使用 JDBC 基本資料類型,將 SQL Server 資料類型轉換為 Java 程式設計語言可以理解的格式,反之亦然。 JDBC 驅動程式提供 JDBC 4.0 API 的支援,其中包括 SQLXML 資料類型和國家 (Unicode) 資料類型,例如 NCHARNVARCHARLONGNVARCHARNCLOB

資料類型對應

下表列出基本 SQL Server、JDBC 與 Java 程式設計語言資料類型之間的預設對應:

SQL Server 類型 JDBC 類型 (java.sql.Types) Java 語言類型
BIGINT bigint long
BINARY BINARY byte[]
bit BIT boolean
char CHAR String
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
text 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
varchar(max) VARCHAR String
Xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
幾何 VARBINARY byte[]
geography VARBINARY byte[]

1若要搭配 SQL Server 類型 time 使用 java.sql.Time,您必須將 sendTimeAsDatetime 連線屬性設定為 false。

2 您可以使用 DateTimeOffset 類別來以程式設計方式存取 datetimeoffset 的值。

3 從 SQL Server 2016 開始,java.sql.Timestamp 值已無法用來比較來自 datetime 資料行的值。 此限制是因會以不同方式將 datetime 轉換為 datetime2 並產生不相等值的伺服器端變更所導致。 此問題的因應措施是將 datetime 資料行變更為 datetime2(3)、使用 String 取代 java.sql.Timestamp,或是將資料庫相容性層級變更至 120 或更低。

下列章節會提供如何使用 JDBC Driver 與基本資料類型的範例。 如需如何在 Java 應用程式中使用基本資料類型的更詳細範例,請參閱基本資料類型範例

擷取資料為字串

如果您必須從對應至任何 JDBC 基本資料類型的資料來源擷取資料,以作為字串檢視,或者如果不需要強型別資料,則可以使用 SQLServerResultSet 類別的 getString 方法。 以下範例說明這個使用方式:

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

依資料類型擷取資料

如果您必須從資料來源擷取資料,且知道正在擷取的資料類型,請使用 SQLServerResultSet 類別的其中一個 get<Type> 方法,也稱為「getter 方法」。 您可使用資料行名稱或資料行索引搭配 get<Type> 方法,如以下範例:

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

注意

搭配 scale 方法的 getUnicodeStream 與 getBigDecimal 皆已淘汰,JDBC 驅動程式並不支援。

依資料類型更新資料

如果您必須更新資料來源中的欄位值,請使用 SQLServerResultSet 類別的其中一個 update<Type> 方法。 在下列範例中,updateInt 方法會結合 updateRow 方法使用,以更新資料來源中的資料:

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

注意

JDBC Driver 無法更新資料行名稱長度超過 127 個字元的 SQL Server 資料行。 如果嘗試更新名稱超過 127 個字元的資料行,就會擲回例外狀況。

依參數化查詢更新資料

如果您使用參數化查詢更新資料來源中的資料,可以使用 SQLServerPreparedStatement 類別的其中一個 set<Type> 方法來設定參數的資料類型。 這些方法也稱為 setter 方法。 在下列範例中,prepareStatement 方法用來預先編譯參數化查詢,然後在呼叫 executeUpdate 方法之前,使用 setString 方法設定參數的字串值。

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

如需參數化查詢的詳細資訊,請參閱使用含參數的 SQL 陳述式

傳遞參數至預存程序

如果您必須將具類型的參數傳遞至預存程序,可使用 SQLServerCallableStatement 類別的其中一個 set<Type> 方法,依索引或名稱設定參數。 在下列範例中,prepareCall 方法用來設定發送給預存程序的呼叫,然後在呼叫 executeQuery 方法之前,使用 setString 方法設定呼叫的參數。

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

注意

在此範例中,結果集會傳回執行預存程序的結果。

BigDecimal

使用 BigDecimal 參數值時,有效位數和小數位數可能會透過 setBigDecimal 隨著值一起傳遞。 使用 setBigDecimal 這種方式可避免潛在的值截斷。 或者,如果連接字串選項 calcBigDecimalPrecision 設定為 true,驅動程式會代表使用者計算 BigDecimal 輸入的有效位數,但代價是犧牲效能。 如果單獨傳遞值,但沒有 calcBigDecimalPrecision 設定或選項設定為 false,則驅動程式會假設該 BigDecimal 值的有效位數最大允許值為 38。

如需搭配預存程序和輸入參數使用 JDBC 驅動程式的詳細資訊,請參閱使用含輸入參數的預存程序

從預存程序中擷取參數

如果您必須從預存程序擷取參數,必須先使用 SQLServerCallableStatement 類別的 registerOutParameter 方法,依據名稱或索引註冊 out 參數。 然後在執行預存程序的呼叫之後,將傳回的參數指派給適當的變數。 在下列範例中,prepareCall 方法用來設定發送給預存程序的呼叫,registerOutParameter 方法用來設定 out 參數,,而 setString 方法則用來在呼叫 executeQuery 方法之前,設定呼叫的參數。 預存程序 out 參數的值使用 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);
}

注意

除了傳回的 out 參數之外,結果集也會傳回執行預存程序的結果。

如需如何搭配預存程序和輸出參數使用 JDBC 驅動程式的詳細資訊,請參閱使用含輸出參數的預存程序

另請參閱

了解 JDBC 驅動程式資料類型