VLISP连接使用数据库并没有那么可怕。 虽然ADO对象模型中包含了好几个对象,但对于数据库的普通操作,我们只需要用到Connection、Recordset、Record、Fields这四个对象,而且以前三个对象为多,而Fields如果不是为了得到字段名的话,也不需要去看。 从结构上来说,Connection为根对象,然后Recordset为子级对象,而Record和Fields为孙级对象。他们之间就是一种上下关系。 Connection代表整个数据库连接,Recordset代表记录集,也就是我们经常说的查询到的数据库表内容,Record代表单个记录,Fields代表查询到的记录集的所有字段。 说明一下,记录是数据表中的一行内容,而字段是数据库中的一列内容。这样大家会比较直观。 就拿上一节的程序来解释一下。 首先我们需要进行初始化,也就是引用ADO控件并让它连接到我们指定的数据库中,在这个步骤中,就是为Connection设置好连接,因为下来的所有工作都是基于它来进行的: (setq dbfile (findfile "mc-sample.mdb")) ;设置数据库名称及路径 (Setq conn(vlax-create-object "ADODB.Connection")) ;引用ADO控件 (setq connstring (strcat "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" dbfile)) ;设置数据库连接字符串 (vlax-invoke-method conn "open" connstring "" "" -1) ;打开数据库连接 所以,如果需要进行数据库的操作,以上四行代码是必不可少的。 网上有些相关的VLISP连接数据库的程序写得太复杂了,我觉得并不需要为数据库连接专门进行注册,因为注册了,最后使用的也就那么几个对象和函数,注册后的代码更加难懂,所以搞得大家都怕了,呵呵。 数据库连接完成后,我们就需要对数据库进行操作了,这种操作包括了数据库查询,数据库更新、添加记录、删除记录等。 上一节我使用的是Execute方法。 其实数据库的操作常用的不外乎两种方法,一种是直接使用Execute方法,另外一种是使用RecordSet.Open方法。对于简单的操作,我们可使用Execute方法,而复杂一些的我们可以用RecordSet.Open方法。这一节我只介绍Execute方法,以后会给大家介绍另外的那个方法。 (setq sql "select [id],[x],[y],[z],[r] from [circle] order by [id]") ;设置查询SQL (setq rs (vlax-invoke-method conn "Execute" sql "" -1)) ;执行数据库查询 在这段程序中,使用的就是Connection.Execute方法,它是否返回结果要看它执行的SQL。所返回的结果就是Recordset对象。也就是说它返回的结果我们可以用处理Recordset的方法来处理。 在Execute方法中,只有参数sql是指定的SQL外,其它的两个参数都不需要修改。 对于这个方法,并不需要进行多的介绍,而需要介绍的就是SQL的使用方法了。因为通过不同的SQL,我们才可以对数据库进行查询、修改、新增、删除等操作。 一.数据库查询: select [字段1],[字段2],[字段3]... from [数据库名] where 字段1=条件1 and 字段2=条件2 order by 字段1 说明: 1.需要返回使用的字段需要显示在Select 和from之间,并用“,”隔开,如果需要返回所有的字段,则可使用“*”代替。用Select Top XX 可设置返回的XX行记录数,象select top 10 则只返回10行,如果不设置,则返回查询到的全部记录。 2.where后面设置的是查询条件,条件可以用and or或()来组合。如where x>5 and y>2指的就是同时需要满足那两个条件。再复杂一些的条件就有in(),like等。如x in (1,2,3)指的就是X必须在括号内的三个值中的任意一个,如username like %mc% 则表示username中必须含有mc字符。 3.order by设置的是数据的排列方式,排列可按字段进行正排或倒排,不同字段间可使用“,”分隔。如果是倒排则在字段后面加一个 desc来设置倒排。 4.为了防止数据表名或字段名与SQL的保留关键字相同,可使用[]把字段名和表名括起来。 例子:select top 10 from [linetable] where [length]>50 order by [length] select * [length],[startpntx],[startpnty],[startpntz],[angle] from [linetable] where [angle] in (0,30,60,90) order by [angle] 消化一下会很简单的。 二.数据库更新: Update [数据表名] Set 字段1=值1, 字段2=值2, ... Where 条件 说明:这就是按照Where 中的条件更新指定的数据表内容,符合条件的记录都会被更新。 如果字段为字符型,则需要将值的前后加上单引号,如'值1','值2','值3',而且需要将值中的单个单引号替换为两个单引号,以防止插入记录时出错。 例子:Update linetable set angle=45 where angle=30 象这个例子就会把数据表linetable中的角度为30的值全部更改为值45 三.数据库添加记录: Insert into [数据表名] (字段1,字段2,字段3,...) values (值1,值2,值3,...) 说明:如果字段为字符型,则需要将值的前后加上单引号,如'值1','值2','值3',而且需要将值中的单个单引号替换为两个单引号,以防止插入记录时出错。 四.删除记录: Delete from [数据表名] where 条件 说明,Where后面的条件与查询的条件语法相同。这样符合条件的数据记录将会被删除。 |