突发其想想用VB做个能解析SQL的数据库程序。

特留个Q Q:37237015  和有相同爱好的朋友,交流交流。

开发日志

2012/8/2更新
实现了部分SELECT语句的功能如
SELECT * FROM ABC;
如ABC表中有A1,A2,A3这三个字段,将显示这三个字段的数据也可以指定这三个字段中任意字段显示。
以下附上简单的教程
简单教程:
其实现包括(不区分大小写)一定要已";"结尾
CREATE Table 例:
CREATE TABLE ABC(
A1(100),
A2(100),
A3(100)
);
说明A1为字段名,括号中的100为字段长度


SELECT FROM 例:
SELECT * FROM ABC;
显示ABC表中的所有字段,如A1,A2,A3
SELECT A1,A2,A3 FROM ABC;显示ABC表中所选的字段,这里选择了A1,A2,A3


INSERT INTO 例:
INSERT INTO ABC(A1,A2,A3)VALUES(AAA,BBB,CCC);
其中INTO 后面跟的为表名,括号后是表中要添加数据的字段,VALUES后是字段所对应的数据。

2012/8/1:  完成最简单的SELECT语句 附下载

http://www.kuaipan.cn/file/id_43844898763309112.html

2012/7/31:实现了CREATE TABLE 和 INSERT 另附部分代码下载

http://www.kuaipan.cn/file/id_43844898763309109.html

 

程序设计图

 

程序主界面

 

主要有几个问题自己想一想。
一。文件的存储方式
在文件的存储碰到的问题为
1。选择何种存储格式与方式。
众所周知,一般VB写入文件的格式或方式有OUTPUT,Random,binary和FileSystemObject,其中Random和binary都为PUT写入方式,而OUTPUT为Print和write
一个为逗号分隔,一个为TAB符分隔,FileSystemObject与OUTPUT写入文件方式类似,也为字段和字符行写入。
经过我每个方式测试,每个方式写入一百万条记录,每个记录有10个字段,并字段的长短不一随机而定,但不区分类型,都以字符串类型写入。
其中OUTPUT以逗号方式写入和FileSystemObject是最快的速度差不多,用TAB符就要慢点,binary为第二,Random方式是最慢的因为Random方式是定长写入的。
我想基本上数据的写入方式和储存格式,因该就是这样吧,最多格式上应该可以优化和压缩。




二。文件的读取和快速查找内容
这个就比较麻烦了,我仔细的研究了下,比如我要在那个写入一百万条记录的文件里寻找一条记录,其寻找第一条记录和最后条记录的时间是不同的
除Random方式读取文件可指定记录号,其他方式如INPUT,Binary和FileSystemObject都是一行一行读取或是扫描文件,直到找到你要的数据,当然也有牛人把整个文件读入内存,
并用指针的方式,快速查找到,需要的内容。
关于这个我有个最大的问题想问下各位数据库高手,比如说一条记录中我定义了一个主键或是索引字段,我程序启动把这个字段所有数据都读入内存,我用快速查找算法,或是B树算法找到了此值并直到了对应的行号,或是说数据的位置,那我如何快速在文件中找到此行并快速读取出此条记录的所有信息呢,难道只有扫描整个文件从头开始读取,一直读到我要的那行吗,没有办法直接读取指定的那行数据吗?
我知道Random方式读取数据可以指定记录位置读取,可它只能读取定长的数据,我是想问用INPUT,Binary或是FileSystemObject,是否可以快速读取指定行的数据,就像指针快速指到那行数据,并读取整条记录到变量当中,不要再重头开始一行行往下读,直到读到需要数据,这样速度太慢。
我在网上找了很多例子,和也看了些开源数据库他们的源代码。
我现在能想到的也是把整个表读入内存,让程序在内存中查找数据,这样速度可以很快。但问题是这样的话,当文件越大时,对内存的消耗也越大。
网上也有很多这样查找大文件里数据的例子,但我还是希望能直接读到我指定的那行记录数据信息。
请哪位高手达人不吝赐教,能否告知VB中有无快速读取文件中指定行数据的函数。
谢谢
 

三。解析SQL语句的字符串。
1.SELECT语句:
因为SELECT语句一般都是SELECT这五个字母为开头,而且一直到FROM这四个字母前结束,所以只要截取这连个字母当中的字符串就可以了
而且截取到得字符串分两种情况
a1.为一个*字符,就表示表中的所有的字段里的数据都要显示出来。这个不难读取表文件里的所有字段名,并一一读取每个字段里的数据
并显示出来?
a2.为指定的一些字段,这个有点难度,我是这么想的,先还是读取所有的数据,然后根据所选的字段做个二维表,吧所选的数据放入此表中并显示出来。
a3.FROM这个指令为从那个几个表读取数据,我想先实现一个表,再实现关系表等多表读取。
a4.WHERE指令中的语句,这个是最困难的因为其中包含了很多的命令,初期我只想能实现AND,OR,=,>,<等基础的比较指令在此程序中,绝的解析WHERE语句是SELECT语句中最困难的
a5.其他像GOURPBY,ORDER BY,等语句不予实现,并且也不实现COUNT,SUM等函数命令。


2.DELETE语句:
b1.此命令比较复杂,应为文件中并不能实际的删改文件的内容,所以我想了几个方法
1. 做个副表专门用来记录已删除信息的的记录号,读取文件前先到此表中查找下是否已被删除,当然这个方式速度是最慢的,不到万不得已,我想我不会使用此方法的。
2. 用Random的方法,这个因该是最快的,但是这个需要定长表示,比较消耗磁盘空间,并且写入的速度也慢
3. 这是比较常见方法,数据复制法,一行一行的复制数据,复制到要删除的那行跳过,并复制到一个临时文件中,
并且复制完后删除原文件,把临时文件改名成原文件,但这个速度也不快,如文件变大后其复制的速度会很慢。
b2. 以上三个方法各有所长也各有所短,我觉得我将分别使用,并要调试到最好的效果。


3.UPDATE语句:
c1.此和DELETE语句相似也是同样的几个问题。我也分别想出了几个方法来解决此个问题
1. 与DELETE第一条一样做个副表,记录UPDATE的表的信息,如读取到,就直接读取此表中的信息,
但每次修改都需要新建个副表,并删除原副表,所以比较复制,而且速度也不一定很快。
2. 使用Random的方法,也一样更具记录号,修改原来的数据,其问题也是Random记录为定长所以比较耗磁盘空间,但修改速度因该是最快的。
3. 也是数据复制法,一行一行的复制原数据,复制到要修改的那行,把修改的数据复制到副本中,并跳过那行后再复制其余的数据,并删除原文件,把复制的文件改名为原文件。
c2. 以上三个方法与delete的方法相似,所以我觉得也要分别使用,并调教到最好的方式。


4.INSERT语句:
d1. 个人认为这个还是比较好实现的,直接使用append的方式添加数据到文件最后


5.CREATE语句:
e1. 此命令的实现也是非常困难的,个人认为分以下几步,并可能需要界面实现。
1. 解析CREATE语句,因CREATE可创建多个对象,如表,视图,触发器等,所以先要解析到CREATE后面为TABLE的语句,也就是说初期只能实现创建表的CREATE语句
2. 一般一条CREATE中分为,字段名,字段类型和长度,还有字段属性。可能初期我只能解析字段名和长度,并类型都为字符串。
3. 其创建的表因该分为2部分,为表头标题文件和表体实际数据等文件,并因该还有个表的属性文件。