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

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、常用控件简介在数据库开发实践中,有一些功能反复使用,如一些字段的值,常常就那几个,这时,要程序记住这些值可提高用户的工作效率,这类控件有两个TCmbrec和TDBCmbrec,分别继承TCombox和TDBCombox,重载DblClick和DoEnter过程,并加了Filename、Section、Field和Caption属性。其使用方法参见“三、控件的使用”的说明。对于某些数据表来说,字段数很多,打开浏览时,屏幕放不下,需要用横向滚动条来移动查看,为了清楚浏览数据记录,希望在滚动过程中,某些字段不要移动;其二,如果数据表字段很少且比较规范,希望在数据表表格上编辑数据,编辑过程中每个字段都具有上述TDBCmbrec的功能;其三,对于综合查询或在一个画面上一个数据源对应于几个数据显示时,希望能够自动翻译其字段名。这些功能需求可使用TRxDBGrid和Tdbgrdrec控件来实现,都继承于TDBGrid控件,前者实现DBGrid的固定列显示、自动翻译和字段格编辑;后者实现字段格编辑。其中,TRxDBGrid增加了Filename、Section、Field、TranslateFileName、FixedCols等属性,重载DblClick和DoEnter等过程;Tdbgrdrec增加了Filename、Section、Field属性,重载DblClick和DoEnter过程。二、控件安装 上面介绍的控件,写在两个.pas文件中,DBCtrl.pas只包含TRxDBGrid控件;DBAdvanceComponent.pas包括Tcmbrec、TDBCmbrec、Tdbgrdrec等控件。安装步骤为:·第一步,打开Delphi,然后选择“Component”|“Install Components”菜单项;·第二步,在“Install Component”对话框的“Unit file name”栏中,使用“Browse”按钮将控件文件加进来;·第三步,单击“OK”按钮;·第四步,在弹出的“Confirm”对话框中,单击“Yes”按钮,安装该控件文件;·第五步,在“Information”对话框,单击“OK”按钮;·重复第二至第五步,安装所有需要的控件。安装完成后,在控件面板上出现新的标签“DBAdvance”,上面有新安装的控件。之所以不写成包,是为了方便以后扩展和适应Delphi版本的更新。三、控件的使用1.Tcmbrec、TDBCmbrec和Tdbgrdrec控件 增加的保存内容放在当前目录下的“lst”子目录的Ini文件里,文件名为FileName属性的内容,新增属性Section让用户设置Init文件中“[ ]”段名,新增属性Field让用户设置数据表字段名。当然在Tdbgrdrec控件中,Field字段可不设置,控件自动根据当前选取的字段设置。子目录“lst”,控件可自动创建。2.TRxDBGrid控件 (1)FileName,Section,Field属性设置同上“1”; (2)FixedCols属性用来设置固定列数,从第一列到第FixedCols列; (3)TranslateFileName属性用来设置翻译文件名,放在“txt”子目录下,是文本文件,文件格式为:字段英文名@字段中文名。特别说明:TRxDBGrid控件来源于著名的Rxlib2.75相关的控件,本人加了字段自动翻译的功能,该功能在综合查询时特别有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫天飞舞的雪花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值