读取数据表是为批量读取数据库而设计的功能,可以自定义数据结构,然后直接把数据读取到相应结构内存中,无需使用ADO等对象。
通常我们使用ADO对象来读写数据,由于记录集对象结构过于复杂,每行每列的类型、名称、序号、长度、缓冲区指针和长度,以及各种属性、方法等。
可是实际应用中,往往需要把记录集中的数据,再次读取到自己定义的变量(结构内存)中,所以我增加了直接读取数据到指定结构的功能。
只要需要的字段数据读取出来,还可以直接改变数据类型。例如数据库中字段类型为整数,程序需要把整数类型数据全部转换成小数类型。
同样的数值15,整数和单精度小数都占四字节,但是它们的数据却大不相同。程序定义为小数,数据库里是整数,就可以全部提取为小数数据
读取后的数据表读写方法为:表名(行号).字段名。如:lv=玩家表(0).等级;玩家表(3).职业=5; 表名.rows为行数 表名.cols为列数
读取数据是按查询的sql语句里的表名和字段顺序,并不是按照程序里的表名和字段名,所以程序代码里的表名和字段名是完全自定义的。
数据表结构类型,跟自定义类型(type)的性质类似,类型是不支持数组的,所以可以用数据表代替类型,当自定义数组类型使用。
长(表名)获取的是类型结构或者说每一行的数据长度,表名.len是申请的数组长度,使用前需要 重置 表名(数量)。
申请的长度数量要大于或等于查询表的记录数,读取完数据之后,得到 表名.rows 数据表的实际读取记录数。
数据表的序号是从0开始的,100行记录就是按序号0-99获取。读取的数据存放是一段连续的内存,行列是连续整齐排列的。
数据表结构的名称定义和数据库(对象)的字段定义对比:
英文语法 | 中文语法 | 字段类型 | 数值范围 |
char | 字符 | TinyInt | -128~127 |
byte | 字节 | TinyInt | 数据同上,转为正数 |
short | 整形 | SmallInt | -32768到32767 |
int | 整数 | Int | -2147483648到2147483647 |
single | 小数 | Real | 参见数据类型 |
double | 浮点 | Float | 参见数据类型 |
string | 文本 | VarChar | [16]需指定长度 |
date | 日期 | DateTime | 64位整数 |
long | 大数 | BigInt | 64位整数 |
binary | 二进制 | Binary | [1640]需指定长度 |
由于数据库中没有字节类型,把TinyInt读入字节类型时,负数会变成加256的正数
中文名 | 英文名 | 变量类型 | 功能作用 |
.指针 | .Ptr | 数组 | 数据缓冲区的指针 |
.长度 | .len | 数组/子类 | 数组成员的数量/文本变量缓冲区大小/子类空间的长度 |
.维数 | .dim | 数组 | 第一维数组的长度 |
.类 | 对象 | 对象数据的类关联标识CLSID,或称接口 | |
.标识 | 对象 | 对象数据的IID标识 | |
.指针 | .Ptr | 数据表 | 数据缓冲区的指针 |
.长度 | .len | 数据表 | 初始化可存储行数 |
.行数 | .rows | 数据表 | 已读取数据的行数 |
.列数 | .cols | 数据表 | 每行数据的列数 |
读取表 | query | 数据表 | 读取数据到数组缓冲区 |
加数组 | addin | 数据表 | 把某列数据加到一维数组 |
数组,数据表和结构体都属于全局变量,数组可以是静态和动态两种
静态数组例如: 整数 一(10);字节 二(5);动态数组括号内为空,例如 整形()
结构体类型只支持是静态数组,静态数组不支持重置,保留和销毁
数据表只支持动态数组,申请的数据是清零的,支持重置,保留和销毁
子类需要通过"新建"申请内存才能使用,数据不清零,只支持销毁
子类和对象支持全局变量和局部变量,实体是一个整数指针变量
子类代码需要单独一个模块文件来书写,格式为:子类 名称{
整数 变量名;小数 数值;子类的变量类型支持如下几种:
英文语法 | 中文语法 | 数值范围 |
Bool | 布尔 | 真(True),假(False) |
char,sbyte | 字符 | -128~127 |
byte,uchar | 字节 | 0到256 |
short | 整形 | -32768到32767 |
word | 短数 | -32768到32767 |
ushort | 正数 | 0到65535 |
int,uint,dword | 整数 | -2147483648到2147483647 |
single | 小数 | 负数-3.402823E38到-1.401298E-45;正数1.401298E-45到3.402823E38 |
Double | 浮点 | 负数时-1.79769313486232E308到-4.94065645841247E-324; 正数4.94065645841247E-324到1.79769313486232E308 |
long,ulong | 大数 | 64位整数,32位编程下多用于存储或时间计算。 |
string | 文本 | [16]需指定长度,可代替二进制数据 |
子类变量均可以使用数组,下标长度必须是数字,不支持动态数组
书写子类变量时不能赋值,未新建子类时变量的数据并不存在
子类如果不包含变量,是不需要新建,不用申请内存空间
子类里面包括程序段,可以直接使用子类内部的变量
子类书写完之后,以大括号}结尾,跟命名子类后的{对应
使用子类时先要新建子类,才可以使用其变量和方法函数
子类名 名称1 = 新建 子类名; 整数 名称2=新建 子类名
也可以用赋值指向已存在的子类: 子类名 名称3=名称1;
子类变量用法:整数 数一=名称1.变量名;名称1.变量名=88;
传递参数时也可以使用子类:程序段 测试(子类名 名称3)
名称3.变量=99;变量9=名称3.读取(数据,4);名称3.写入(内容)
销毁子类方法是:销毁 名称2;子类名和子类实体要区分清楚
关于全局变量和局部变量
在小程序段内申请的变量包括提交的参数都是局部变量。
在子类或者数据表头内申请的变量属性子类变量。
在其它地方(小程序和子类外)申请的变量是全局变量。
全局变量包括字符、字节、整形、正整形、整数、正整数、小数、浮点、大数和自定义类型。
局部变量目前只有整数、小数和文本这三种。任何变量在作为参数传递的时候,均为4字节数字。
所以大于4字节的类型比如文本、浮点和自定义类型,提交的是变量的地址,而不是值。否则是按值传递。
因此小程序的参数通常只有整数和小数这两种,文本提交过来也是一个整数地址。
小数是提交参数要直接进行小数运算时,才需要特别指定。除此之外、任何提交的参数都可以写成整数类型。
子类本身并没有特别定义,它可以是全局的整数变量,也可以是局部整数,也可以是整数数组。
全局变量是编译程序时,提前在数据区段申请的。局部变量仅在小程序段内有效,属于临时存储空间。
子类和数据表的变量,是在程序运行之后,去动态申请的内存区块。子类使用前需要使用 新建 子类名称
数据表相当于自定义二维数组,使用前需要先“重置”数组的长度,该长度不能小于所读取数据的行数。
数据表可以使用数组的重置、保留和销毁方法,而子类只可以使用新建和销毁这两个方法。
子类和数据表的区别:
子类申请的内存区域并不是清零的,所以在新建的时候,可以用:玩家=新建 角色类(等级=1,职业=2,性别=1);
去设置子类变量的数值,未清零的内存数据是随机的,也就是说子类变量在新建子类时数值是不确定的。)
而数据表在重置长度后,内存区域是清零的,所有变量此时值都是0,数据表也可以用作自定义数组。
成员变量使用方法是:玩家表(0).性别,括号内是行号也就是数组的标号,是从0开始计数的。
子类变量的使用方法是:玩家.性别。如果申请的子类变量是数组形式,如:角色类 玩家()
也可以像数组一样,先 重置 玩家(1000),玩家(0)=新建 角色类; 玩家(0).性别=1;
但是销毁只能是先销毁一个成员,销毁 玩家(0)。或者 N=玩家(0);销毁 N;
子类变量在子类内部可以不加前缀直接访问,如:等级=100;职业=3;xb=性别等等。
全局变量、子类变量的名称是绝对不能重复的,重名就会优先判定为全局变量。
局部变量的申请和使用:
局部变量除文本外都是4字节,文本可以大于4字节,必须是4的整数倍。
局部变量最多可以申请空间1-2M,不使用局部变量则不申请,少量使用时(限120字节)
局部整数和小数变量30个以内,文本按申请的长度算。需要更多变量时,变量前加局部或local
并且放在小程序开头第一行,编译时候才好预计此小程序段需要申请多大的堆栈空间。如:局部 文本 ss(32);
局部变量与全局变量区别是很大的,编程语法上尽量做到能兼容使用,方便程序灵活处理。
局部文本和全局文本都可以像操作数组一样,读写其中每一字节。如:文本 s(16)="abc";s(2)=\d;
也可以像其它变量一样,写入数字。如:s=0;文本就被清空,s=$31323334;文本开头就等于4321
因为十六进制是反转的,最后的34写入字符的第一字节,对应文字是4,用s(1)读取出来就是52