📄 prov_paramquery.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>
<br><br>
<a name="_top_"></a>
<h2>使用参数化查询从你的数据库中获得数据</h2>
<hr>
译者名字:cage_yang(JD012)<br>
邮件地址:<a href="mailto:cage_yang@163.com">cage_yang@163.com</a>
<!--BNDX="queries:creating parameterized;providing data:with parameterized queries"-->
<!--BNDX="parameterized queries:;SQL queries:adding parameters;adding parameters to queries"-->
<blockquote class="bsku">数据库应用程序开发是JBuilder专业版本与企业版本的一个特征. 分布式应用程序开发是JBuilder企业版本的一个特征.</blockquote>
<p>一个参数化的SQL语句包括变量, 也即大家都知道的参数, 其值可以在运行期间变化. 一个参数化的查询使用这些变量来更换字面上的数据值, 如在SQL语句中出现的在WHERE子句用于比较值. 这些变量叫做<em>参数(parameters)</em>. 通常, 参数代表了传递给语句的数据值. 在执行查询前,你为参数提供值. 通过提供不同的值并执行相应的查询,你可使每个查询返回不同的数据结果.</p>
<p>理解数据如何提供给一个<code>DataSet</code> 是进一步理解参数化查询的实质, 如果你还没有阅读,可阅读主题"<a href="dh_javadatabaseapp.html">理解JBuilder数据库应用程序</a>" 与 "<a href="prov_query.html">查询数据库</a>" 该主题主要针对参数化查询.</p>
<p>除 <a href="#tutorial">"指南: 参数查询"</a>外, 还讨论下面的参数化查询:</p>
<ul>
<li><a href="prov_paramquery_disc.html">"使用参数"</a></li>
<li><a href="prov_paramquery_disc.html">"使用新参数重新执行查询"</a></li>
<li><a href="prov_paramquery_disc.html">"在主-从关系中使用参数化查询"</a></li>
</ul>
<a name="tutorial"></a>
<h3>指南: 参数查询</h3>
<!--BNDX="parameterized queries:tutorial;tutorials:parameterizing queries"-->
<!--BNDX="database tutorials:parameterizing queries;QueryDataSet component:tutorial"-->
<!--BTUTOR="Tutorial: Parameterizing a query"-->
<p>下面的指南说明怎样用一个<code>QueryDataSet</code> 组件为一个应用程序提供数据. 这个例子程序增加一个可以在运行期间改变的 <code><a href="../ref/dx/com.borland.dx.dataset.ParameterRow.html">ParameterRow</a></code> 值. 当<code>ParameterRow</code>的值改变时, 数据表会自动刷新它的显示以反映满足参数指定标准的数据记录.</p>
<p><span class="bscan">注意:</span> 我们强烈建议在开始这个叫<a href="prov_textedittutorial.html">"指南:JBuilder数据库应用程序入门"</a>的指南之前,先熟悉使用可视化设计工具.</p>
<p>在例子工程中一个完整的可利用的指南<code>ParameterizedQuery.jpr</code>, 存放位置在<code>/samples/DataExpress/ParameterizedQuery</code> 的JBuilder安装目录下. </p>
<a name="createapp"></a>
<h4>创建一个应用程序</h4>
<p>为创建一个应用程序, </p>
<ol>
<li><p>选择 File|Close All 菜单项.</p></li>
<li>
<p>选择 File|New 并双击应用程序图标</p>
</li>
<li>接受所有的默认的设置来创建一个新的应用程序.</li>
<li>
<p>选择 Design 标签来激活用户界面设计器.</p>
</li>
<li>
<p>点击组件板的DataExpress标签上的 <code>Database</code> 组件,然后在用户界面设计器上点击任何一个位置以将组件添加到应用程序中.</p>
<p>在检视器点击<code>connection</code>属性值的首略号来为<code>Database</code>组件打开连接属性编辑器.</p>
</li>
<li>
<p>将连接属性设置为JDataStore 例子 EMPLOYEE 表, 如下:</p>
<table border="2">
<tr>
<th>属性名称</th>
<th>属性值</th>
</tr>
<tr>
<td>Driver</td>
<td>com.borland.datastore.jdbc.DataStoreDriver</td>
</tr>
<tr>
<td>URL</td>
<td>Browse to <code>/jbuilder/samples/JDataStore/datastores/employee.jds</code> in the local URL field.</td>
</tr>
<tr>
<td>Username</td>
<td>Enter your name</td>
</tr>
<tr>
<td>Password</td>
<td>not required</td>
</tr>
</table>
<p>连接对话框包括一个测试连接按钮. 点击该按钮检察连接属性设置的正确性. 连接的结果在按钮旁边显示. 当连接成功时,点击 OK.</p>
<p>如果你想看生成的代码, 点击 Source 标签并查找<code>ConnectionDescriptor</code> 代码. 点击 Design 标签继续.</p>
<p>更多的关于连接数据库的信息,见 <a href="con_connecting.html">"连接数据库".</a></p>
</li>
</ol>
<a name="parameterrow"></a>
<h4>添加一个参数行</h4>
<!--BNDX="ParameterRow"-->
<p>下一步, 增加一个 <code>ParameterRow</code> ,包括两列: low_no 与 high_no. 你将 <code>ParameterRow</code> 绑定到 <code>QueryDataSet</code>后, 就可以使用<code>JdbTextField</code>
组件来改变 <code>ParameterRow</code> 中的数据以便查询能够使用这些新值来刷新数据.</p>
<ol>
<li>从Express标签中增加一个 <code>ParameterRow</code> 组件到你的应用程序中去.</li>
<li>在组件树中点击<code>parameterRow1</code>左边的展开图标以显示<code>ParameterRow</code>包含的列.</li>
<li>选择 <new column>, 然后在检视器中为新列设置如下的属性:
<table border="2">
<tr>
<th>Property name</th>
<th>Value</th>
</tr>
<tr>
<td>columnName</td>
<td><code>low_no</code></td>
</tr>
<tr>
<td>dataType</td>
<td><code>INT</code></td>
</tr>
<tr>
<td>default</td>
<td><code>15</code></td>
</tr>
</table>
<p>要看在该步骤中由设计器产生的代码, 点击 Source 标签并注意<code>jbInit()</code> 方法. 点击 Design 标签继续下一步操作.</p>
</li>
<li>再次选择 <new column> 为<code>ParameterRow</code>增加第二列, 并给它设置如下属性:
<table border="2">
<tr>
<th>Property name</th>
<th>Value</th>
</tr>
<tr>
<td>columnName</td>
<td><code>high_no</code></td>
</tr>
<tr>
<td>dataType</td>
<td><code>INT</code></td>
</tr>
<tr>
<td>default</td>
<td><code>50</code></td>
</tr>
</table>
</li>
</ol>
<a name="querydataset"></a>
<h4>增加一个 QueryDataSet组件</h4>
<!--BNDX="QueryDataSet component"-->
<ol>
<li>在该应用程序中的Data Express标签中增加一个 <code>QueryDataSet</code> 组件.</li>
<li>点击<code>query</code>属性的省略号按钮,打开查询属性编辑器.</li>
<li>设置<code>queryDataSet1</code>的 <code>query</code>如下属性:
<table border="2">
<tr>
<th>Property name</th>
<th>Value</th>
</tr>
<tr>
<td>Database</td>
<td><code>database1</code></td>
</tr>
<tr>
<td>SQL Statement</td>
<td><code>select emp_no, first_name, last_name from employee where emp_no >= :low_no and emp_no <= :high_no</code></td>
</tr>
</table>
</li>
<li>
<p>在查询属性编辑器中点击 Parameters 标签.</p>
</li>
<li>
<p>在下拉列表框中选择 <code>parameterRow1</code> 将数据集绑定至<code>ParameterRow</code>.</p>
</li>
<li>
<p>点击 Query 标签. 点击 Test Query 按钮以确信查询处于可运行状态. 如果按钮下方显示 <code>Success</code>, 说明测试成功,点击 OK 按钮关闭对话框.</p>
<p>下面的这些代码已经添加到 <code>jbInit()</code> 方法中:</p>
<pre>
queryDataSet1.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database1,
"select emp_no, first_name, last_name from employee where emp_no <= :low_no and emp_no >= :high_no",
parameterRow1, true, Load.ALL));
</pre>
</li>
<li>
<p>从More dbSwing标签中添加一个 <code>DBDisposeMonitor</code> 组件. 当窗口被关闭时<code>DBDisposeMonitor</code> 会关闭 JDataStore .</p>
</li>
<li>
<p>为<code>DBDisposeMonitor</code>设置 <code>dataAwareComponentContainer</code> 属性,其属性设为 'this'.</p>
</li>
</ol>
<a name="UI"></a>
<h4>添加一个用户界面组件</h4>
<p>下面的操作步骤假设你已经熟悉在可视化设计器中添加一个用户界面. </p>
<p>为了在你的应用程序中添加一个组件用于显示与管理数据,</p>
<ol>
<li>在组件面板中dbSwing标签中点击 <code>TableScrollPane</code> 组件.拖动它到用户界面设计器的面板的中心.
<p>确定它的 <code>constraints</code> 属性已经设置为 CENTER.</p>
</li>
<li>
<p>将dbSwing标签中的一个 <code>JdbTable</code> 组件放至<code>tableScrollPane1</code> 组件的中部. 将它的 <code>dataSet</code> 属性为 <code>queryDataSet1</code>.</p>
<p>你应该注意到用户界面的表已经显示有数据.</p>
</li>
<li>选择 Run|Run Project 运行应用程序并浏览数据结果.</li>
<li>
<p>关掉应用程序.</p>
</li>
</ol>
<p>添加组件,实现在运行期间获得参数化查询变量,</p>
<ol>
<li>在Swing Containers标签中选中 <code>JPanel</code> 组件.</li>
<li>
<p>拖动它到组件树中,直至<code>contentPane(BorderLayout)</code>图标左边. 该步操作确保存<code>JPanel</code> (<code>jPanel1</code>) 被添加到主用户界面中, 而不是放到当前点据整个用户界面的<code>tableScrollPane1</code> 面板中.</p>
</li>
<li>
<p>确信它的 <code>constraints</code> 属性已经设置为 <code>NORTH</code>. (如果<code>tableScrollPane1</code> 突然收缩, 检查它的 <code>constraints</code> 属性是否仍被设为 CENTER.)</p>
</li>
<li>
<p>选中 <code>jPanel1</code> 并将它的 <code>preferredSize</code> 属性设为<code>200,100</code>. 这将使它足以包含用户界面的其余部分.</p>
</li>
<li>
<p>从dbSwing标签中选择一个 <code>JdbTextField</code> 组件放入 <code>jPanel1</code>. 该组件保持最小值.</p>
</li>
<li>
<p>注意到 <code>jdbTextField1</code> 被放到上方面板的中央. 这是因为<code>JPanel</code>组件的默认布局是 <code>FlowLayout</code>. 如果你想把它拖到另外的地方,它却仍然保持在原位置.</p>
<p>为了在面板中控制用户界面组件的位置,必须将<code>jPanel1</code> 的<code>layout</code> 属性设为 'null'. 然后, 拖动 <code>jdbTextField1</code> 组件到面板的左边.</p>
</li>
<li>
<p>为了设置固定宽度,设置<code>jdbTextField1</code>的 <code>columns</code> 属性值为 <code>10</code> . 将 <code>text</code> 属性设为 <code>10</code> ,以便和先前输入的作为默认的最小的参数相匹配.</p>
</li>
<li>
<p>从Swing标签中添加一个 <code>JLabel</code> 组件到 <code>jPanel1</code>中. 该标签将<code>jdbTextField1</code> 标识为一个最小域.</p>
</li>
<li>
<p>在用户界面设计器中选中 <code>jLabel1</code> 并将它拖动到<code>jdbTextField1</code>的正上方.</p>
</li>
<li>
<p>设置<code>jLabel1</code>的 <code>text</code> 属性为 <code>Minimum value</code>. 并调整标签的大小以使标签上的文字全部显示出来.</p>
</li>
<li>
<p>在<code>jPanel1</code>中添加另外的 <code>JdbTextField</code> 与 <code>JLabel</code>组件. 将这对组件拖动到面板的右面.</p>
</li>
<li>
<p>将<code>jdbTextField2</code>的 <code>columns</code> 属性设为 <code>10</code>, 将它的 <code>text</code> 属性设为 <code>50</code>.</p>
</li>
<li>
<p>将<code>jLabel2</code>的文本属性设为<code>Maximum value</code>, 改变宽度到能够将全部文本显示出来.</p>
</li>
<li>
<p>将所有的组件按以下方式对齐:</p>
<p>按住CTRL键不放,点取<code>jLabel1</code>与<code>jdbTextField1</code>. 右击并选取"Align Left". </p>
<p>左对齐 <code>jLabel2</code> 与 <code>jdbTextField2</code>. 上对齐两个文本控件与标签控件.</p>
</li>
<li>
<p>从Swing标签中添加一个<code>JButton</code>组件到<code>jPanel1</code>面板中. 将该按钮放在两个文本输入域组件之间. 设置其 <code>text</code> 属性为<code>Update</code>.</p>
<p>最小与最大输入域控件的值作为参数化查询的参数,点击更新按钮以获得更新结果.</p>
</li>
<li>
<p>在检视器中选中Events标签, 选中<code>actionPerformed</code>, 并双击在源代码中产生一个<code>actionPerformed()</code>事件. 源代码编辑框显示出来并将鼠标定位在<code>actionPerformed()</code>中的左右括号之间.</p>
<p>添加代码如下:</p>
<pre>
void jButton1_actionPerformed(ActionEvent e) {
try {
// change the values in the parameter row
// and refresh the display
parameterRow1.setInt("low_no",
Integer.parseInt(jdbTextField1.getText()));
parameterRow1.setInt("high_no",
Integer.parseInt(jdbTextField2.getText()));
queryDataSet1.refresh();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
</pre>
</li>
<li>
<p>保存并运行程序. 运行后的程序应该大致如下所示:</p>
<p><img src="images/paramqueryrun.gif" border="0" alt="Parameterized query tutorial - running application"></p>
<p>为了测试例子程序, 在最小输入域中输入一个新值, 然后点击Update按钮. 表中只显示大于输入值的数据. 在最大值输入域中输入一个新值, 然后按下Update按钮. 表中只显示小于刚输入的值的数据.</p>
<p>为了将你对数据的修改保存到数据源中,你应该添加一个<code>QueryResolver</code>. 怎样增加一个带提交功能按钮或者增加一个<code>JdbNavToolbar</code>组件到内容面板中,(<code>JdbNavToolbar</code>提供了一个默认的提交功能),详细情况见<a href="res_query.html">"从QueryDataSet将数据修改保存到数据源中"</a>.</p>
</li>
</ol>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -