⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbc-spec.frame7.html

📁 JDBC入门中文文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:

<pre><code>stmt.setString(1, &quot;Hi&quot;);
</code></pre>

<pre><code>for (int i = 0; i &lt; 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 参数的数据类型一致性</h4>
<a name="26387"></a>
<p>PreparedStatement.setXXX 方法不执行任何常规数据类型转换。相反,Java 
值只映射到相应的 SQL 类型(根据</a><a href="jdbc-spec.frame8.html#28688">第 
28 页的表 3</a> 中指定的映射),然后即被传给数据库。 </p>

<a name="26388"></a>
<p>程序员应负责确保使每一参数的 java 
类型都映射为与数据库所期望的 SQL 
数据类型兼容。为实现最大程度的可移植性,程序员应使用与数据库所期望的 
SQL 类型兼容的 Java 类型。 </p>

<p><a name="26392"></a>如果程序员需要对 IN 
参数进行数据类型转换,可在将值传送到数据库之前使用 
PreparedStatement.setObject 方法将 Java Object 转换为指定的 SQL 类型。 </p>

<p><a name="4088"></a> </p>

<h4>7.2.2 将 SQL NULL 作为 IN 参数传送</h4>

<p>PreparedStatement.setNull 方法允许将 SQL NULL 值作为 IN 
参数传给数据库。注意,必须指定参数的 SQL 类型。 </p>

<p><a name="45061"></a>另外,对于以 Java 对象为参数的 setXXX 
方法,如果将 Java NULL 传给 setXXX 方法,则 SQL NULL 将被传给数据库。 </p>

<p><a name="26375"></a> </p>

<h4>7.2.3 传送特大参数</h4>

<p>JDBC 本身没有限制可通过 setBytes 或 setString 
调用传送的数据量。但在处理大块时,应用程序设计人员可在较小的块中方便传送特大数据。 
</p>

<p>为适应这一点,我们允许程序员将 Java IO 
流作为参数。当执行语句时,JDBC 驱动程序将在这些 IO 
流上重复调用,以便读取它们的内容并将其作为实际参数数据传送。 
</p>

<p>对于包含未解释字节的流、包含 ASCII 字符的流和包含 Unicode 
字符的流,提供了独立的 setXXX 方法。</p>

<p>当将流设置为输入参数时,应用程序设计人员必须指定从流中读取和传送到数据库的字节数。 
</p>

<p><a name="17535"></a><sup><font size="-1">预先指定数据传递大小是比较麻烦的,但这却是必要的,因为某些数据库在传送之前需要了解总体传递大小。</font></sup></p>

<p><a name="4091"></a>使用流将文件内容作为 IN 参数传送的示例如下: </p>

<pre><code>java.io.File file = new java.io.File(&quot;/tmp/foo&quot;);
</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>			&quot;UPDATE Table5 SET stuff = ? WHERE index = 4&quot;);
</code></pre>

<pre><code>stmt.setBinaryStream(1, fin, fileLength);
</code></pre>

<pre><code>// 当语句执行时,“fin”将被重复调用
</code></pre>

<pre><code>// 以传递数据。
</code></pre>

<pre><code>stmt.executeUpdate();
</code></pre>

<pre><code>
</code></pre>
<a>

<a name="26268"></a>
<h3>7.3 接收 OUT 参数</h3>
<a name="26269"></a>
<p>执行存储过程的调用时,应使用 CallableStatemen 类。CallableStatement 是 
PreparedStatement 的子类型。 </p>

<p></a><a name="36276"></a>要传递 IN 参数,可使用在 PreparedStatement 
中定义的 setXXX 方法,有关描述参见第 <a href="jdbc-spec.frame7.html#20240">7.2</a> 
节。 </p>

<p>但如果存储过程返回 OUT 参数,则对于每一 OUT 
参数,在执行语句前都必须使用 CallableStatememt.registerOutParameter 
方法注册其 SQL 类型(参见附录 <a href="jdbc-spec.frame15.html#20152">A.6</a>)。在语句执行后,必须使用相应的 
CallableStatement.getXXX 方法获取参数值。 </p>

<pre><code>java.sql.CallableStatement stmt = conn.prepareCall(
</code></pre>

<pre><code>					&quot;{call getTestData(?, ?)}&quot;);
</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 参数的数据类型一致性</h4>
<a name="26429"></a>
<p>CallableStatement.getXXX 方法不执行任何常规数据类型转换。但 
registerOutParameter 调用必须指定由数据库返回的 SQL 
类型,且程序员必须随后调用其 Java 类型与 SQL 类型相对应的 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 参数检索</h4>

<p>对于 ResultSet,为确定给定 OUT 参数值是否为 SQL“NULL”,必须首先读取参数,然后用 
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> 
节中为 ResultSet.getXXX 方法指定的规则。 </p>

<p><a name="4099"></a> </p>

<h4>7.3.3 检索特大 out 参数</h4>

<p>我们不提供将 OUT 参数作为流检索的任何机制。 </p>

<p><a name="4101"></a>相反,我们建议程序员最好通过 ResultSet 
检索特大值。 </p>

<p><a name="50881"></a> </p>

<h4>7.3.4 先检索结果后检索 out 参数</h4>

<p>如果存储过程返回了结果和 out 
参数,为了最大程度的可移植性,应先检索结果再检索 out 参数。 </p>

<p><a name="20964"></a> </p>

<h3>7.4 数据截断</h3>

<p>某些情况下,当从数据库读取或写入数据时,数据可能被截断。处理方式将取决于环境。但一般而言,数据库读取时的数据截断将发出警告,而数据库写入时的数据截断则会抛出 
SQLException。 </p>

<p><a name="20990"></a> </p>

<h4>7.4.1 超出 Connection maxFieldSize 限制</h4>

<p>如果应用程序使用 Connection.setMaxFieldSize 
来强制限制域的最大值,则当读取或写入超出域的限制时将导致数据被截断为 
maxFieldSize 的大小而不会抛出任何 SQLException 或 SQLWarning。 </p>

<p><a name="20974"></a> </p>

<h4>7.4.2 读取时的数据截断</h4>

<p>一般 JDBC 在数据读取期间很少出现数据截断的错误,因为 API 
不要求程序员在固定大小的缓冲区中传递数据,而是要求按需分配合适的数据空间。但在某些情况下,驱动程序会遇到内部实现限制,因此仍有可能在读取期间发生数据截断。 
</p>

<p><a name="21001"></a>如果从 ResultSet 读取时发生数据截断,则 
DataTruncation 对象(SQLWarning 的子类型)将添加到 ResultSet 
警告列表中,同时该方法将返回所能读取到的全部数据。同样,如果从数据库接收 
OUT 参数时发生数据截断,则会将 DataTruncation 对象添加到 
CallableStatement 警告列表中,同时返回所能读取到的全部数据。 </p>

<p><a name="21004"></a> </p>

<h4>7.4.3 写入时的数据截断</h4>

<p>在写入数据库期间,应用程序试图传送的数据有可能多于驱动程序或数据库准备接收的数据。这种情况下,失败的方法应把 
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>版权所有 &copy; 1996, 1997 Sun Microsystems, Inc. 保留所有权利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 --> 
</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -