📄 prov_paramquery_disc.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta name="Author" content="TF">
<meta name="generator" content="HTML Tidy, see www.w3.org">
<title>数据库应用程序开发者指南: 从一个数据源中获得数据</title>
<link type="text/css" href="jbdocs.css" rel="stylesheet">
</head>
<body>
<a name="_top_"></a>
<h3>参数化查询: 提示与技巧</h3>
<hr>
译者名字:cage_yang(JD012)<br>
邮件地址:<a href="mailto:cage_yang@163.com">cage_yang@163.com</a>
<blockquote class="bsku">数据库应用程序开发是JBuilder专业版本与企业版本的一个特征.分布式应用程序开发是JBuilder企业版本的一个特征.</blockquote>
<p>该系统主题包括提示技巧</p>
<ul>
<li>确定怎样使用指定的参数与参数标记</li>
<li>使用新参数重新执行查询</li>
<li>在一个主-从关系中使用参数化查询</li>
</ul>
<a name="exposing"></a>
<h4>使用参数</h4>
<!--BNDX="parameterized queries:adding columns;adding columns:to parameterized queries"-->
<!--BNDX="ParameterRow component:;named:parameters;? as JDBC parameter marker;parameter markers"-->
<p>为了在一个参数化查询中赋予参数值, 你一定要先创建一个<code>ParameterRow</code>并且增加一个指定的列用于保存传给查询的值.</p>
<p>任何一个<code>ReadWriteRow</code>,比如<code>ParameterRow</code>, <code>DataSet</code>, and <code>DataRow</code>可以作为查询或者过程参数使用. 在<code>ParameterRow</code>中, 列可简单地通过<code>addColumns</code>与<code>setColumns</code>方法来创建. </p>
<p>在DataExpress的APIs中<code>Row</code>类被广泛使用.<code>ReadRow</code>与<code>ReadWriteRow</code>被当作类似接口加以使用. </p>
<p>与DataSet方法相关的类层次结构如下:</p>
<pre>
java.lang.Object
+----<a href="../ref/dx/com.borland.dx.dataset.ReadRow.html">com.borland.dx.dataset.ReadRow</a>
+----<a href="../ref/dx/com.borland.dx.dataset.ReadWriteRow.html">com.borland.dx.dataset.ReadWriteRow</a>
+----<a href="../ref/dx/com.borland.dx.dataset.DataSet.html">com.borland.dx.dataset.DataSet</a>
+----<a href="../ref/dx/com.borland.dx.dataset.StorageDataSet.html">com.borland.dx.dataset.StorageDataSet</a>
+----com.borland.dx.sql.dataset.QueryDataSet
</pre>
<ul>
<li>StorageDataSet方法处理数据集结构</li>
<li>DataSet方法处理浏览</li>
<li>ReadWriteRow方法让你在当前行中编辑列数据</li>
<li>ReadRow方法用于访问当前行列数据</li>
<li>TableDataSet与QueryDataSet继承了所有的这些方法.</li>
</ul>
<p><code>Row</code>类提供访按顺序与列名称访问列数据值的途径.
编写代码中,指定列名来访问是一个更健壮更可读的方式. 通过指定列名来访问不如按序访问快, 但如果在你的
<code>DataSet</code>中列数少于20其访问速度仍然是很快的, 这是由于特有的高速的名字/顺序匹配运算法则. 同样的,使用同一个串访问同一个列是一个好的习惯. 这样节约了内存并且也便于输入.</p>
<p><code>ParameterRow</code>在<code>QueryDescriptor</code>中传递. <code>query</code>属性编辑器允许你选择一个参数行. 编辑<code>ParameterRow</code>, 如增加一列并改变它的属性, 都能够在检视器或者在代码中完成.</p>
<p>例如, 你创建一个有两列(low_no与high_no)的<code>ParameterRow</code>.在你的参数查询中,你可以引用low_no与high_no, 并且可以和表中任一字段作比较. 见下面的关于怎样按不同方法使用这些值.</p>
<p>在JBuilder中,参数化查询能够带指定的参数、参数标记或者一个主-从关系运行. 以下的部分给一个简短的解释.</p>
<ul>
<li>
<p>关于命名参数:</p>
<p>当参数标记在查询中以冒号后跟一个包括文字与数字的名字指定时,参数名称的匹配就完成了. The column in the <a href="../ref/dx/com.borland.dx.dataset.ParameterRow.html"><code>ParameterRow</code></a>中的列与用于设置参数值的参数标记有相同的名称.例如,在下面的SQL语句中, 值以命名参数传递的:</p>
<pre>
SELECT * FROM employee where emp_no > :low_no and emp_no < :high_no
</pre>
<p>在这条SQL语句中, <code>:low_no</code>与<code>:high_no</code>是参数标记,在程序运行期间,这些参数作为赋给SQL语句实际值的占位符. 此处的值可能来自可视化组件或者由程序代码产生.在设计期间,使用该列的默认值.当参数被赋予一个名称,它们能够以任意次序传递到查询中.JBuilder会在运行期间以适当的顺序将参数绑定到数据集中.</p>
<p>在<a href="prov_paramquery.html">"指南:参数化一个查询"</a>中,在<code>ParameterRow</code>中增中两列来保存最小与最大值.该查询仅返回值大于最小值并小于最大值的数据.</p>
</li>
<li>
<p>使用"?"参数标记:</p>
<p>当简单用问号作为查询标记时,参数值的设置是严格按照从左到右的顺序的.</p>
<p>例如,以下的SQL语句中, ?号标记作为参数:</p>
<p><a name="paramvalues"></a><code>SELECT * FROM employee WHERE emp_no > ?</code> <!--BNDX="parameterized queries:binding values;binding parameter values"-->
<!--BNDX="data sets:binding parameter values"-->
</p>
<a name="binding"></a>
<p>在这个SQL语句中, "?"是一个实际值的占位符. 该值可能来自可视化组件或者来自程序代码. 当使用一个?参数标记时,严格按照从左到右的顺序传递到参数值.</p>
</li>
<li>
<p>使用一个主从关系:</p>
<p>主从数据集至少存在一个共同的字段.该字段用于参数化查询.更多的这方面的信息参见<a href="#parammasterdetail">"在主-从关系中使用参数化查询"</a>.</p>
</li>
</ul>
<a name="supplying"></a>
<h4>使用新参数重新执行参数化查询</h4>
<!--BNDX="parameterized queries:supplying new values"-->
<p>为了使用新的参数重新执行查询,在<code>ParameterRow</code>中设置值,然后调用<code>QueryDataSet.refresh()</code>方法来促使使用新的参数进行重新查询.例如,用一个用户界面组件设置参数值,你可以如此使用SQL语句:</p>
<pre>
SELECT * FROM phonelist WHERE lastname LIKE :searchname
</pre>
<p>在这个例子中, :searchname参数的值能够从用户界面组件中得到.做到这一点,你不得不:</p>
<ol>
<li>组件值每变化一次,都要从组件中获得变化值</li>
<li>将值放入<code>ParameterRow</code>对象中</li>
<li>将那个对象提供给<code>QueryDataSet</code></li>
<li>调用<code>QueryDataSet</code>的<code>refresh()</code>方法</li>
</ol>
<p>详细信息见<a href="prov_paramquery.html">"指南:参数化查询"</a> </p>
<p>如果你想赋予<code>query</code>的值在数据集中存在,在<code>QueryDescriptor</code>中你能够使用那个数据集作为你的<code>ReadWriteRow</code>,可以浏览该数据集,并且为每个值返回一个查询. </p>
<a name="parammasterdetail"></a>
<h4>在主-从关系中的参数化查询</h4>
<!--BNDX="parameterized queries:for master-detail records;master-detail relationships:queries"-->
<!--BNDX="fetching data:detail records"-->
<p>在<code>DelayedDetailFetch</code>设置为<code>true</code>的主从关系中,你可以象这样指定一个SQL语句:</p>
<p><code>SELECT * FROM employee WHERE country = :job_country</code></p>
<p>该例子中, :job_country是从(详细)数据集用于连接一个主数据集的字段.你能够指定和主数据集需要的连接字段一样多的参数.在一个主-从关系中,参数一定总是被赋予一个和列名相匹配的名称.更多的关于主-从关系与<code>DelayedDetailFetch</code>参数的信息,见<a href="prov_masterdetail.html">"建立一个主-从关系"</a>.</p>
<p>在一个主-从关系描述符中,绑定动作是隐式完成的. 隐式的绑定意味着数据值不是由程序员提供的,他们从主数据集中获得并在执行查询中隐式绑定. 查询执行时,为了提高性能,绑定参数总味着给语句与本地和服务器参数分配资源.</p>
<p>如果你准备赋予<code>query</code>参数的值在数据集中存在,你能够在<code>QueryDescriptor</code>使用数据集作为你的<code>ReadWriteRow</code>,可以浏览数据结果集并且为每个值返回查询结果并显示在从数据集中.</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -