baserunner 使用标准的dbf格式的数据库。由于不同的xBase数据库有不同的备注字段文件格式,因此baserunner也有几个不同的版:foxpro版本与dBase版。在大多数情况下,Foxpro版本的效率更高,因此如果没有特别的要求,最好选择Foxpro版本。对于dBase数据库,baserunner按最通用的格式来处理备注字段文件,因此如果在处理备注字段遇到问题的话,请与baserunner联系,我们将给你提供支持你所使用的数据库的新拷贝(这主要出现在由VB建立的数据库之中)。即使你的数据库中没有备注字段,由baserunner建立的会话数据库也会使用备注字段。baserunner不使用索引文件。
多数DBMS软件,包含MS Access(与许多电子表格和字处理软件一同发布)能够产生dbf格式的数据库文件,以及很多共享软件都可以建立并管理dbf格式的数据库。你还可以使用basemaker (在baserunner.com网站上可以使用的软件)也可以创建dbf格式的数据库文件。
baserunner支持以下数据类型的字段:
| 类型 | 长度 | 小数位数 | 描述 |
|---|---|---|---|
| Character | 1-254 |
N/A | 固定长度的字符串,虽然baserunner最长可以支持32K长的字符串,但太长的字符串会严重影响效率与xBase的兼容性。此时应该备注型字段 |
| Date | 8 | N/A | 日期型,格式为CCYYMMDD |
| Logical | 1 | N/A | 逻辑型。真时为T,假为F,baserunner将没有值是定义为假 |
| Numeric | 1-20 | FoxPro: length-1 dBase: length-2 |
数字型 |
| Memo | 10 (数据包含在备注字段文件之中) |
N/A | 包含可变长度的字符串,最长可达64K。 |
另外,对于Foxpro版,除了这些标准的数据类型之处,baserunner还可识别Float,Integer,Double,Currency(都当作numericod 类型)与DateTime。
对于数据库的大小,baserunner没有特别的限制。从理论上看,可以使用到1G的数据库文件,但这会严重影响你的性能。 数据库越大,baserunner需要的内存就越多。对于一上繁忙的服务器来说,数据流量是很重要的。一个很好的规则是:数据库最大,你的应用程序就就越简单。使用大的数据库、复杂的查询以及诸如baserunner的列表、汇总等特性,需要很好的考虑性能与成本。比如说,你的一个数据库有1万条记录,你最好将它分为几个更小的数据库。
你的应用程序的每一个模板都将与一个数据库相关。你可以在一个应用程序中使用多个数据库。由于baserunner不是真正的支持关系数据库,因此数据库之间的关系只能由程序自身进行管理与操纵。
baserunner将使用一个由_dbf 指定的一个模板。_dbf变量通常在应用程序的配置文件中定义(缺省值),如果在配置文件中定义了这个变量,它将被由命令行或表单中传递的_dbf变量覆盖,在这种情况下,baserunner将会在下次调用时恢复其缺省值。如果在配置文件中没有定义_dbf变量,每次调用都需要传递这个变量(通过命令行或表单),如果没有传递这个变量,将使用上一次的变量值。.
如果你在一个应用程序中使用多个数据库,你必须重视几个问题:会话记录维护着当前查询语句与记录数,当你从一个数据库转到另一个数据库时,如果没有给出适当的记录位置指针与有效的查询语句,会出现一些奇怪的现象。有时会出现用户游览器中的后退按钮在应用程序中不能使用(在使用单个数据库时是可以使用的)。在大多数情况下,改变数据库时,每个调用都应明确的指定记录位置与查询语句。
使用第二个数据库的最简单化的方法是,在第二个数据库中使用_tempfil变量。这个变量将在使用后被删除,以恢复到原来的查询语句,并且,存储在用户会话数据库中的也会被删除。当然,正是因为这样,第二个数据库的当前记录指针没有被存储,你不能在第二个数据库之中使用Navigation操作(如后退,下一个等),你只能对它的记录进行显示。
例子:
如果你将一个数据库分为几个更小的数据库,以提高更好的性能,就可以在查询表单中使用_dbf变量。这样,当使用多个数据库时,对用户说就是透明的。下面的例子中,根据地区的不同,将数据库分成了三个小的数据库。然后根据用户的选择来使用不同的数据库。
| <form method="POST"
action="/cgi-bin/baserun.exe"> <input type="HIDDEN" name="_ses" value="{session}"> <input type="HIDDEN" name="_tar" value="target.htm"> <input type="HIDDEN" name="_act" value="query"> <select name="_dbf" size="1"> <option value="east.dbf">East</option> <option value="west.dbf">West</option> <option value="south.dbf">South</option> <option value="midwest.dbf">Midwest</option> </select> <input type="TEXT" size="20" name="field_name"> <input type="SUBMIT" value="Submit"> |
下面是一个使用多个数据库进行输入的例子:
| Item name: {item} Item code: {code} Item price: {str(price, 10, 2)} <form method="POST" action="/cgi-bin/baserun.exe"> <input type="HIDDEN" name="_ses" value="{session}"> <input type="HIDDEN" name="_tar" value="target.htm"> <input type="HIDDEN" name="_act" value="entry"> <input type="HIDDEN" name="_dbf" value="target.dbf"> Enter Quantity: <input type="TEXT" size="10" name="quantity_field"> <input type="HIDDEN" name="user_code" value="{session}"> <input type="HIDDEN" name="item" value="{item}"> <input type="HIDDEN" name="code" value="{code}"> <input type="HIDDEN" name="_recordnumber" value="{ltrim(str(recno()))}"> <input type="HIDDEN" name="price" value="{str(price, 10, 2)}"> <input type="HIDDEN" name="%total" value="str(quantity_field*price, 10, 2)"> <input type="SUBMIT" value="Order"> |
当使用输入表单将数据存入多个数据库时,一旦_entrypass模板被分析之后,缺省数据库就变为数据被存入的数据库,为了回到原来的目录数据库,你需要加入一个链接(如下),并且可能还需要在表单中使用_recordnumber变量。
| <a href= "/cgi-bin/baserun.exe?_ses={session}&_tar=catalog.htm&_dbf=catalog.dbf&_act={_recordnumber}"> Go Back</a> |
在这种情况下,使用代码进行录入的程序可能会如下:
| <form method="GET"
action="/cgi-bin/baserun.exe"> <input type="HIDDEN" name="_ses" value="{session}"> <input type="HIDDEN" name="_tar" value="target.htm"> <input type="HIDDEN" name="_dbf" value="target.dbf"> <input type="HIDDEN" name="_fil" value="user_code='{session}'"> <input type="SUBMIT" value="Check out"> |
在应用程序中仿真关系模式的最简单的方法是使用_tempfil变量并将目标模板设置到一个新的窗口(或一个独立的框架)。此时,两个数据库都含有一个相同的字段(如code),并且第二个数据库中每个代码都对应多个记录。
| Item name: {item} Item code: {code} Item price: {str(price, 10, 2)} <form method="POST" action="/cgi-bin/baserun.exe" target="_top"> <input type="HIDDEN" name="_ses" value="{session}"> <input type="HIDDEN" name="_tar" value="target.htm"> <input type="HIDDEN" name="_tempfil="code={alltrim(code)}"> <input type="HIDDEN" name="_dbf" value="target.dbf"> <input type="SUBMIT" value="Details"> |
模板target.htm可能包含用于显示多个记录的列表:
Details for {alltrim(code)}
<table>
<tr>
<th>Text</th>
<th>Date</th>
<th>Number</th>
</tr>
<!--list1-->
<tr>
<td>{trim(chr_field)}</td>
<td>{dtoc(date_field)}</td>
<td>{str(num_field, 10, 2)}</td>
</tr>
<!--endlist-->
</table>
使用多个数据库的另一种方法是在特别定的数据库中建立一个口令系统。如果你的一个数据库中包含了所有可能使用特定数据库的全部用户的信息(如用户名与口令等),应用程序就应该以对口令数据库的查询作为开始(查询模板包含应包含在_defhtml之中),如果用户与口令在口令数据库在不存在,就执行 _posintionfail模板并将它的结果送到客户端, 否则返回目标模板。
| <form method="POST"
action="/cgi-bin/baserun.exe"> <input type="HIDDEN" name="_ses" value="{session}"> <input type="HIDDEN" name="_tar" value="target.htm"> <input type="HIDDEN" name="_act" value="query"> <input type="HIDDEN" name="_dbf" value="user.dbf"> <input type="HIDDEN" name="_exact" value="1"> <input type="HIDDEN" name="_positionfail" value="Invalid name or password"> Name: <input type="TEXT" size="20" name="user_name"> Password: <input type="TEXT" size="20" name="password"> <input type="SUBMIT" value="Submit"> |
如果找到口令与用户名,则调用target.htm模板。这个模板将把用户带到受保护的数据库之中:
<a href="/cgi-bin/baserun.exe?_ses={session}&_tar=protected.htm&_dbf=protected.dbf">
You passed; Proceed</a>