http://www.waynedeng.com/blog/showlog.asp?cat_id=25&log_id=500
CF中对数据的操作都是通过CFQuery来进行的,纯粹从便利的角度上来讲远远比不上asp中的recordset object。不过在coldfusion MX里面也有对象了嘛,我们也来自己封装一个简单的recordset Component!
下面是应用示例,熟悉recordset object的不用多说也明白吧?操作起来确实方便。
以下是代码: <cfscript> rs=createObject("component","CFNews.model.db.recordset"); rs.getByTable("article","article_source"); //打开recordsource为article_source中名为article的table writeoutput(rs.getField("title") & "<br>"); rs.MoveNext(); writeoutput(rs.getField("title") & "<br>"); rs.MoveLast(); writeoutput(rs.getField("title") & "<br>"); //添加一个新的记录 rs.addNew(); rs.setField("title","insert test"); rs.setField("content","This is a test"); rs.setField("artileID",8); rs.setField("img","<img src='aa'>"); rs.update(); //修改第2个记录 rs.rownum=2; rs.setField("title","update test"); rs.update(); </cfscript> |
下面是recordset.cfc
CFNews.model.db.RecordSet Component RecordSet (Recordset class)
hierarchy: | WEB-INF.cftags.component CFNews.model.db.RecordSet
| path: | C:/Inetpub/wwwroot/CFNews/model/db/RecordSet.cfc | properties: | | methods: | addNew, delete, edit, getBySQL, getByTable, getField, moveFirst, moveLast, moveNext, movePrev, setField, update | * - private method
addNew |
---|
public addNew ( )
Output: supressed
| delete |
---|
public delete ( )
Output: supressed
| edit |
---|
public edit ( )
Output: supressed
| getBySQL |
---|
public getBySQL ( required string sql, required string recordSource )
get a Query object by a sql sentence
Output: supressed Parameters: sql: string, required, sql recordSource: string, required, recordSource
| getByTable |
---|
public getByTable ( required string tableName, required string recordSource )
get a Query object by a table name
Output: supressed Parameters: tableName: string, required, tableName recordSource: string, required, recordSource
| getField |
---|
public getField ( required string fieldName )
get field value by field name
Output: supressed Parameters: fieldName: string, required, fieldName
| moveFirst |
---|
public moveFirst ( )
Output: supressed
| moveLast |
---|
public moveLast ( )
Output: supressed
| moveNext |
---|
public moveNext ( )
Output: supressed
| movePrev |
---|
public movePrev ( )
Output: supressed
| setField |
---|
public setField ( required string fieldName, required string value, string fieldType )
Output: supressed Parameters: fieldName: string, required, fieldName value: string, required, value fieldType: string, optional, fieldType
| update |
---|
public update ( string IDName )
Output: supressed Parameters: IDName: string, optional, IDName
|
|
以下是代码: <cfcomponent displayname="Recordset class"> <cfset this.fields=structNew()> <cfset this.tableName=""> <cfset this.recordSource=""> <cffunction name="getByTable" access="public" output="false" hint="get a Query object by a table name"> <cfargument name="tableName" type="string" required="yes"> <cfargument name="recordSource" type="string" required="yes"> <cfset this.tableName=arguments.tableName> <cfset this.recordSource=arguments.recordSource> <cfquery datasource="#this.recordSource#" name="recordSetSelect"> select * from #this.tableName# </cfquery> <cfset this.recordSet=recordSetSelect> <cfset this.mode="select"> <cfset this.rownum=1> </cffunction> <cffunction name="getBySQL" access="public" output="false" hint="get a Query object by a sql sentence"> <cfargument name="sql" type="string" required="yes"> <cfargument name="recordSource" type="string" required="yes"> <cfset this.sql=arguments.sql> <cfset this.recordSource=arguments.recordSource> <cfquery datasource="#this.recordSource#" name="recordSetSelect"> #PreserveSingleQuotes(this.sql)# </cfquery> <cfset this.recordSet=recordSetSelect> <cfset this.mode="select"> <cfset this.rownum=1> </cffunction> <cffunction name="getField" access="public" output="false" hint="get field value by field name"> <cfargument name="fieldName" type="string" required="yes"> <cfset value=evaluate("this.recordSet.#arguments.fieldName#[#this.rownum#]")> <cfreturn value> </cffunction> <cffunction name="setField" access="public" output="false"> <cfargument name="fieldName" type="string" required="yes"> <cfargument name="value" type="string" required="yes"> <cfargument name="fieldType" type="string" required="no"> <cfif not isdefined("this.fields.#arguments.fieldName#")><cfset tmp=Evaluate("this.fields.#arguments.fieldName#=structNew()")></cfif> <cfscript>StructInsert(Evaluate("this.fields.#arguments.fieldName#"),"value",arguments.value,"yes");</cfscript> <cfif not isdefined("arguments.fieldType")> <cfif isDate(arguments.value)> <cfset tmp=Evaluate("this.fields.#arguments.fieldName#.fieldType='date'")> <cfelseif isNumeric(arguments.value)> <cfset tmp=Evaluate("this.fields.#arguments.fieldName#.fieldType='numeric'")> <cfelse> <cfset tmp=Evaluate("this.fields.#arguments.fieldName#.fieldType='varchar'")> </cfif> <cfelse> <cfset tmp=Evaluate("this.fields.#arguments.fieldName#.fieldType='#arguments.fieldType#'")> </cfif> </cffunction> <cffunction name="moveFirst" access="public" output="false"> <cfset this.rownum=1> </cffunction> <cffunction name="moveLast" access="public" output="false"> <cfset this.rownum=this.recordSet.recordcount> </cffunction> <cffunction name="moveNext" access="public" output="false"> <cfset this.rownum=this.rownum+1> <cfif this.rownum gt this.recordSet.recordcount><cfset this.rownum=this.recordSet.recordcount></cfif> </cffunction> <cffunction name="movePrev" access="public" output="false"> <cfset this.rownum=this.rownum-1> <cfif this.rownum lt 1><cfset this.rownum=1></cfif> </cffunction> <cffunction name="addNew" access="public" output="false"> <cfset this.mode="addnew"> </cffunction> <cffunction name="edit" access="public" output="false"> <cfset this.mode="edit"> </cffunction> <cffunction name="delete" access="public" output="false"> <cfif not isdefined("arguments.IDName")><cfset arguments.IDName=ListContainsNoCase(this.recordSet.ColumnList,"id",",")></cfif> <cfif arguments.IDName eq ""><cfset arguments.IDName=ListFirst(this.recordSet.ColumnList,",")></cfif> <cfquery datasource="#this.recordSource#" name="recordSetDelete"> delete from #this.tableName# where <cfset fv=evaluate("this.recordSet.#arguments.IDName#[#this.rownum#]")> <cfif isNumeric(fv)> #arguments.IDName#=<cfqueryparam cfsqltype="cf_sql_numeric" value="#fv#"> <cfelse> #arguments.IDName#=<cfqueryparam cfsqltype="cf_sql_varchar" value="#fv#"> </cfif> </cfquery> </cffunction> <cffunction name="update" access="public" output="false"> <cfargument name="IDName" type="string" required="no"> <cfset fieldsList=StructKeyList(this.fields,",")> <cfset i=1> <cfif this.mode eq "addnew"> <cfquery datasource="#this.recordSource#" name="recordSetInsert"> insert into #this.tableName# (#fieldsList#) values( <cfloop index="f" list="#fieldsList#" delimiters=","> <cfset fv=evaluate("this.fields.#f#.value")><cfset ftype=evaluate("this.fields.#f#.fieldType")> <cfif i eq 1><cfset comma=""><cfelse><cfset comma=","></cfif><cfset i=2> #comma#<cfqueryparam cfsqltype="cf_sql_#ftype#" value="#fv#"> </cfloop>) </cfquery> <cfelseif this.mode eq "edit"> <cfif not isdefined("arguments.IDName")><cfset arguments.IDName=ListContainsNoCase(this.recordSet.ColumnList,"id",",")></cfif> <cfif arguments.IDName eq ""><cfset arguments.IDName=ListFirst(this.recordSet.ColumnList,",")></cfif> <cfquery datasource="#this.recordSource#" name="recordSetUpdate"> update #this.tableName# set <cfloop index="f" list="#fieldsList#" delimiters=","> <cfset fv=evaluate("this.fields.#f#.value")><cfset ftype=evaluate("this.fields.#f#.fieldType")> <cfif i eq 1><cfset comma=""><cfelse><cfset comma=","></cfif><cfset i=2> #comma##f#=<cfqueryparam cfsqltype="cf_sql_#ftype#" value="#fv#"> </cfloop> where <cfset fv=evaluate("this.recordSet.#arguments.IDName#[#this.rownum#]")> <cfif isNumeric(fv)> #arguments.IDName#=<cfqueryparam cfsqltype="cf_sql_numeric" value="#fv#"> <cfelse> #arguments.IDName#=<cfqueryparam cfsqltype="cf_sql_varchar" value="#fv#"> </cfif> </cfquery> </cfif> </cffunction> </cfcomponent> |