null="#Len(Trim(ARGUMENTS.SourceRef1))#" that will evaluate to null="true" when ARGUMENTS.SourceRef1 IS an empty string. as Leigh said, you should have used null="#NOT Len(Trim(ARGUMENTS.SourceRef1))#"
Azadi Saryev Sabai-dee.com http://www.sabai-dee.com/ On 13/11/2009 01:58, Brett Davis wrote: > Ok in the quest for looking for better ways to write my code I ran into a > small gotcha today that had me banging my head against the wall. Here is the > original code: > > <cftry> > <cfquery name="createField" datasource="#DSN#"> > INSERT INTO t_field( > structure_id, > source_ref_1, > field_fmt_type_id, > last_chg_user_id, > last_chg_dt > > ) > VALUES( > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.StructureID#"/>, > <cfqueryparam cfsqltype="cf_sql_varchar" > value="#ARGUMENTS.SourceRef1#" null="#Len(Trim(ARGUMENTS.SourceRef1))#"/>, > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.FieldFmtTypeID#" > null="#Len(Trim(ARGUMENTS.FieldFmtTypeID))#"/>, > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.LastChangeUserID#"/>, > #CreateODBCDate(Now())# > ); > SELECT SCOPE_IDENTITY() AS newid; > </cfquery> > <cfcatch type="database"> > <cfreturn false/> > </cfcatch> > </cftry> > > I am sure most of you know what I am attempting to do, but for those that > don't I'll explain. Instead of writing a bunch of CFIFs to determine if the > value passed to the query is an empty string and omitting parts of the SQL > query and allowing MSSQL to insert NULLs, I've opted to use the NULL > attribute of the CFQueryparam tag to do that work for me. I've been using > null="#Len(Trim(Arguments.Value))#" with much success and happiness until > today. When ColdFusion attempted to run this code I got a nice fat error: > Invalid data '' for CFSQLTYPE CF_SQL_INTEGER > > I was like WTF? Ummm hello McFly if I passed you an empty string that's what > the whole null="#Len(Trim(value))#" was there for... hello. So I did some > digging around and it turns out I was in fact as Fred G Sanford would say > "You Big Dummy!". After reading a blog post by Ben Nadel > http://www.bennadel.com/blog/1092-ColdFusion-CFQueryParam-Binding-vs-SQL-Execution.htm > turns out that if you are using CF_SQL_INTEGER type it's looking for an > integer value period. Pass it an empty string if you wish and it will fail. > So a quick re-write to the code below gave me the results I was expecting in > the first place. > > <cftry> > <cfquery name="createField" datasource="#DSN#"> > INSERT INTO t_field( > structure_id, > source_ref_1, > field_fmt_type_id, > last_chg_user_id, > last_chg_dt > > ) > VALUES( > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.StructureID#"/>, > <cfqueryparam cfsqltype="cf_sql_varchar" > value="#ARGUMENTS.SourceRef1#" null="#Len(Trim(ARGUMENTS.SourceRef1))#"/>, > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.FieldFmtTypeID#" null="#NOT > isNumeric(ARGUMENTS.FieldFmtTypeID)#"/>, > <cfqueryparam cfsqltype="cf_sql_integer" > value="#ARGUMENTS.LastChangeUserID#"/>, > #CreateODBCDate(Now())# > ); > SELECT SCOPE_IDENTITY() AS newid; > </cfquery> > <cfcatch type="database"> > <cfreturn false/> > </cfcatch> > </cftry> > > Using the null="#NOT isNumeric(ARGUMENTS.value)# allows for the proper insert > of a NULL when an empty string is passed to the query. > > Cheers > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| Want to reach the ColdFusion community with something they want? Let them know on the House of Fusion mailing lists Archive: http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:328334 Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4