热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CGI如何用C控制sqlite3?

【问题描述】利用C编写CGI程序,如何控制sqlite3,进行基本的数据库操作?【简介】需要建立的变量sqlite3*db;intnrow0,ncolumn0;ch

【问题描述】利用C编写CGI程序,如何控制sqlite3,进行基本的数据库操作?

【简介】

需要建立的变量

sqlite3 *db;
int nrow = 0, ncolumn = 0;
char **azResult = NULL;
char *zErrMsg = 0;

char sql[500];
int rc = 0;

需要包含的头文件

#include 

备注:详见搭建sqlite3嵌入式开发环境,安装后,会产生一个sqlite3.h的文件。

1 打开数据库(open)

rc = sqlite3_open("test.db", &db);
if (rc)
{
printf("Content-type: text/html\n\n");
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return sql_errror();
}

其中,sql_error()是自定义的函数。
2 关闭数据库(close)

sqlite3_close(db);

3 查(select)

sprintf(sql, 
"select * from user where name='%s' AND passwd='%s'",
username, passwd);

rc = sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
if (rc != SQLITE_OK)
{
printf("Content-type: text/html\n\n");
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_close(db);
return sql_errror();
}

if(*azResult != NULL)
{
printf("Content-type: text/html\n\n");
int i;
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
...
}

查询的结果保存在**azResult中,为nrow x ncolumn数组。

4 增(insert)

sprintf(sql, 
"insert into user(name,passwd) values('%s','%s')",
username,passwd);

rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL1 error: %s\n", zErrMsg);
return 1;
}

回调函数(callback)

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = 0;

printf("Content-type: text/html\n\n");
for (i=0; i {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}

printf("\n");
return 0;
}

5 改(update)

sprintf(sql, 
"update user set userid='%s' where name='%s'",
userid,username);

rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL1 error: %s\n", zErrMsg);
return 1;
}

6 删(delete)

sprintf(sql, 
"delete from user where name='%s'",
username);

rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL1 error: %s\n", zErrMsg);
return 1;
}

7 创建表

sprintf(sql, 
"create table user(name varchar(20), passwd varchar(20))");

rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL1 error: %s\n", zErrMsg);
return 1;
}

8 删除表

sprintf(sql, 
"drop table user");

rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK)
{
fprintf(stderr, "SQL1 error: %s\n", zErrMsg);
return 1;
}

其他操作相类似,不再赘述。详细请参考:

http://www.w3school.com.cn/sql/sql_drop.asp

http://www.sqlite.org/sqlite.html

 

如何编译,请参见c调用sqlite3的编译方法

 

 


 

 

 

 

 


推荐阅读
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • Mr.J 的 jQuery 学习笔记:第三十一讲——深入解析事件操作(on/off)方法
    `on()` 方法用于在选定元素及其子元素上绑定一个或多个事件处理程序。从 jQuery 1.7 版本开始,`on()` 方法取代了 `bind()`、`delegate()` 和 `live()` 方法,成为统一的事件绑定方式。该方法不仅支持直接绑定事件,还支持事件委托,使得事件处理更加灵活和高效。通过 `off()` 方法,可以移除之前使用 `on()` 绑定的事件处理程序,从而实现对事件的动态管理。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
author-avatar
dtssv90623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有