Работа с нулевыми значениями при вставке данных в базу данных

У меня есть следующее 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 с правильным использованием функции обрезки, как обсуждалось в моем предыдущем посте.

Использование cfif в холодном синтезе

Спасибо


person Jack    schedule 30.10.2013    source источник
comment
Вы уверены, что телефонные номера - это числа, а не строки?   -  person James A Mohler    schedule 31.10.2013
comment
Переход на cfqueryparam определенно правильный путь. Типы cfsql различаются в зависимости от типов данных ваших столбцов. Для дат используйте cf_sql_timestamp при работе с датой и временем или cf_sql_date при работе с датой только.   -  person Leigh    schedule 31.10.2013


Ответы (3)


Если вы используете 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>
person BDavis    schedule 30.10.2013
comment
@Jack - Имейте в виду, что null отличается от пустой строки. Используя cfqueryparam, вы можете просто вставить пустую строку вместо null. (По крайней мере, для столбцов varchar). Все зависит от вашей цели и от того, допускают ли столбцы значения NULL. - person Leigh; 31.10.2013
comment
Для поля метки времени я бы изменил нулевой атрибут, чтобы использовать isDate() для переменной даты вместо len(). - person Dan Bracuk; 31.10.2013

Вы захотите использовать <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>

См. также: cfqueryparam

person James A Mohler    schedule 30.10.2013
comment
Вероятно, вам также нужен нулевой атрибут для переменной даты. - person Dan Bracuk; 31.10.2013

Вам нужно либо квалифицировать свои записи 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>
person Marius    schedule 30.10.2013