2014-08-12 2 views
3

У меня есть код, который вставляет запись в журнал вместе с информацией о запросе. Как только запрос отправляется и ответ отправляется обратно, я обновляю запись с информацией о ответе. Есть ли способ получить идентификатор недавно вставленной записи, чтобы я мог ссылаться на нее и обновлять ее после получения ответа? Я знаю, используя теги CF, которые вы можете использовать SET NO COUNT, но он не работает в CFScript. Кажется, что ничего не возвращается в инструкции INSERT.Получить недавно вставленный идентификатор записи в CFScript

 query = new query(); 
     query.name = "queryResult"; 
     query.setDataSource('dsn'); 
     sql = " 

     INSERT INTO paymentlogs (
      type, name, address1, address2, country, provstate, city, pocode, cclastfour, expirymonth, expiryyear, cardtype, requestxml, ipaddress, clid, subscriptionid, total, createdat, createdby, updatedat, updatedby 
     ) 
     VALUES 
     (
      :type, :name, :address1, :address2, :country, :provstate, :city, :pocode, :cclastfour, :expirymonth, :expiryyear, :cardtype, :requestxml, :ipaddress, :clid, :subscriptionid, :total, :now, :username, :now, :username 
     ) 

     "; 
     query.setSQL(sql); 

     query.addParam(name="clid", cfsqltype="cf_sql_varchar", value="#formValues.clid#"); 
     query.addParam(name="type", cfsqltype="cf_sql_varchar", value="#arguments.type#"); 
     query.addParam(name="name", cfsqltype="cf_sql_varchar", value="#formValues.ccname#"); 
     query.addParam(name="address1", cfsqltype="cf_sql_varchar", value="#formValues.ccaddress1#"); 
     query.addParam(name="address2", cfsqltype="cf_sql_varchar", value="#formValues.ccaddress2#"); 
     query.addParam(name="country", cfsqltype="cf_sql_varchar", value="#formValues.cccountry#"); 
     query.addParam(name="provstate", cfsqltype="cf_sql_varchar", value="#formValues.ccprovstate#"); 
     query.addParam(name="city", cfsqltype="cf_sql_varchar", value="#formValues.cccity#"); 
     query.addParam(name="pocode", cfsqltype="cf_sql_varchar", value="#formValues.ccpocode#"); 
     query.addParam(name="cclastfour", cfsqltype="cf_sql_varchar", value="#Right(formValues.ccnumber, 4)#"); 
     query.addParam(name="expirymonth", cfsqltype="cf_sql_varchar", value="#formValues.ccexpirymonth#"); 
     query.addParam(name="expiryyear", cfsqltype="cf_sql_varchar", value="#formValues.ccexpiryyear#"); 
     query.addParam(name="cardtype", cfsqltype="cf_sql_varchar", value="#getCardType(formValues.cctype)#"); 
     query.addParam(name="requestxml", cfsqltype="cf_sql_varchar", value="#soapBody#"); 
     query.addParam(name="ipaddress", cfsqltype="cf_sql_varchar", value="#CGI.REMOTE_ADDR#"); 
     query.addParam(name="subscriptionid", cfsqltype="cf_sql_varchar", value="#formValues.subscriptionid#"); 
     query.addParam(name="total", cfsqltype="cf_sql_float", value="#formValues.grandTotalAmount#"); 
     query.addParam(name="username", cfsqltype="cf_sql_varchar", value="#formValues.username#"); 
     query.addParam(name="now", cfsqltype="cf_sql_timestamp", value="#now()#"); 
     result = query.execute().getResult(); 
     writedump(result);abort; 

Я искал Google и не смог найти способ сделать это в CFScript. Я не хочу запрашивать таблицу для последней строки, потому что это не очень надежно. Есть ли способ получить вновь вставленный идентификатор записи после выполнения запроса INSERT?

Я использую mySQL. Странная вещь, когда я выгружаю переменную «результат» выше, CF жалуется, что результат не определен. Когда я проверяю таблицу, я вижу, что скрипт выполнялся, и запись была вставлена.

+0

* RE: используя CF-метки, вы можете использовать SET NO COUNT, но, похоже, это не работает в CFScript * 'SET NOCOUNT' - это специальная команда SQL Server. [Нет эквивалента MySQL] (http://stackoverflow.com/questions/3386217/is-there-an-equivalent-to-sql-servers-set-nocount-in-mysql). Вот почему это не работает для вас. Сказав это, обычно «SET NOCOUNT» требуется только для вставок, когда запрос делает больше, чем просто один «INSERT». – Leigh

ответ

12

Он должен быть расположен под getPrefix().generatedkey

genKey = result.getPrefix().generatedkey; 
+0

Я думал, что могу сделать что-то подобное, но когда я вывожу переменную результата, как в моем примере кода, я получаю сообщение об ошибке, что результат не определен. Поэтому я не могу получить доступ к чему-либо в результате. Однако запрос выполняет правильно, и я вижу вставку строки в таблице. – Guest

+0

Мэтт правильный. Методы просто плохо названы. IMO они должны совпадать с атрибутами тега cfquery. Они этого не делают. 'getResult()' равно ' 'и' getPrefix() 'to' '. – Leigh

0

Или поочередно Вы можете использовать функцию Scope_Identity() MS SQL Server:

sql = " 

    INSERT INTO paymentlogs (
     type, name, address1, address2, country, provstate, city, pocode, cclastfour, expirymonth, expiryyear, cardtype, requestxml, ipaddress, clid, subscriptionid, total, createdat, createdby, updatedat, updatedby 
    ) 
    VALUES 
    (
     :type, :name, :address1, :address2, :country, :provstate, :city, :pocode, :cclastfour, :expirymonth, :expiryyear, :cardtype, :requestxml, :ipaddress, :clid, :subscriptionid, :total, :now, :username, :now, :username 
    ) 

    select Scope_Identity() as [ID] 

    "; 

Затем result.ID должен содержать сгенерированный идентификатор.

+0

В этом вопросе нет ничего, что указывало бы на РСУБД. –

+0

Извините, забыли упомянуть, что я использую mySQL. Но странно, что я даже не могу сбросить результат, потому что CF жалуется, что он не определен. – Guest

+1

Извините, я предположил MS SQL. Что касается результата, который не существует, он, вероятно, не будет определяться как нет возврата из запроса. Обычно для выполнения обновления или вставки, когда ничего не возвращается, вы можете просто result = query.execute(); Попробуйте сбросить это. –

5

Ответ Мэтта правильный, а метаданные находятся в атрибуте Префикс. В его примере предполагается, что переменная результата - это возврат. result = query.execute(); не result = query.execute().getResult(); как в вашем коде.

От query cfc documentation: «Префикс: эквивалентен атрибуту результата для тега cfquery».

+0

Мой голос положил вашу репутацию более 100. Поздравляем, а вы должен мне пиво. –

 Смежные вопросы

  • Нет связанных вопросов^_^