关于数据库一些使用操作方法

来源:互联网 发布:海关数据怎么贩卖 编辑:程序博客网 时间:2024/05/22 17:27
SQLite将每个数据库都保存成一个文件。
 数据库中的数据被组织成表的形式。
 表由若干拥有相同字段的记录组成。
 表可以为空,即拥有0条记录。
 字段指的是记录中的数据域,它有不同的类型,可以是一个数值,也可以是字符串。

 每个表中可以指定一个或多个字段为主键,表中所有记录的主键的值都不能重复。这种不重复是在插入记录时控制的,即如果向一个表中插入记录时,这个表中已有与插入记录具有相同主键的记录,则插入操作失败。  

1

用create语句可以在数据库中创建表
create table student

2

用drop语句可以从数据库中删除指定的表
drop table student;

3

用insert语句可以向表中插入一条新记录
insert into student values(1, 'Zhang', 'M', 18);


4

用update语句可以可以修改表中的记录
update student set Sex = 'F', Age = 20 where Name = 'Zhang';

5

用select语句可以对数据库进行查询

select ID, Name from student where Sex = 'F'; 



#include <stdio.h>
#include <sqlite3.h>




int main1()
{
sqlite3 * database =NULL;//是一种sqlit3*的这种类型

//打开一个数据库的函数
int ret=sqlite3_open("student.db",&database);
//第一个参数是数据库文件名,后面用db结尾,不用管它是不是
//存在,如果存在直接打开,不存在 的话就直接创建一个名字叫做student
//第二个参数是指针的指针,sqlite3 **,这个类型所以要&
if (ret!=SQLITE_OK)
{
printf("打开数据库失败\n");
return -1;
}
//如果是这个宏表示正常打开SQLITE_OK 
printf("打开数据库成功\n");

//最后一定要关闭数据库
sqlite3_close(database);
    


return 0;

//gcc 数据库.c  -lsqlite这样编译


}
int main2()
{
sqlite3 * database;

// 打开数据库
int ret = sqlite3_open("student.db", &database);
if (ret != SQLITE_OK)
{
printf ("打开数据库失败\n");
return -1;
}

printf ("打开数据库成功\n");
//执行语句操作,就是执行sq1这个语句操作,是一个字符串以\0 结尾


char *errmsg=NULL;

char *sql = "create table  student(ID INTEGER,name TEXT,sex TEXT,age INTEGER,primary  key(ID))";
ret= sqlite3_exec(database,sql,NULL,NULL,&errmsg);

if (ret != SQLITE_OK)
{
printf ("数据库操作失败:%s\n", errmsg);
return -1;
}


//第三个参数是一个回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习)
    //第四个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,通常可以null,
//相当于线程,你上一个回调函数提供的参数
//第四个参数是一个相当于一个字符型指针数组char *errmsg[]={"nandk"."dsfa"};
//char **errmsg两个*用上面指针的指针,用上面这样就可以表示

int id;
char name[20];
char sex[2];
int age;
printf ("请输入ID:\n");
scanf ("%d", &id);//函数名,字符,数组名字都代表首元素的首地址,而整形不是所以&

printf ("请输入用户名:\n");
scanf ("%s", name);

printf ("请输入性别:\n");
scanf ("%s", sex);

printf ("请输入年龄:\n");
scanf ("%d", &age);



char buf[100];

//sprintf函数打印到字符串中,而printf函数打印输出到屏幕上
//有两个固定参数,后面可以随意加参数,现在在其打印在buf,并且在buf里执行了插入语句
sprintf (buf, "insert into student values(%2d, '%s', '%s', %4d)\n", id, name, sex, age);
ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf ("数据库操作失败:%s\n", errmsg);
return -1;
}
//buffer是字符数组名;format是格式化字符串


// 关闭数据库
sqlite3_close(database);
return 0;
}


//回调函数必须定义成这个类型,
int msg(void* v, int num, char** value, char** name)
{
int i;
for (i = 0; i < num; i++)
{
printf ("%s : %-10s", name[i], value[i]);//就是与前一个name:相差8个格子
}

printf ("\n");

return 0;  // 函数内部一定要返回一个0


}
// 1、exec传过来的参数
// 2、代表查询的列数
// 3、char** value  代表一条记录的值 char *value[] = {"1", "zhang1", "M", "12"};
// 4、char** name   代表每一列的字段 char *name[]  = {"id", "name", "sex", "age"};
//5char** value, char** name是字符指针数组,等价于上面的两个
// 每查到一条记录,该函数被调用一次






int main3()
{

sqlite3 * database;

// 打开数据库
int ret = sqlite3_open("student.db", &database);
if (ret != SQLITE_OK)
{
printf ("打开数据库失败\n");
return -1;
}

printf ("打开数据库成功\n");



    char *errmsg=NULL;
//int v;
  
    //char *sq1="select *from student where name='lvdepeng'";
char *sq1="select *from student ";
    ret=sqlite3_exec(database,sq1,msg,NULL,&errmsg);


//第三个参数是一个回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习)
    //第四个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,通常可以null,
//相当于线程,你上一个回调函数提供的参数
//第四个参数是一个相当于一个字符型指针数组char *errmsg[]={"nandk"."dsfa"};
//char **errmsg两个*用上面指针的指针,用上面这样就可以表示

     if (ret != SQLITE_OK)
{
printf ("数据库操作失败:%s\n", errmsg);
return -1;
}


// 关闭数据库
sqlite3_close(database);
return 0;
}




int main ()
{
sqlite3 * database;

// 打开数据库
int ret = sqlite3_open("student.db", &database);
if (ret != SQLITE_OK)
{
printf ("打开数据库失败\n");
return -1;
}

printf("打开数据库成功\n");

// 3、char ***resultp: char *resultp[] = {"id", "name", "sex", "age", "1", "zhang", "M", "12","2".....};
// 4、nrow: 多少行数据
// 5、ncolumn: 多少列数据
//一维字符字符串指针数组,是一个指针的指针的指针,是一个*是指向字段,另一个*指向字段下面的数值

char **resultp=NULL;
int nrow,ncolumn;

char *errmsg=NULL;
char *sql = "select * from student";
ret= sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg );


//是执行这个sq1语句之后才执行那个语句;
int i;
printf ("nrow = %d, ncolumn = %d\n", nrow, ncolumn);
//这里的行数是不加字段,就是原来的数据库的数据
for (i = 0; i < (nrow+1)*ncolumn; i++)
{

//所以要对后面全部打印出来,必须对nrow+1,因为字段是一行
if (i % ncolumn == 0)
printf ("\n");
//n列数后面换行

printf ("%-8s", resultp[i]);
}
printf ("\n");

//关闭掉的这个函数
sqlite3_free_table(resultp);
// 关闭数据库
sqlite3_close(database);



//第一个参数跟前面的一样,数据库 的类型,第二个参数就是执行的语句是一个很普通的以/0结尾的char *字符串。

//是查询结果,char ***resultp,它依然一维数组(
//不要以为是二维数组,更不要以为是三维数组)。它内存布局是:
//第一行是字段名称,后面是紧接着是每个字段的值
}


//下面像一个终端,回调函数,打印一次回调一次,


int msg1(void* v, int num, char** value, char** name)
{
int i;
for (i = 0; i < num; i++)
{
printf ("%s : %-8s", name[i], value[i]);
}

printf ("\n");

return 0;  // 函数内部一定要返回一个0
}




int main5(int argc, char *argv[])
{
sqlite3 * database;

// 打开数据库
int ret = sqlite3_open("student.db", &database);
if (ret != SQLITE_OK)
{
printf ("打开数据库失败\n");
return -1;
}

//模仿数据库的类型

printf ("SQLite version 3.7.17 2013-05-20 00:56:22\n");
printf ("Enter \".help\" for instructions\n");
printf ("Enter SQL statements terminated with a\n");
char buf[1024];
while (1)
{
printf ("sqlite> ");
fgets(buf, 1024, stdin);

char *errmsg = NULL;
ret = sqlite3_exec(database, buf, msg1, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf ("数据库操作失败:%s\n", errmsg);
//return -1;操作失败并不退出
}
}


// 关闭数据库
sqlite3_close(database);
return 0;
}