//此代码为注册功能

void create_regtable()
{
	int rc;       //rc为返回值,判断函数是否执行成功  rc=0函数执行成功,rc !=0函数执行失败
    sqlite3 *db;  //SQLite数据库指针 数据库结构体指针sqlite3为结构体
	char *pFileName = "users.db";  //数据库文件名
    char *zErr;

	rc = sqlite3_open(pFileName, &db); /*打开数据库*/
	if(rc)                             /*假,关闭数据库*/
	{
		     cleardevice();
			 setmode();
			 outtextxy(170,200,"打开数据库失败!");
			 Sleep(1000);
             main();
		     sqlite3_close(db);
	}

	char *pSQL="create table users(id int , pwd int ,primary key(id,pwd))";

   	rc = sqlite3_exec(db, pSQL, 0,0, &zErr);   /* sqlite执行接口实现表的创建*/

	if(rc!=SQLITE_OK)
	{
		if (zErr!=NULL)
		{

			 cleardevice();
			 setmode();
			 outtextxy(170,200,"SQL错误!");
			 Sleep(1000);
             main();
			 sqlite3_free(zErr);  /* 释放错误信息所占用的空间*/
		}
	}
    	sqlite3_close(db);

}

void reg_Insert()
{
    users a;
	int rc;
 	char No_id[10]={0,0,0,0,0,0,0,0,0,0};
	char code[6]={"12345"};
	char incode[6];
    sqlite3 *db;  //SQLite数据库指针
    char *pSQL;
    char * zErr;   /* 定义返回错误信息的变量*/

    char *pFileName = "users.db";  //数据库文件名
    rc = sqlite3_open(pFileName, &db); /*打开数据库*/

    if(rc)                             /*假,关闭数据库*/
	{
	         cleardevice();
			 setmode();
			 outtextxy(170,200,"打开数据库失败!");
			 voice_name_error();
             main();
             sqlite3_close(db);
	}

       InputBox(incode,6,"验证注册编号,非教师人员不允许注册");

    if(strcmp(incode,code)==0)
	{

        InputBox(a.id,10,"请输入账号");

     	outtextxy(295,270,a.id);

     if(strcmp(a.id,No_id)==0)
	 {
			 cleardevice();
			 setmode();
			 outtextxy(170,200,"用户名不能为空,请重新注册!");
			 voice_name_error();
             main();
		 }
	   else {

   InputBox(a.pwd,10,"请输入密码");

  	  outtextxy(293,339,"********");

      Sleep(1000);

    pSQL=sqlite3_mprintf("insert into users values('%s','%s')",a.id,a.pwd); 

 	rc = sqlite3_exec(db,pSQL,0,0,&zErr); 

     if(rc) //rc=1
		{
		 cleardevice();
		 setmode();
		 outtextxy(220, 200, "帐号注册失败!");
		 voice_register_ok();

		 main();
		 sqlite3_close(db);
		}
      else
		{
		  outtextxy(220, 200, rc);
		 cleardevice();
		 setmode();
		 outtextxy(220, 200, "帐号注册成功!");
		 voice_register_ok();

		 main();
         sqlite3_close(db);
	  }
	}

	  } else{ cleardevice();main();}

   }     
//此代码为实现账号密码登录验证

void Login()
{
    users a;
    int rc;
    sqlite3 *db;  //SQLite数据库指针   sqlite3结构体  *db指向sqlite3结构体的指针
   const    char *pFileName = "users.db";
   char * zErr;   /* 定义返回错误信息的变量*/
    rc = sqlite3_open(pFileName, &db); /*打开数据库*/
    if(rc)                             /*假,关闭数据库*/
    {
                   cleardevice();
                   setmode();
                   settextstyle(, , "楷体");
                   settextcolor(RGB(,,));
                   outtextxy(, , "打开数据库失败!");
                   voice_No_name();
                   main();
                   sqlite3_close(db);
    }
    InputBox(a.id,,"请输入账号");
     outtextxy(,,a.id);
     InputBox(a.pwd,,"请输入密码");
    outtextxy(,,"********");
    Sleep();
  char *pSQL=sqlite3_mprintf("insert into users(id,pwd)values('%s','%s')",a.id,a.pwd);
  //主要是获取rc返回值,进行判断
 // id和pwd共同组成一个表的主键(联合主键) id/pwd谁都不能插入重复的 rc==1 错误 if取反rc==0登陆成功
 //插入的id不同pwd不同 插入成功 rc==0 if取反rc==1登陆失败
 //相当于用户名不能有重复的,用户名跟密码不能一样,增强账号的安全性。
 rc = sqlite3_exec(db, pSQL, NULL, NULL, &zErr);
//!rc==1;  error
        if (!rc)
        {  //删除多余的数据
            char *pSQL=sqlite3_mprintf("delete from users where id = '%s' and pwd = '%s' ",a.id,a.pwd);
            rc = sqlite3_exec(db, pSQL, NULL, NULL, &zErr);
           cleardevice();
           setmode();
           settextstyle(, , "楷体");
           settextcolor(RGB(,,));
           outtextxy(, , "登录失败!");
           Sleep();
           cleardevice();
           main();
        }
       else     ///rc=0 ok
      {
            cleardevice();
            setmode();
            settextstyle(, , "楷体");
            settextcolor(RGB(,,));
            outtextxy(, , "登录成功,欢迎使用!");
            voice_succeed();
            cleardevice();
            option_Menu();
      }
         sqlite3_close(db);
}

使用数据库sqlite3 C语言实现登陆注册的功能的更多相关文章

  1. Spring Boot+Jpa(MYSQL)做一个登陆注册系统(前后端数据库一站式编程)

    Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且连接我们的MySQL数据库. 我将假设读者为几乎零基础,在实战讲解中会渗透Sprin ...

  2. Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)

    写在最前: 在实际开发中,相信每个项目都会有用户登陆注册功能,这个实现的方法很多,下面是我实现的方法,供大家交流. 新人发帖,万分紧张,怎么样才能装作一副经常发帖的样子不被别人看出来呢-,- ? 好了 ...

  3. PHP数据库登陆注册简单做法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  5. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  6. [转]SQLITE3 C语言接口 API 函数简介

    SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...

  7. 数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,

    Sqlite3 的确非常好用.小巧.速度快.近期研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 导入SQLLite library并引入头文件. libsqlite3.dyl ...

  8. 用户登陆注册【JDBC版】

    前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...

  9. tkinter 创建登陆注册界面

    import tkinter as tk from tkinter import messagebox #设置窗口居中 def window_info(): ws = window.winfo_scr ...

随机推荐

  1. Linux下如何查看哪个进程占用内存多?

    1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者 ...

  2. [翻译]:SQL死锁-死锁排除

    As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...

  3. 小白linux安装php 5.6+nginx配置(踩坑版)

    因为要搭建个知识库,直接用wordpress,这前提是得先装php,实在不喜欢XAMPP,所以自己折腾,没想到php这一来还不少啊,从头到尾折腾了一个小时多.记录下主要的流程和遇到的坑. 首先官网下载 ...

  4. java多线程-线程通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...

  5. C#实现jQuery的方法连缀

    jQuery的方法连缀使用起来非常方便,可以简化语句,让代码变得清晰简洁.那C#的类方法能不能也实现类似的功能呢?基于这样的疑惑,研究了一下jQuery的源代码,发现就是需要方法连缀的函数方法最后返回 ...

  6. Echo.js – 简单易用的 JavaScript 图片延迟加载插件

    Echo.js 是一个独立的延迟加载图片的 JavaScript 插件.Echo.js 不依赖第三方库,压缩后不到1KB大小. 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视 ...

  7. swift学习笔记之-方法部分

    //方法部分 import UIKit //方法(Methods) /*方法是与某些特定类型相关联的函数,类.结构体.枚举都可以定义实例方法 实例方法(Instance Methods): 1.属于某 ...

  8. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  9. [Android]对BaseAdapter中ViewHolder编写简化

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到Li ...

  10. 你真的了解UIButton、UILabel 吗?

    一:首先查看一下关于UIButton的定义 @class UIImage, UIFont, UIColor, UIImageView, UILabel; //设置UIButton的样式 typedef ...