澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

Qt之操作数据库澳门皇冠844网站:,常用函数

使用数据库sqlite3 C语言实现登陆注册的功能,数据库sqlite3

//此代码为注册功能


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(30, 0, "楷体"); 
                   settextcolor(RGB(0,500,0)); 
                   outtextxy(220, 200, "打开数据库失败!");
                   voice_No_name();
                   main();
                   sqlite3_close(db);
    }
    InputBox(a.id,10,"请输入账号");
     outtextxy(295,270,a.id); 
     InputBox(a.pwd,10,"请输入密码");  
    outtextxy(293,339,"********");  
    Sleep(1500); 
  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(30, 0, "楷体");
           settextcolor(RGB(255,0,0)); 
           outtextxy(250, 200, "登录失败!");
           Sleep(1000);
           cleardevice();       
           main();      
        }
       else     ///rc=0 ok
      {
            cleardevice(); 
            setmode();
            settextstyle(30, 0, "楷体");
            settextcolor(RGB(0,500,0)); 
            outtextxy(250, 200, "登录成功,欢迎使用!");
            voice_succeed();
            cleardevice();       
            option_Menu();      
      }
         sqlite3_close(db);
}

 

C语言实现登陆注册的功能,数据库sqlite3 //此代码为注册功能void create_regtable(){ int rc; //rc为返回值,判断函数是否执行成功...

实例:( SQLite 数据库使用回调函数的简单 C 语言实例)

SQLite的特性

下面是访问SQLite官方网站: . org/ 时第一眼看到关于SQLite的特性.

  1. ACID事务

  2. 零配置 – 无需安装和管理配置

  3. 储存在单一磁盘文件中的一个完整的数据库

  4. 数据库文件可以在不同字节顺序的机器间自由的共享

  5. 支持数据库大小至2TB

  6. 足够小,大致3万行C代码,250K

  7. 比一些流行的数据库在大部分普通数据库操作要快

  8. 简单,轻松的API

  9. 包含TCL绑定,同时通过Wrapper支持其他语言的绑定

  10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

  11. 独立: 没有额外依赖

  12. Source完全的Open,你可以用于任何用途,包括出售它

13. 支持多种开发语言,C、PHP、Perl、Java、C#、Python

3 、执行 SQL 语句:
说 明:这个函数的功能是执行一条或者多条 SQL 语句, SQL 语句之间用 “;” 号隔开。建议在执行一条或者多条 SQL 语句得时候,指定第三个参数回调函数,在 回调函数中可以获得执行 Sql 得详细过程,如果所有 Sql 执行完毕则应该返回 0 ,否则,则说明这次执行并没有完全成功。第五个参数:如果执行失败(没有返回 0 )则可以查看第五个阐述得值。来查看详细错误信息。
int sqlite3_exec(
sqlite3*, /* 已经打开的数据库句柄 */
const char *sql, /* 要执行的 Sql 语句 */
sqlite_callback, /* 回调函数 */
void *, /* 传递给回调函数的参数 */
char **errmsg /* 保存错误信息 */
);
通常 sqlite3_callback 和它后面的 void* 这两个位置都可以填 NULL ,表示不需要回调。比如您做 insert 操作,做 delete 操作,就没有必要使用回调。而当作 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

SQLite的功能

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:

  ATTACH DATABASE

  BEGIN TRANSACTION

  comment

  COMMIT TRANSACTION

  COPY

  CREATE INDEX

  CREATE TABLE

  CREATE TRIGGER

  CREATE VIEW

  DELETE

  DETACH DATABASE

  DROP INDEX

  DROP TABLE

  DROP TRIGGER

  DROP VIEW

  END TRANSACTION

  EXPLAIN

  expression

  INSERT

  ON CONFLICT clause

  PRAGMA

  REPLACE

  ROLLBACK TRANSACTION

  SELECT

  UPDATE

同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点像,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是3.7.8。它的官方网站是: .com .cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士。

编译:
[root@localhost test]# gcc sql.c -o sql -l sqlite3

SQLite的管理

管理工具也有不少,这里介绍几款:

1、SQLite Manager是开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。

2、SQLite Administrator是一个用来管理 SQLite 数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。 

3、SQLite Database browser是一个 SQLite 数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持。

    QSqlDatabase对象象征了数据库的关联。Qt使用驱动程序与各种数据库的应用编程接口进行通信。Qt的桌面版(Desktop Edition)包括如下一些驱动程序:

 

 驱动程序  数据库 
 QDB2  IBM DB2 7.1版以及更新的版本 
 QIBASE  Borland InterBase
 QMYSQL  MySql 
 QOCI  甲骨文公司(Oracle Call Interface)
 QODBC   ODBC(包括微软公司的QSL服务)
 QPSQL   PostgreSQL的7.3版以及更高版本 
 QSQLITE  QSLite第3版 
 QSQLITE2  QSLite第2版
 QTDS   Qybase自适应服务器 

    

    由于授权的许可限制,Qt的开源版本无法提供所有的驱动程序,当配置Qt时,即可以选择Qt本身包含的SQL驱动程序,也可以以查件的形式建立驱动程序,公共领域中不断发展的SQLite数据库将向Qt提供支持。

    如下讨论关于Qt进行SQLite的基本操作。

 

代码如下:

 

  1 //添加数据库驱动、设置数据库名称、数据库登录用户名、密码
  2 QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); 
  3 database.setDatabaseName("database.db");
  4 database.setUserName("root");  
  5 database.setPassword("123456");
  6  
  7 //打开数据库
  8 if(!database.open())
  9 {  
 10 qDebug()<<database.lastError();
 11 qFatal("failed to connect.") ;
 12 }
 13 else
 14 {
 15 //QSqlQuery类提供执行和操作的SQL语句的方法。
 16 //可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, 
 17 //以及DDL(数据定义语言)语句,例如CREATE TABLE。
 18 //也可以用来执行那些不是标准的SQL的数据库特定的命令。
 19 QSqlQuery sql_query; 
 20  
 21 QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
 22 QString select_max_sql = "select max(id) from student";
 23 QString insert_sql = "insert into student values (?, ?, ?)";
 24 QString update_sql = "update student set name = :name where id = :id";
 25 QString select_sql = "select id, name from student";
 26 QString select_all_sql = "select * from student";
 27 QString delete_sql = "delete from student where id = ?";
 28 QString clear_sql = "delete from student";
 29  
 30 sql_query.prepare(create_sql);
 31 if(!sql_query.exec())
 32 {
 33 qDebug()<<sql_query.lastError();
 34 }
 35 else
 36 {
 37 qDebug()<<"table created!";
 38 }
 39  
 40 //查询最大id
 41 int max_id = 0;
 42 sql_query.prepare(select_max_sql);
 43 if(!sql_query.exec())
 44 {
 45 qDebug()<<sql_query.lastError();
 46 }
 47 else
 48 {
 49 while(sql_query.next())
 50 {
 51 max_id = sql_query.value(0).toInt();
 52 qDebug()<<QString("max id:%1").arg(max_id);
 53 }
 54 }
 55 //插入数据
 56 sql_query.prepare(insert_sql);
 57 sql_query.addBindValue(max_id 1);
 58 sql_query.addBindValue("name");
 59 sql_query.addBindValue(25);
 60 if(!sql_query.exec())
 61 {
 62 qDebug()<<sql_query.lastError();
 63 }
 64 else
 65 {
 66 qDebug()<<"inserted!";
 67 }
 68  
 69 //更新数据
 70 sql_query.prepare(update_sql);
 71 sql_query.bindValue(":name", "Qt");
 72 sql_query.bindValue(":id", 1);
 73 if(!sql_query.exec())
 74 {
 75 qDebug()<<sql_query.lastError();
 76 }
 77 else
 78 {
 79 qDebug()<<"updated!";
 80 }
 81  
 82 //查询部分数据
 83 if(!sql_query.exec(select_sql))
 84 {
 85 qDebug()<<sql_query.lastError();
 86 }
 87 else
 88 {
 89 while(sql_query.next())
 90 {
 91 int id = sql_query.value("id").toInt();
 92 QString name = sql_query.value("name").toString();
 93  
 94 qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);
 95 }
 96 }
 97  
 98 //查询所有数据
 99 sql_query.prepare(select_all_sql);
100 if(!sql_query.exec())
101 {
102 qDebug()<<sql_query.lastError();
103 }
104 else
105 {
106 while(sql_query.next())
107 {
108 int id = sql_query.value(0).toInt();
109 QString name = sql_query.value(1).toString();
110 int age = sql_query.value(2).toInt();
111  
112 qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
113 }
114 }
115  
116 //删除数据
117 sql_query.prepare(delete_sql);
118 sql_query.addBindValue(max_id);
119 if(!sql_query.exec())
120 {
121 qDebug()<<sql_query.lastError();
122 }
123 else
124 {
125 qDebug()<<"deleted!";
126 }
127  
128 //清空表
129 sql_query.prepare(clear_sql);
130 if(!sql_query.exec())
131 {
132 qDebug()<<sql_query.lastError();
133 }
134 else
135 {
136 qDebug()<<"cleared";
137 }
138 }
139  
140 //关闭数据库
141 database.close();
142  
143 //删除数据库
144 QFile::remove("database.db");

 

 

可以通过一些工具对SQLite进行管理,如下:

 

澳门皇冠844网站 1

 

SQLite的管理

管理工具挺多的,这里简单介绍几款:

  • SQLite Manager:开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
  • SQLite Administrator:一个用来管理SQLite数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。
  • SQLite Database browser:一个SQLite数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。

#include <stdio.h>
#include <sqlite3.h>
static int callback( void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for (i=0; i<argc; i )
{
printf( "%s = %sn" , azColName[i], argv[i] ? argv[i] : "NULL" );
}
printf( "n" );
return 0;
}
int main( int argc, char **argv)
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if ( argc!=3 )
{
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENTn" , argv[0]);
return 1;
}
rc = sqlite3_open(argv[1], &db);
if ( rc )
{
fprintf(stderr, "Can't open database: %sn" , sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if ( rc!=SQLITE_OK )
{
fprintf(stderr, "SQL error: %sn" , zErrMsg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}

用PHP操作sqlite数据库

  a、 如何连接sqlite数据库?

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  select * from sqlite_master;

  echo "数据库连接成功!n

  ";

  } else {

  die($sqliteerror);

  }

  b、 如何列出数据库中所有的表?

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  $result = sqlite_array_query($db, 'select * from sqlite_master;');

  foreach ($result as $entry) {

  echo 'talbe name='.$entry['name']."

  n";

  echo 'sql='.$entry['sql']."

  n";

  echo "

  --------------------------------------------------------------------------------

  ";

  }

  sqlite_close($db);

  } else {

  die($sqliteerror);

  }}

  c、 对sqlite数据库的查询,以及结果集的显示

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  $result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);

  echo "user表查询结果:

  n";

  echo " n name email

  n";

  foreach ($result as $entry) {

  echo ' '.$entry['name']." " $entry['email']."

  n";

澳门皇冠844网站,  }

  echo ' ';

  sqlite_close($db);

  } else {

  die($sqliteerror);

  }

  d、 数据库对象记录的增加、删除、修改

  sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");

  sqlite_query($db, "delete from user where user=’user99’");

sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');

5 、取当前插入位置:
功能:返回你前一次插入得位置,从 1 开始, sqlite3* 为你打开数据库所得到得句柄。
long long int sqlite3_last_insert_rowid(sqlite3*);
6 、非回调 select 查询:
功能:执行一次查询 Sql 并且返回得到一个记录集。
int sqlite3_get_table(
sqlite3*, /* 已经打开的数据库句柄 */
const char *sql, /* 要执行的 Sql 语句 */
char ***resultp, /* 保存返回记录集的指针 */
int *nrow, /* 返回记录数(及查出多少行) */
int *ncolumn, /* 返回字段数(多少列) */
char **errmsg /* 返回错误信息 */
)
说明:第三个参数是查询结果,它是一维数组,内存布局为:第一行是字段名称,后面是紧接着是每个字段的值。
实例:
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char **dbResult;
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( “c:\Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
return -1;
}
// 数据库操作代码
// 假设前面已经创建了 MyTable_1 表
// 开始查询,传入的 dbResult 已经是 char ** ,这里又加了一个 & 取地址符,传递进去的就成了 char ***
result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result )
{
// 查询成功
index = nColumn; // 前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据
printf( “ 查到 %d 条记录 n”, nRow );
for( i = 0; i < nRow ; i )
{
printf( “ 第 %d 条记录 n”, i 1 );
for( j = 0 ; j < nColumn; j )
{
printf( “ 字段名 :%s ?> 字段值 :%sn”, dbResult[j], dbResult [index] );
index; // dbResult 的字段值是连续的,从第 0 索引到第 nColumn - 1 索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示
}
printf( “-------n” );
}
}
// 到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
sqlite3_free_table( dbResult );
// 关闭数据库
sqlite3_close( db );
return 0;
}

用JAVA操作SQLite

2 、关闭数据库:
说明:如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
int sqlite3_close(sqlite3*); // 参数就是刚才的结构体,也就是数据库句柄

示例代码

package wang.liang;

import java.sql.*;

 

public class TestSQLite {

       public static void main(String[] args) {

              try {

                     Class.forName("org.sqlite.JDBC");//连接SQLite的JDBC

                     //建立一个数据库名testSQLite.db的连接,如果不存在就目录下创建之

                     Connection conn =DriverManager.getConnection("jdbc:sqlite://E:/Program code/SQLite code/testSQLite.db");

                     Statement stat = conn.createStatement();

//创建一个表,两列

                     stat.executeUpdate("create table table1(name varchar(20), salary int);");

//插入数据

                     stat.executeUpdate("insert into table1 values('ZhangSan',6000);");                             stat.executeUpdate("insert into table1 values('LiSi',7800);");

                     stat.executeUpdate("insert into table1 values('WangWu',8800);");

                     stat.executeUpdate("insert into table1 values('ZhaoLiu',9000);");

                     ResultSet rs = stat.executeQuery("select * from table1;");//查询数据

                     while(rs.next()){//将查询到的数据打印出来

                            System.out.print("name = " rs.getString("name") " ");//列属性一

                            System.out.println("salary = " rs.getString("salary"));//列属性二

                     }

                     rs.close();

                     conn.close();//结束数据库的连接

              }

              catch(Exception e ) {

                     e.printStackTrace();

              }

       }

}

总结:本文介绍了嵌入式数据库SQLite在Java中的应用,通过创建表、插入数据、查询等操作介绍了在Java中对数据库的操纵。

本文由澳门皇冠金沙网站发布于编辑程序,转载请注明出处:Qt之操作数据库澳门皇冠844网站:,常用函数