Empress数据库mr编程1
Empress为c\c++编程提供了两套直接访问数据库的接口程序:mx和mr。这两套接口提供了比任何查询语言更快的执行速度,能够更好的控制数据库,允许用户实现功能更复杂的函数,自定义报表格式,开发高层接口等等。
mr与mx比较:
mx比mr简单,只适应一些简单的应用;
mx一次只能访问一个表实例,mr则可以访问多个;
mr编程比mx运行速度快;
mr提供了测试程序判断某个系统目录是否是empress数据库;
mr具有打开整个数据库功能,需要多个表的并发访问;
mr提供了更复杂的条件查询。
示例数据库: repairs, 表:personnel,loans。
CREATE table personnel (number INTEGER, name CHAR (25, 1),
phone CHAR (15, 1), credit_limit dollar (6, 1));
表personnel记录:
*** Table: personnel ***
number name phone credit_limit
10 Kilroy 426-9681 $500.00
3 Jones 667-2951 $500.00
5 Mosca 544-2243 $750.00
17 Wladislaw 723-6073 $600.00
8 Peterson 978-6060 $250.00
4 Scarlatti 961-7363 $100.00
CREATE table loans (name CHAR (25, 1),
date DATE (1), amount DOLLAR (6, 1));
表loans记录:
*** Table: loans ***
name date amount
Mosca 2 February 1992 $150.00
Jones 7 February 1992 $33.95
Kilroy 16 February 1992 $250.00
Wladislaw 27 February 1992 $55.00
Jones 3 April 1992 $25.00
Mosca 4 May 1992 $200.00
Wladislaw 12 May 1992 $25.00
Peterson 6 June 1992 $50.00
Wladislaw 25 June 1992 $75.00
Jones 12 August 1992 $300.00
Jones 25 December 1992 $100.00
(一)访问MR接口程序
例1
#include <mscc.h> // 包含mr库文件
main ()
{
msinit (); // 初始化
// ...
msexit (1); // 执行程序结束时的清理工作
}
例2
#include <mscc.h>
msmain () // 使用msmain()自动初始化和结束清理工作
{
// ...
}
(二)打开和关闭表
table_desc = mropen (database_name, table_name, mode);
database_name:数据库名
table_name:表名
mode: ‘r’读模式
‘u’更新模式
‘d’延迟模式
table_desc:成功:返回表描述符
失败:终止调用程序
说明: (1)打开表时自动上锁;
(2)为了获得表的信息会打开数据字典;
(3)如果数据字典已经打开,可以使用CHARNIL代替database_name。
flag = mrclose (table_desc);
flag:成功返回真,失败返回假。
说明:关闭表会解锁表。
例3
#include <mscc.h>
#define DATABASE "repairs"
msmain ()
{
addr loans_tabdesc;
// 打开表loans
loans_tabdesc = mropen (DATABASE, "loans", 'u');
if (!mrclose (loans_tabdesc))
{ // 打印出错信息
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mroperr='%d' : %s\n", mroperr, mrerrmsg ());
}
return 0;
}
(三)打开和关闭数据字典
mropdict (database_name, mode);
mode: ‘r’读模式
‘u’更新模式
说明:(1)一次只能打开一个数据字典;
(2)打开数据字典后,打开和关闭表的速度会加快。
mrcldict ();
例4
#include <mscc.h>
#define DATABASE "repairs"
msmain ()
{
addr loans_tabdesc;
mropdict (DATABASE, 'r');
loans_tabdesc = mropen (CHARNIL, "loans", 'u');
mrcldict ();
if (!mrclose (loans_tabdesc))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mroperr='%d' : %s\n", mroperr, mrerrmsg ());
}
return 0;
}
(四)检测目录是否是数据库
flag = mrqdb (directory);
directory:目录名,可以是相对路径,也可以是绝对路径;
flag:成功返回真,失败返回假。
例5
#include <mscc.h>
#define DATABASE "repairs"
msmain()
{
if (mrqdb(DATABASE))
{
printf("%s is an Empress database!\n",DATABASE);
}
}