?? jdbc-spec.frame7.html
字號:
<pre><code>stmt.setString(1, "Hi");
</code></pre>
<pre><code>for (int i = 0; i < 10; i++) {
</code></pre>
<pre><code> stmt.setInt(2, i);
</code></pre>
<pre><code> int rows = stmt.executeUpdate();
</code></pre>
<pre><code>}
</code></pre>
<a>
<a name="26386"></a>
<h4>7.2.1 IN 參數(shù)的數(shù)據(jù)類型一致性</h4>
<a name="26387"></a>
<p>PreparedStatement.setXXX 方法不執(zhí)行任何常規(guī)數(shù)據(jù)類型轉(zhuǎn)換。相反,Java
值只映射到相應(yīng)的 SQL 類型(根據(jù)</a><a href="jdbc-spec.frame8.html#28688">第
28 頁的表 3</a> 中指定的映射),然后即被傳給數(shù)據(jù)庫。 </p>
<a name="26388"></a>
<p>程序員應(yīng)負責確保使每一參數(shù)的 java
類型都映射為與數(shù)據(jù)庫所期望的 SQL
數(shù)據(jù)類型兼容。為實現(xiàn)最大程度的可移植性,程序員應(yīng)使用與數(shù)據(jù)庫所期望的
SQL 類型兼容的 Java 類型。 </p>
<p><a name="26392"></a>如果程序員需要對 IN
參數(shù)進行數(shù)據(jù)類型轉(zhuǎn)換,可在將值傳送到數(shù)據(jù)庫之前使用
PreparedStatement.setObject 方法將 Java Object 轉(zhuǎn)換為指定的 SQL 類型。 </p>
<p><a name="4088"></a> </p>
<h4>7.2.2 將 SQL NULL 作為 IN 參數(shù)傳送</h4>
<p>PreparedStatement.setNull 方法允許將 SQL NULL 值作為 IN
參數(shù)傳給數(shù)據(jù)庫。注意,必須指定參數(shù)的 SQL 類型。 </p>
<p><a name="45061"></a>另外,對于以 Java 對象為參數(shù)的 setXXX
方法,如果將 Java NULL 傳給 setXXX 方法,則 SQL NULL 將被傳給數(shù)據(jù)庫。 </p>
<p><a name="26375"></a> </p>
<h4>7.2.3 傳送特大參數(shù)</h4>
<p>JDBC 本身沒有限制可通過 setBytes 或 setString
調(diào)用傳送的數(shù)據(jù)量。但在處理大塊時,應(yīng)用程序設(shè)計人員可在較小的塊中方便傳送特大數(shù)據(jù)。
</p>
<p>為適應(yīng)這一點,我們允許程序員將 Java IO
流作為參數(shù)。當執(zhí)行語句時,JDBC 驅(qū)動程序?qū)⒃谶@些 IO
流上重復(fù)調(diào)用,以便讀取它們的內(nèi)容并將其作為實際參數(shù)數(shù)據(jù)傳送。
</p>
<p>對于包含未解釋字節(jié)的流、包含 ASCII 字符的流和包含 Unicode
字符的流,提供了獨立的 setXXX 方法。</p>
<p>當將流設(shè)置為輸入?yún)?shù)時,應(yīng)用程序設(shè)計人員必須指定從流中讀取和傳送到數(shù)據(jù)庫的字節(jié)數(shù)。
</p>
<p><a name="17535"></a><sup><font size="-1">預(yù)先指定數(shù)據(jù)傳遞大小是比較麻煩的,但這卻是必要的,因為某些數(shù)據(jù)庫在傳送之前需要了解總體傳遞大小。</font></sup></p>
<p><a name="4091"></a>使用流將文件內(nèi)容作為 IN 參數(shù)傳送的示例如下: </p>
<pre><code>java.io.File file = new java.io.File("/tmp/foo");
</code></pre>
<pre><code>int fileLength = file.length();
</code></pre>
<pre><code>java.io.InputStream fin = new java.io.FileInputStream(file);
</code></pre>
<pre><code>java.sql.PreparedStatement stmt = conn.prepareStatement(
</code></pre>
<pre><code> "UPDATE Table5 SET stuff = ? WHERE index = 4");
</code></pre>
<pre><code>stmt.setBinaryStream(1, fin, fileLength);
</code></pre>
<pre><code>// 當語句執(zhí)行時,“fin”將被重復(fù)調(diào)用
</code></pre>
<pre><code>// 以傳遞數(shù)據(jù)。
</code></pre>
<pre><code>stmt.executeUpdate();
</code></pre>
<pre><code>
</code></pre>
<a>
<a name="26268"></a>
<h3>7.3 接收 OUT 參數(shù)</h3>
<a name="26269"></a>
<p>執(zhí)行存儲過程的調(diào)用時,應(yīng)使用 CallableStatemen 類。CallableStatement 是
PreparedStatement 的子類型。 </p>
<p></a><a name="36276"></a>要傳遞 IN 參數(shù),可使用在 PreparedStatement
中定義的 setXXX 方法,有關(guān)描述參見第 <a href="jdbc-spec.frame7.html#20240">7.2</a>
節(jié)。 </p>
<p>但如果存儲過程返回 OUT 參數(shù),則對于每一 OUT
參數(shù),在執(zhí)行語句前都必須使用 CallableStatememt.registerOutParameter
方法注冊其 SQL 類型(參見附錄 <a href="jdbc-spec.frame15.html#20152">A.6</a>)。在語句執(zhí)行后,必須使用相應(yīng)的
CallableStatement.getXXX 方法獲取參數(shù)值。 </p>
<pre><code>java.sql.CallableStatement stmt = conn.prepareCall(
</code></pre>
<pre><code> "{call getTestData(?, ?)}");
</code></pre>
<pre><code>stmt.registerOutParameter(1,java.sql.Types.TINYINT);
</code></pre>
<pre><code>stmt.registerOutParameter(2,java.sql.types.DECIMAL, 2);
</code></pre>
<pre><code>stmt.executeUpdate();
</code></pre>
<pre><code>byte x = stmt.getByte(1);
</code></pre>
<pre><code>BigDecimal n = stmt.getBigDecimal(2,2);
</code></pre>
<a>
<a name="26428"></a>
<h4>7.3.1 OUT 參數(shù)的數(shù)據(jù)類型一致性</h4>
<a name="26429"></a>
<p>CallableStatement.getXXX 方法不執(zhí)行任何常規(guī)數(shù)據(jù)類型轉(zhuǎn)換。但
registerOutParameter 調(diào)用必須指定由數(shù)據(jù)庫返回的 SQL
類型,且程序員必須隨后調(diào)用其 Java 類型與 SQL 類型相對應(yīng)的 getXXX
方法,如在</a><a href="jdbc-spec.frame8.html#27081">第 27 頁表 2</a> 中所列。 </p>
<p><a name="26512"></a> </p>
<h4>7.3.2 將 NULL 值作為 OUT 參數(shù)檢索</h4>
<p>對于 ResultSet,為確定給定 OUT 參數(shù)值是否為 SQL“NULL”,必須首先讀取參數(shù),然后用
CallableStatement.wasNull 方法查看是否返回 SQL“NULL”。 </p>
<p><a name="26521"></a>當用 CallableStatement.getXXX 方法讀取 SQL“NULL”值時,將得到
NULL、零值或假值,這符合第 <a href="jdbc-spec.frame7.html#30760">7.1.2</a>
節(jié)中為 ResultSet.getXXX 方法指定的規(guī)則。 </p>
<p><a name="4099"></a> </p>
<h4>7.3.3 檢索特大 out 參數(shù)</h4>
<p>我們不提供將 OUT 參數(shù)作為流檢索的任何機制。 </p>
<p><a name="4101"></a>相反,我們建議程序員最好通過 ResultSet
檢索特大值。 </p>
<p><a name="50881"></a> </p>
<h4>7.3.4 先檢索結(jié)果后檢索 out 參數(shù)</h4>
<p>如果存儲過程返回了結(jié)果和 out
參數(shù),為了最大程度的可移植性,應(yīng)先檢索結(jié)果再檢索 out 參數(shù)。 </p>
<p><a name="20964"></a> </p>
<h3>7.4 數(shù)據(jù)截斷</h3>
<p>某些情況下,當從數(shù)據(jù)庫讀取或?qū)懭霐?shù)據(jù)時,數(shù)據(jù)可能被截斷。處理方式將取決于環(huán)境。但一般而言,數(shù)據(jù)庫讀取時的數(shù)據(jù)截斷將發(fā)出警告,而數(shù)據(jù)庫寫入時的數(shù)據(jù)截斷則會拋出
SQLException。 </p>
<p><a name="20990"></a> </p>
<h4>7.4.1 超出 Connection maxFieldSize 限制</h4>
<p>如果應(yīng)用程序使用 Connection.setMaxFieldSize
來強制限制域的最大值,則當讀取或?qū)懭氤鲇虻南拗茣r將導(dǎo)致數(shù)據(jù)被截斷為
maxFieldSize 的大小而不會拋出任何 SQLException 或 SQLWarning。 </p>
<p><a name="20974"></a> </p>
<h4>7.4.2 讀取時的數(shù)據(jù)截斷</h4>
<p>一般 JDBC 在數(shù)據(jù)讀取期間很少出現(xiàn)數(shù)據(jù)截斷的錯誤,因為 API
不要求程序員在固定大小的緩沖區(qū)中傳遞數(shù)據(jù),而是要求按需分配合適的數(shù)據(jù)空間。但在某些情況下,驅(qū)動程序會遇到內(nèi)部實現(xiàn)限制,因此仍有可能在讀取期間發(fā)生數(shù)據(jù)截斷。
</p>
<p><a name="21001"></a>如果從 ResultSet 讀取時發(fā)生數(shù)據(jù)截斷,則
DataTruncation 對象(SQLWarning 的子類型)將添加到 ResultSet
警告列表中,同時該方法將返回所能讀取到的全部數(shù)據(jù)。同樣,如果從數(shù)據(jù)庫接收
OUT 參數(shù)時發(fā)生數(shù)據(jù)截斷,則會將 DataTruncation 對象添加到
CallableStatement 警告列表中,同時返回所能讀取到的全部數(shù)據(jù)。 </p>
<p><a name="21004"></a> </p>
<h4>7.4.3 寫入時的數(shù)據(jù)截斷</h4>
<p>在寫入數(shù)據(jù)庫期間,應(yīng)用程序試圖傳送的數(shù)據(jù)有可能多于驅(qū)動程序或數(shù)據(jù)庫準備接收的數(shù)據(jù)。這種情況下,失敗的方法應(yīng)把
DataTruncation 異常作為 SQLException 拋出。 </p>
<p><a name="21010"></a> <br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目錄</a> | <a href="jdbc-spec.frame6.html">上一頁</a> | <a
href="jdbc-spec.frame8.html">下一頁</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.eng.sun.com</a>
</address>
<a href="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版權(quán)所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有權(quán)利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -