CF8中如何将含未定义元素的结构体数据插入数据库?
解决ColdFusion 8中结构体未定义元素插入NULL到数据库的问题
报错原因
直接访问结构体中不存在的COMMENTS元素时,ColdFusion 8会抛出「Element COMMENTS is undefined in OBJECT」错误——CF8不允许直接引用结构体里未定义的key,不管后续想处理成NULL还是空值,这一步都会先触发异常。
解决方案
核心是先判断元素是否存在,再结合元素值是否为空来决定是否插入NULL。同时修正原SQL中的语法错误:
- 用
StructKeyExists()函数判断结构体中是否存在目标key - 对存在的元素做空值校验,不存在或为空的情况都设为NULL
- 修正拼写错误(
VAULES→VALUES),去掉字段/值列表末尾的多余逗号 - 注意
DESC是SQL关键字,作为字段名时需用方括号(SQL Server)或反引号(MySQL)包裹
修改后的代码示例
方式一:直接在<cfqueryparam>中处理
<cfquery> INSERT INTO AUDIT ( COMMENTS, [DESC] ) VALUES ( <cfqueryparam cfsqltype="cf_sql_varchar" value="#IIf(StructKeyExists(object, 'COMMENTS'), object.COMMENTS, '')#" null="#NOT (StructKeyExists(object, 'COMMENTS') AND len(trim(object.COMMENTS)))#">, <cfqueryparam cfsqltype="cf_sql_numeric" value="#object.DESC#" null="#NOT len(trim(object.DESC))#"> ) </cfquery>
方式二:先预处理变量(更易读维护)
<!--- 预处理COMMENTS参数 ---> <cfset commentsValue = "" /> <cfset isCommentsNull = true /> <cfif StructKeyExists(object, "COMMENTS")> <cfset commentsValue = trim(object.COMMENTS) /> <cfset isCommentsNull = (len(commentsValue) eq 0) /> </cfif> <!--- 预处理DESC参数 ---> <cfset descValue = trim(object.DESC) /> <cfset isDescNull = (len(descValue) eq 0) /> <!--- 执行插入 ---> <cfquery> INSERT INTO AUDIT ( COMMENTS, [DESC] ) VALUES ( <cfqueryparam cfsqltype="cf_sql_varchar" value="#commentsValue#" null="#isCommentsNull#">, <cfqueryparam cfsqltype="cf_sql_numeric" value="#descValue#" null="#isDescNull#"> ) </cfquery>
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

