ASP编程:悠哉悠哉,一个复合查询办法
优点:简单易学、开发速度快、有很多年“历史”,能找到非常多别人做好的程序来用、配合activeX功能强大,很多php做不到的asp+activeX能做到,例如银行安全控件几近每一个完全的使用程序城市必要一个复合查询。创建一个功效壮大的复合查询起首必需要可以静态天生查询前提,其次应当可以对查询到的数据举行修正,最初这个复合查询最好可以对一对多的两个表创建前提举行查询。在VFP里创建查询的办法次要有这么几种:一是利用VFP中自带的SearchClass类;二是创建一个查询;三是创建一个视图,个中包含参数化视图、宏交换Sql语句视图;四是创建一个Grid,将其数据源设置为SQL语句或一时表。
不论哪种办法,实在质都是利用SQL语句。
这几种办法各有各的长处,也都出缺点。
创建查询的办法最古板,只能创建流动前提的查询,而且不克不及更新数据,最不克不及满意请求。
SearchClass类功效壮大,可是它只能对一个表创建前提举行查询,而且它的源代码太庞大了,几近难以举行修正定制;(初学者想必都有过用表单导游创建表单后试图修正txtbtn类、SearchClass类的履历吧!看到源代码后有几个没昏迷?)用将Grid的数据源设置为SQL语句或一时表的办法没法修正/更新数据,革新数据也对照坚苦。(这方面的成绩在网易假造社区VFP版上有过很多会商,人人能够往看看。)创建视图的办法中,参数化视图也太复杂。不论是用表单控件的值作参数仍是用给参数两头加上引号的办法都只能对流动的字段举行查询。假如是复合查询,岂非要先创建几十个视图吗?最有出路的举措仍是用宏交换SQL语句创建视图的举措。视图有着可以对数据举行修正/更新的长处,假如可以静态天生查询前提,那末就是最完善的查询了。创建宏交换sql语句视图的详细举措是先静态天生一个Sql语句sqlstatement,然后用宏交换的办法利用CreateSqlviewviewnameas&sqlstatement来静态创建视图,最初将数据静态显现在一个Grid控件中。看到这里,VFP年夜虾们怕会大呼:Stop!你当我是菜鸟啊!你的举措从实际上固然行的通,但实践做起来就会碰着查询了局在表格上数据没法革新的困难。俺早就试过不可了!你想骗稿费啊!嘿嘿,这个困难恰恰给我办理了!这就是我意气扬扬的写这篇文章的缘故原由!成绩的办理
几个月前(好不幸^0^.....),我参照VFP的Sample中的Solution里的InteractivelyBulidasql
statement示例创建了一个复合查询,想将它集成到我本人的程序中。因为该示例是用browse窗口来显现查询了局的,而我本人的使用程序利用了顶层表单,了局编译后运转才发明Browse窗口在顶层表单中没法显现。因而我创建了一个有两个表单的表单集,用一个表单makesql静态天生sql语句,在另外一个表单form1上用grid来显现查询了局的数据,在给Grid设置数据源的时分,成绩来了。起首利用一时表来作为表格的数据源,了局第一次查询准确,变动前提举行第二次查询时碰着了尽人皆知的"不克不及更新一时表"的毛病;利用sql语句却是能够,但是在表格显现数据前会稀里糊涂的先呈现一个Browse窗口,必需封闭它后才会显现表格,因为browse窗口在利用顶层表单的程序中没法显现,了局招致程序没法持续实行,这个举措也不可。
最初只能利用Createsqlviewviewnameas&sqlstatement的举措了,先任意创建一个视图tempview,把表格的Recordsourcetype属性设置为1-别号,Recordsource属性设置为视图别号tempview,
在表单makesql上创建sql语句后的代码中利用createsqlviewtempviewas&sqlstatement创建视图Tempview.
实行后发明,第一次查询准确,变动查询前提后再次查询,呈现"视图已存在,要改写吗?"的情形,按下"断定"后,呈现的表格中没无数据。
制止呈现对话框的成绩好办理,在创建视图前先用renameviewtempviewtooldview,然后用Deleteviewoldview将旧的视图删除就能够了。代码以下:
setdatabasetodatabasename&&databasename是你的数据库称号
&&注重:即便你翻开了数据库也必需写这个语句!不然会呈现"找不到数据库"的毛病。
ifused("tempview")
renameviewtempviewtooldview
deleteviewoldview
endif
Createsqlviewtempviewas&sqlstatement
=requery()
IF_TALLY=0
#DEFINEMSG_LOC"没有找到切合前提的记录!"
#DEFINETITLE_LOC"没有找到记录"
=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)
ELSE
thisform.hide
thisformset.form1.show
Endif
*****************************************************************************
可是如许做了今后,表格上没无数据的成绩仍旧存在。查找材料后发明,用Createsqlview语句编
程创建视图的办法,创建视图后要先保留视图界说,再翻开视图后视图中才无数据。因而,必需将Creat
sqlview语句部分代码修正以下:
************************************************
Createsqlviewtempviewas&sqlstatement
use
usetempview
************************************************
满觉得这下成绩办理了,了局更惨。呈现的表格上不仅没无数据,连表头、网格都不见了!这个成绩
百思不得其解,查找材料也没有了局,最初不了了之,一向困扰了我几个月。
就在昨晚,我上床的时分俄然灵光一现:既然表格没法静态加载数据源视图,那末爽性连包括表格的
表单也静态天生!只需表单静态天生,那末表单上的表格工具的数据源不就完整从头加载了吗?也用不着革新甚么的了!并且,用这个办法也用不着先创建一个tempview视图,完整在程序中静态天生就能够了主张必定,即刻下床下手。将本来包括表格的表单form1删除,在上述的代码中最初一句
thisformset.form1.show前拔出以下代码:
*************************************************************
thisformset.addobject("form1","form")
withthisformset.form1
.caption="查询了局"
.width=600
.height=400
.Autocenter=.t.
.controlbox=.f.
endwith
thisformset.form1.addobject("cmdReturn1","cmdReturn")
withthisformset.form1.cmdReturn1
.top=360
.left=270
endwith
thisformset.form1.addobject("grid1","gird")
withthisformset.form1.grid1
.Recordsourcetype=1
.Recordsource="tempview"
.top=10
.left=20
.height=300
.width=560
endwith
**************************************************************
在程序的最初到场:
*********************************************
DefineclasscmdReturnascommandbutton
caption="前往"
procdureclick
thisform.release
endproc
enddefine
*********************************************
这下总能够了吧?运转程序,了局呈现对话框"在事务或办法中不克不及嵌套类界说!"。我@#$%&*....甚么嘛!教科书、匡助文件中的示例prg都是这么写的啊!
不外幸亏另有举措,我手工创建一个类总行了吧!在类库mybut中新建一个按钮类cmdReturn,设置它的cation属性为"前往",click事务代码为
thisform.release。在下面的代码前拔出setClasslibtomybutadditive(注重:假如不加additive参数,将封闭一切之前翻开的类库!),然后将最初的类界说语句Define...EndDefine全体删除。运转,新表单呈现!且慢,这个表单上怎样甚么器材都没有?:-((翻开调试器,在"部分"窗口中观察,发明明显有cmdReturn1、Grid1工具啊!怎样回事?细心观察他们的每一个属性,发明本来它们的visible属性都为false!本来,我们寻常看到的匡助中的示例都是prg文件,在这些文件顶用addobject()办法向表单增加的工具在显现表单后都是可见的。而在表单的scx文件中利用addobject()办法创建的任何器材,其visible属性都为false!实质上,用createobject()、addobject()办法创建的工具,实在只是在内存中创建了一个工具变量,必需再用语句使它们实例化。好比,我们经常使用的mainform.show语句就是云云,没有利用show办法,mainform就只是内存中的一个变量,而不是一个表单不成见的实例!反之,thisform.release语句则从基本
上开释了表单上一切的工具变量,从而在内存中完整扫除了表单.而在prg文件中与scx文件顶用addobject()办法创建表单和控件的按次是纷歧样的,在prg文件中是先向表单增加控件再显现表单,表单上的控件承继了表单的visible属性,当表单实例化时控件也实例化;而在scx文件利用addobject()办法是先显现表单,然后再向表单增加控件的,因而必需手工设置控件的visible属性为Ture。
固然如许对照贫苦,爽性在mybut类库中手工创建一个Resultform表单类,在该表单类上增加一个命令按钮cmdReturn和一个Grid1,设置命令按钮cmdReturn的caption属性为"前往",Click事务代码为thisform.release,设置Grid1的RecordSourceType属性为1-别号,RecordSource属性为Tempview,如许就
不必在代码中手工输出thisformset.form1.cmdReturn1.visible=.t.语句,费事多了。
终极的程序代码以下:
*******************************************************
setdatabasetodatabasename
ifused("tempview")
renameviewtempviewtooldview
deleteviewoldview
endif
Createsqlviewtempviewas&sqlstatement
=requery()
IF_TALLY=0
#DEFINEMSG_LOC"没有找到切合前提的记录!"
#DEFINETITLE_LOC"没有找到记录"
=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)
ELSE
setClasslibtomybutadditive
thisformset.addobject("form1","Resultform")
thisform.hide
thisformset.form1.show
Endif
********************************************************
运转程序,统统ok!终究完成了静态天生查询前提,静态显现了局。只需再用dbsetprop()语句设置视图为可更新,就可以对查询了局举行修正/更新了!这是我见到过的最完善的复合查询了!就这么复杂?没错,就这么复杂!一个困扰数月的成绩,研讨的时分峰回路转,终极了局倒是云云轻松!这就是编程的艺术吧!
这个成绩的办理,固然走了很多弯路,可是也让我们懂得了很多VFP的道理,岂非不是很值得吗?!光凭书籍的常识,你永久也没法懂得这些器材的。有人说:读三年的书,还不如写一个月的程序,不是吗?!其他:
我在本文中省略了开首的静态天生sql语句的部分,详细的做法人人能够研讨一下VFP自带的示例使用程序solution中databases目次下的view/queries目次中的InteractivelyBulidasqlstatement示例,你乃至能够稍作修正就在你本人的程序中利用该表单。
我已经就其道理写了一篇文章《交互式创建sql复合查询-vfp示例使用程序详解》贴在网易假造社区VFP版,有乐趣的伴侣能够在精髓区查到,读完该篇文章,你应当能够自行修正该程序使之可以对一对多半据库举行查询了。由于该文篇幅很长,又对照单调,就不在这儿讲授了。
要注重的是:原示例程序用于天生sql语句查询。要改成用于创建sql视图,必需作一些修正:1、在sql查询中不用限制表别号和数据库名,而创建sql视图却必需如许做。因而必要修正makesql表单的自界说办法bldsql的代码,将源代码上面的部分:
**************************************************************************
IF!EMPTY(lcOperand)
lcValue2=THISFORM.ValidateType(THIS.cboField2.Value,lcValue2)
lcWHERE=lcOperand+""+lcField2+""+;
lcRelation2+""+lcValue2
ENDIF
**CreatethefirstpartoftheWHEREcondition
lcWHERE="WHERE"+lcField1+""+lcRelation1+""+lcValue1+""+lcWHERE
**CreatethefullSQLcommandusingthebasetablefortheform
lcSQL="SELECT*FROM"+lcAlias+""+lcWHERE
****************************************************************************
修正为:
****************************************************************************
If!empty(lcOperand)
lcValue2=thisform.ValidateType(this.cboField2.value,lcValue2)
lcWhere=lcOperand+""+lcAlias+"."+lcField2+""+;
lcRelation2+""+lcValue2
Endif
lcWhere="Where"+lcAlias+"."+lcField1+lcRelation1+"";
+lcValue1+""+lcWhere
lcSql="Select*From"+"DatabaseName!"+lcAlias+""+lcWhere
****************************************************************************
DatabaseName是你的数据库的名字。以上修正的本色是,给要查询的字段名限制其地点的表别号,给
selectform的表别号限制所属的数据库。
2、修正RunSql命令按钮的Click事务代码,将原代码:
*************************************************************************
cMacro=ALLTRIM(THISFORM.edtSQL.Value)+"INTOCURSORTEMPQUERY"
*************************************************************************
中的(+"INTOCURSORTEMPQUERY")部分删除,将cMacro改成sqlstatement.并将除上面部格外的全
部代码删除:
*************************
IFUSED(lcOldAlias)
SELECT(lcOldAlias)
ENDIF
*************************
,拔出下面的终极代码就能够了。
ok!如今一切的义务都完成了。做完一切的这统统,花不了非常钟,你就创建了一个壮大的复合查询!
缺点:安全性不是太差了,还行,只要你充分利用系统自带的工具;唯一缺点就是执行效率慢,如何进行网站优化以后,效果会比较好。 那么,ASP.Net有哪些改进呢? 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。 从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了 封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。 我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。
页:
[1]