2013-10-30 33 views
3

我有以下cfquery应对空值,而在数据库中插入数据

<cfquery name="CQuery" datasource="XX.X.X.XXX"> 
     INSERT INTO DatabaseName 
      (PhoneNumber_vch, 
      Company_vch, 
      date_dt) 

     VALUES(#PhoneNumber#, 
      #Company#, 
      #Date#) 

    </cfquery> 

有万一公司名称犯规”存在空值,我相信becasue是荫收到以下错误:

Error Executing Database Query. 
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near ','. 

指出错误消息中的逗号,是在#Company#后面的字段。请让我知道是因为空值和解决问题的最佳方法?

PhoneNumber,company和Date中的值是从正确使用trim函数的XML SOAP响应中提取的,如我以前的文章中所讨论的。

Using cfif in coldfusion

感谢

+0

你确定电话号码是数字而不是字符串吗? –

+2

切换到'cfqueryparam'绝对是您的选择。 cfsqltypes根据列的数据类型而有所不同。对于日期,在处理日期**和**时间时使用'cf_sql_timestamp',或者在处理日期*时使用'cf_sql_date' *。 – Leigh

回答

11

如果你使用CFQueryParam像你应该接受动态参数,你可以一举两得任何数据库SQL。首先也是最重要的,防止SQL注入攻击,其次你可以使用null =“”的属性在你的记录中插入一个NULL值。

<cfquery name="CQuery" datasource="XX.X.X.XXX"> 
     INSERT INTO DatabaseName (PhoneNumber_vch, Company_vch, date_dt) 
     VALUES(
      <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(PhoneNumber)#" null="#NOT len(trim(PhoneNumber))#" /> 
      ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(Company)#" null="#NOT len(trim(Company))#" /> 
      ,<cfqueryparam cfsqltype="cf_sql_timestamp" value="#Date#" null="#NOT len(trim(Date))#" /> 
    ) 
</cfquery> 
+2

@Jack - 请记住,null与空字符串“”不同。使用'cfqueryparam'你可以简单地插入空字符串而不是'null'。 (至少对于'varchar'列)。这一切都取决于你的目标,以及列是否允许空值。 – Leigh

+1

对于时间戳字段,我会将null属性更改为在date变量上使用isDate()而不是len()。 –

+0

谢谢大家! – Jack

3

你将要使用<cfqueryparam>照顾空值(和注入攻击)

的尝试

<cfquery name="CQuery" datasource="XX.X.X.XXX"> 
    INSERT INTO DatabaseName 
     (PhoneNumber_vch, 
     Company_vch, 
     date_dt) 

    VALUES(
     <cfqueryparam value = "#PhoneNumber#" cfsqltype = "CF_SQL_VARCHAR">, 
     <cfqueryparam value = "#Company#" cfsqltype = "CF_SQL_VARCHAR" 
      null    = "#IIF(Company EQ "", 1, 0)#">, 
     <cfqueryparam value = "#Date#" cfsqltype = "CF_SQL_TimeStamp" 
      null    = "#IIF(Date EQ "", 1, 0)#" > 
     ) 

</cfquery> 

另见:

+0

您可能还需要date变量的null属性。 –

3

你要么d来限定你的varchar条目(用单引号括住所有的varchar条目,或者,最好将它们改为cfqueryparams;

<cfquery name="CQuery" datasource="XX.X.X.XXX"> 
     INSERT INTO DatabaseName 
      (PhoneNumber_vch, 
      Company_vch, 
      date_dt) 

     VALUES(<cfqueryparam value="#PhoneNumber#" cfsqltype="CF_SQL_VARCHAR">, 
      <cfqueryparam value="#Company#" cfsqltype="CF_SQL_VARCHAR">, 
      <cfqueryparam value="#Date#" cfsqltype="CF_SQL_TIMESTAMP">) 

    </cfquery>