【问题标题】:Tackling Null Values while Inserting data in data base在数据库中插入数据时处理空值
【发布时间】:2013-10-31 07:57:05
【问题描述】:

我有以下cfquery

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

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

    </cfquery>

如果公司名称不存在,则有空值,我相信因为我收到以下错误:

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

错误消息中指向的逗号,#Company# 字段之后。请让我知道这是因为空值和修复它的最佳方法吗?

PhoneNumber、company 和 Date 中的值是从 XML SOAP 响应中提取的,并正确使用了我上一篇文章中讨论的 trim 函数。

Using cfif in coldfusion

谢谢

【问题讨论】:

  • 您确定电话号码是数字而不是字符串吗?
  • 切换到cfqueryparam 绝对是要走的路。 cfsqltypes 因列的数据类型而异。对于日期,在处理日期时间时使用cf_sql_timestamp,或在处理日期时使用cf_sql_date

标签: coldfusion coldfusion-8 cfquery


【解决方案1】:

如果您像在任何接受动态参数的数据库 SQL 上一样使用 CFQueryParam,您可以用一块石头杀死两只鸟。首先也是最重要的,防止 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>

【讨论】:

  • @Jack - 请记住 null 与空字符串 "" 不同。使用cfqueryparam,您可以简单地插入空字符串而不是null。 (至少对于varchar 列)。这完全取决于您的目标,以及列是否允许空值。
  • 对于时间戳字段,我会将 null 属性更改为在日期变量上使用 isDate() 而不是 len()。
【解决方案2】:

您需要使用&lt;cfqueryparam&gt; 来处理空值(和注入攻击)

试试

<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>

另见:

【讨论】:

  • 您可能还想在日期变量上设置一个空属性。
【解决方案3】:

您需要限定您的 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>

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2018-09-19
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多