请教Berkeley DB的游标操作
时间:2010-08-29
来源:互联网
网上翻了下,没有找到完整的测试代码,即使有c的api相关介绍也是列了一下流程,贴了少许代码,测试下不行。郁闷啊,请大家帮我看看。
版本是libdb4.6-dev
测试代码如下:
复制代码
gcc -Wall test.c -ldb即可
首先提示你输入一些数据,id, 用户名,薪水。然后是测试查找,删除,这些都是没有问题。输入0可以退出一个测试项目
关键是下面的游标,加上DB_DBT_USERMEM,还报“ERROR: DB_BUFFER_SMALL: User memory too small for return value”
游标还不能打出数据,请教到底何处写错了?
版本是libdb4.6-dev
测试代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <db.h>
-
- #define DBNAME "test.db"
-
- typedef struct emp {
- int empid;
- char lastname[50];
- char firstname[50];
- float salary;
- } emp_t;
-
- DB *openDB(const char *dbFile)
- {
- DB *dbp = NULL;
- int ret = 0;
-
- ret = db_create(&dbp, NULL, 0);
- if (ret != 0) {
- printf("ERROR: %s\n",db_strerror(ret));
- return NULL;
- }
- ret = dbp->open(dbp, NULL, dbFile, NULL, DB_BTREE, DB_CREATE, 0);
- if (ret != 0) {
- printf("ERROR: %s\n",db_strerror(ret));
- return NULL;
- }
- return dbp;
- }
-
- int main(int argc, char* argv[])
- {
- DB *dbp;
- DBC *cursor;
- int ret = 0;
- DBT key, data;
- emp_t emp;
- if ((dbp = openDB(DBNAME)) == NULL) {
- printf("open failed\n");
- return 1;
- }
-
- /* insert */
- while (1) {
- printf("Enter Employee ID: ");
- scanf("%d", &emp.empid);
- if (emp.empid == 0)
- break;
- printf("Enter Last name: ");
- scanf("%s", emp.lastname);
- printf("Enter first name: ");
- scanf("%s", emp.firstname);
- printf("Enter Salary: ");
- scanf("%f", &emp.salary);
-
- memset(&key, 0, sizeof(DBT));
- memset(&data, 0, sizeof(DBT));
-
- key.data = &(emp.empid);
- key.size = sizeof(emp.empid);
- data.data = &emp;
- data.size = sizeof(emp_t);
-
- ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE);
- if (ret != 0) {
- printf("Employee ID exists\n");
- continue;
- }
- }
-
- /* search */
- while (1) {
- printf("Enter Employee ID you wana search: ");
- scanf("%d", &emp.empid);
- if (emp.empid == 0)
- break;
- memset(&key, 0, sizeof(DBT));
- memset(&data, 0, sizeof(DBT));
-
- key.data = &(emp.empid);
- key.size = sizeof(emp.empid);
- data.data = &emp;
- data.ulen = sizeof(emp_t);
- data.flags = DB_DBT_USERMEM;
- ret = dbp->get(dbp, NULL, &key, &data, 0);
- if (ret != 0) {
- printf("Employee ID doesn't exist\n");
- } else {
- printf(" Employee: %d - %s, %s\n Salary: $%.2lf\n", emp.empid, emp.lastname, emp.firstname, emp.salary);
- }
- }
-
- /* delete */
- while (1) {
- printf("Enter Employee ID you wana delete: ");
- scanf("%d", &emp.empid);
- if (emp.empid == 0)
- break;
- memset(&key, 0, sizeof(DBT));
- memset(&data, 0, sizeof(DBT));
-
- key.data = &(emp.empid);
- key.size = sizeof(emp.empid);
-
- ret = dbp->del(dbp, NULL, &key, 0);
- if (ret != 0) {
- if (ret == DB_NOTFOUND)
- printf("Employee ID doesn't exist\n");
- } else {
- printf(" Employee %d deleted.\n", emp.empid);
- }
-
- }
-
- /* cursor */
- ret = dbp->cursor(dbp, NULL, &cursor, 0);
- if (ret != 0) {
- printf("ERROR: %s\n",db_strerror(ret));
- return 1;
- }
- memset(&key, 0, sizeof(DBT));
- memset(&data, 0, sizeof(DBT));
- data.data = &emp;
- data.size = sizeof(emp);
- /* data.flags = DB_DBT_USERMEM; */
-
- while ((ret = cursor->get(cursor, &key, &data, DB_NEXT)) == 0) {
- printf("ret = %d\n", ret);
- printf("%d - %s, %s $%.2lf\n", emp.empid, emp.lastname, emp.firstname, emp.salary);
- memset(&key, 0, sizeof(DBT));
- memset(&data, 0, sizeof(DBT));
- }
- if (ret < 0) {
- printf("ERROR: %s\n",db_strerror(ret));
- }
- cursor->close(cursor);
-
- dbp->close(dbp, 0);
-
- return 0;
- }
首先提示你输入一些数据,id, 用户名,薪水。然后是测试查找,删除,这些都是没有问题。输入0可以退出一个测试项目
关键是下面的游标,加上DB_DBT_USERMEM,还报“ERROR: DB_BUFFER_SMALL: User memory too small for return value”
游标还不能打出数据,请教到底何处写错了?

作者: bsdc 发布时间: 2010-08-29
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
是不是循环里面,这两行的缘故?还有,key在外面也是初始化为0,为啥?
memset(&data, 0, sizeof(DBT));
是不是循环里面,这两行的缘故?还有,key在外面也是初始化为0,为啥?
作者: zzyong08 发布时间: 2010-08-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28