代码是相当直观。它声明一些主机变量,在一个BEGIN/END DECLARE SECTION构造中包装声明,打开一个SELECT光标查询,并且然后一行一行地取到主机变量中,光标然后关闭。
我使用了更旧, 一致反对的sqlcode变量而不是更现代的sqlstate,因为这种方式更容易检查一个NOT FOUND情形。
把客户带入MySQL的生活
Mysql的C API是相当易用的。核心元素是包含有关数据库连接的信息和其状态的结构,它通过连接MySQL服务器进行初始化。该结构的一根指针必须被传递给所有的 MySQL 客户函数。
查询以字符串提交;这意味着一个人必须处理 C 字符串变换功能,包含空字节(\0) 的数据应该能使用,情况变得更复杂了,因为随后传递了一个计数字符串而不是一个 C字符串。
为了获取查询结果,一个指向MYSQL_RES结构的指针和一个数值变量用适当的 API 函数初始化,然后将一行取进一个MYSQL_ROW变量,它是一个字符串数组,直接将结果放进整数变量,就像Postgresql的ESQL的实现能做的那样,但这是不可能的,结果缓冲区随后被释放。只要你能理解,语义几乎与在ESQL使用光标相同。
list_books(void) { int count; MYSQL_RES *result; mysql_query(&bookstore, "SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,\ AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,\ COPIES_AVAILABLE FROM BOOK"); result = mysql_store_result(&bookstore); for(count = mysql_num_rows(result); count > 0; count--) { MYSQL_ROW record; record = mysql_fetch_row(result); printf("\nArticle no. %s\n", record[0]); printf("%s, %s:\n", record[2], record[1]); printf(" %s (%s)\n", record[3], record[4]); printf("Bought at %s; selling at %s; %s copies available\n\n", record[5], record[6], record[7]); }; mysql_free_result(result); }
mysql_free_result ( 结果 ); }
API函数简明扼要,但足够了, Texinfo格式的文档作为Mysql文档的主要来源。
把客户带入mSQL的 上把顾客带到生活
mSQL和Mysql C API 之间的差别非常非常小。这样, 甚至可能有一个自动变换器。主要的差别是:
mSQL 不存储连接数据块, 仅存一个数字(int bookstore)
一些 mSQL 函数不拿连接作为一个参数
mSQL 函数名字是Pascal风格(他们使用大写首字符而不是下划线)
方便的MONEY数据类型是一个有2个的十进制位的固定精度小数类型。为了使mSQL正确地在MONEY列中将分币(cent)存入整数数字里,我需要转换他们,强制到float,分离他们并且在add_new_book()函数中的sprintf语句格式化他们。
这是list_books(), 移植到 mSQL :
void list_books(void) { int count; m_result *result; msqlQuery(bookstore, "SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,\ AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,\ COPIES_AVAILABLE FROM BOOK"); result = msqlStoreResult(); for(count = msqlNumRows(result); count > 0; count--) { m_row record; record = msqlFetchRow(result); printf("\nArticle no. %s\n", record[0]); printf("%s, %s:\n", record[2], record[1]); printf(" %s (%s)\n", record[3], record[4]); printf("Bought at %s; selling at %s; %s copies available\n\n", record[5], record[6], record[7]); }; msqlFreeResult(result); }
mSQL的 C API文档可以在mSQL 手册里找到,它以Posts cript和一个大的HTML文件与mSQL一起发行。
一些早期结论
所有这3个讨论的数据库系统是相当容易安装、设置和编程。实现C API的客户库是很小的;与现今的比如GUI工具箱,他们的大小是可以忽略的,并且在客户程序的二进制大小或存储器足迹(footprint)没有太大的差别。
Postgresql的ESQL API的不断增加的冗长和更长的准备时间通过少花些精力在转换字符串到非字符串后反过来进行弥补。
到目前为止, 我没有说过任何关于性能的事情。我将在这个系列的下一部分做深入研究。

投稿指南


