socket聊天室---sqlite3的简单使用

简介: socket聊天室---sqlite3的简单使用

C语言操作sqlite3

假设数据库为my.db,有数据表student。

CREATE TABLE  IF NOT EXISTS student (no integer primary key, name text, score real);

常用函数

sqlite3_open
int   sqlite3_open(char  *path,   sqlite3 **db);
  • 功能: 打开sqlite数据库参数:
  • path: 数据库文件路径
  • db: 指向sqlite句柄的指针,后面对数据库所有的操作都要依赖这个句柄
  • 返回值: 成功返回0,失败返回错误码(非零值)
sqlite3_close
int   sqlite3_close(sqlite3 *db);
  • 功能: 关闭sqlite数据库
  • 返回值: 成功返回0,失败返回错误码
sqlite3_errmsg
const  char  *sqlite3_errmsg(sqlite3 *db);
  • 功能: 打印错误信息
  • 返回值: 返回错误信息

不使用回调函数执行SQL语句

sqlite3_get_table
int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int *nrow,                                        int *ncolumn, char **errmsg);
  • 功能: 执行SQL操作参数:
  • db:数据库句柄 sql:SQL语句
  • resultp:用来指向sql执行结果的指针
  • nrow:满足条件的记录的数目
  • ncolumn:每条记录包含的字段数目
  • errmsg:错误信息指针的地址
  • 返回值: 成功返回0,失败返回错误码
    eg:
    要显示student表中所有的数据信息,我们就可以利用sqlite3_get_table()执行语句:
    select * from student
    代码:
void do_show_sample(sqlite3 *db) { 
    char **result, *errmsg;
    int nrow, ncolumn, i, j,index; 
    if (sqlite3_get_table(db, "select * from student", &result, &nrow, &ncolumn,
                                               &errmsg) != 0){ 
        printf("error : %s\n", errmsg);  
        sqlite3_free(errmsg);
    } 
    index = ncolumn;
    for (i=0; i<nrow; i++) {  
        for (j=0; j<ncolumn; j++) {  
            printf("%-8s : %-8s\n", result[j], result[index]);
            index++; 
        }  
        printf("************************\n");
    } 
    sqlite3_free_table(result); 
    return; 
}

使用回调函数执行SQL语句

sqlite3_exec
typedef  int (*sqlite3_callback)(void *, int, char **, char **);
int   sqlite3_exec(sqlite3 *db, const  char  *sql,  sqlite3_callback callback, void *,
                                            char **errmsg);
  • 功能: 执行SQL操作参数:
  • db:数据库句柄
  • sql:SQL语句,就是我们前面两章用于操作表的增删改查语句
  • callback:回调函数
  • errmsg:错误信息指针的地址
  • 返回值: 成功返回0,失败返回错误码
    回调函数
typedef  int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
  • 功能: 每找到一条记录自动执行一次回调函数参数:
  • para:传递给回调函数的参数
  • f_num:记录中包含的字段数目
  • f_value:包含每个字段值的指针数组
  • f_name:包含每个字段名称的指针数组
    返回值: 成功返回0,失败返回-1
    eg
sqlite3 *db;
char  *errmsg,**resultp;
int callback(void *para, int f_num, char **f_val, char **f_name){
    int i;
    for (i=0; i<f_num; i++) { 
        printf("%-8s", f_val[i]); 
    }
    printf("\n"); 
    return 0;
}
void do_show(sqlite3 *db){
     char *errmsg; 
     printf("no      name    score\n");  
     if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0) {  
         printf("error : %s\n", sqlite3_errmsg(db));
     }
     printf("\n");
     return;
}

回调函数方法实现的代码,需要实现一个回调函数:callback。函数sqlite3_exec()在解析命令"select * from student" ,每获取到一行数据就会调用一次回调函数

数据库编译

编译需要使用第三方库lsqlite3。

gcc student.c -o run -lsqlite3

其他函数

sqlite3 *pdb

数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt *stmt

这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_exec()

执行非查询的sql语句

sqlite3_prepare()

准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装 了sqlite3_exec)

Sqlite3_step()

在调用sqlite3_prepare后,使用这个函数在记录集中移动

还有一系列的函数,用于从记录集字段中获取数据,如:

sqlite3_column_text()

取text类型的数据

sqlite3_column_blob()

取blob类型的数据

sqlite3_column_int()

取int类型的数据

完整实例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sqlite3.h>
void do_insert(sqlite3 *db)
{
     int no;
     char name[16];
     float score;
     char sqlstr[128], *errmsg;
     printf("input no : ");
     scanf("%d", &no);
     printf("input name : ");
     scanf("%s", name);
     printf("input score : ");
     scanf("%f", &score);
     sprintf(sqlstr, "insert into student values (%d, '%s', %.1f)", 
     no, name, score);
     #if __DEBUG
     printf("cmd:%s\n",sqlstr);
     #endif
     if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != 0)
     {
          printf("error : %s\n", sqlite3_errmsg(db));
     }
     else
     {
          printf("insert is done\n");
     }
     printf("\n");
     return;
}
void do_delete(sqlite3 *db)
{
     char *errmsg;
     char sqlstr[128], expression[64];
     printf("input expression : ");
     scanf("%s", expression);//name='ma'
     sprintf(sqlstr, "delete from student where %s", expression);
#if __DEBUG
     printf("cmd:%s\n",sqlstr);
#endif
     if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != 0)
     {
          printf("error : %s\n", sqlite3_errmsg(db));
     }
     else
     {
          printf("deletet is done\n");
     }
     printf("\n");
     return;
}
int callback(void *para, int f_num, char **f_val, char **f_name)
{
     int i;
     for (i=0; i<f_num; i++)
     {
          printf("%-8s", f_val[i]);
     }
     printf("\n");
     return 0;
}
void do_show(sqlite3 *db)
{
     char *errmsg;
     printf("no      name    score\n");
     if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0)
     {
          printf("error : %s\n", sqlite3_errmsg(db));
     }
     printf("\n");
     return;
}
 void do_show_sample(sqlite3 *db)
 {
      char **result, *errmsg;
     int nrow, ncolumn, i, j, index;
     if (sqlite3_get_table(db, "select * from student", &result, &nrow, &ncolumn, &errmsg) != 0)
     {
          printf("error : %s\n", errmsg);
          sqlite3_free(errmsg);
     }
     index = ncolumn;
     for (i=0; i<nrow; i++)
     {
          for (j=0; j<ncolumn; j++)
          {
           printf("%-8s : %-8s\n", result[j], result[index]);
       index++;
          }
          printf("************************\n");
     }
     sqlite3_free_table(result);
     return;
 }
int main()
{
     sqlite3 *db;
     int n;
     char clean[64];
     if (sqlite3_open("my.db", &db) < 0)
     {
          printf("fail to sqlite3_open : %s\n", sqlite3_errmsg(db));
          return -1;
     }
     while ( 1 )
     {
          printf("*********************************************\n");
          printf("1: insert record   \n2: delete record  \n3: show record  \n4: quit\n");
          printf("*********************************************\n");
          printf("please select : "); 
          if (scanf("%d", &n) != 1)
          {
               fgets(clean, 64, stdin);
               printf("\n");
               continue;
          }
          switch ( n )
          {
               case 1 :
                do_insert(db);
                break;
               case 2 :
                do_delete(db);
                break;
               case 3 :
                do_show_sample(db);
                break;
               case 4 :
                sqlite3_close(db);
                exit(0);
          }
     }
     return 0;
}


目录
相关文章
|
8天前
|
安全 网络安全 数据安全/隐私保护
CocosCreator 面试题(十四)Cocos Creator WebSocket 、Socket.IO分别是什么?
CocosCreator 面试题(十四)Cocos Creator WebSocket 、Socket.IO分别是什么?
152 0
|
8天前
|
网络协议 安全 Python
python中socket客户端关闭连接
【4月更文挑战第7天】本教程介绍了如何在TCP客户端中正确关闭连接。使用`close()`方法可关闭Socket连接并释放资源,示例代码显示了在正常和异常情况下关闭连接的方法。注意异常处理以确保在任何情况下都能关闭连接,并避免并发操作同一Socket,以保证连接的稳定和安全。掌握这些技巧对编写健壮的TCP客户端至关重要。
|
1天前
|
监控 网络协议 安全
socket开发遇到的问题及注意事项实战
socket开发遇到的问题及注意事项实战
10 1
|
10月前
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
8天前
|
安全 数据库 数据安全/隐私保护
七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法
七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法
|
JavaScript Windows
JS案例:Socket聊天室(两种方式)
JS案例:Socket聊天室(两种方式)
59 0
|
存储 JSON 网络协议
关于easyswoole实现websocket聊天室的步骤解析
关于easyswoole实现websocket聊天室的步骤解析
457 0
python+socket服务端和客户端
python+socket服务端和客户端
142 0
python+socket服务端和客户端
|
Python
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
515 0
Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态

热门文章

最新文章