Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Отсутствует GENERATEDKEY в результате запроса

Автор вопроса: CFML_DeveloperОтветов: 2

У меня есть код, который использует GENERATEDKEY из атрибута результата тега cfquery за последние несколько лет. Недавно я заметил, что это больше не часть структуры, возвращаемая Result.

<cfquery name="qryTest" datasource="#DSN#" result="sResult">
  INSERT INTO users(fName, lName, City) VALUES(
  'Test1', 'Test2', 'Test3')
</cfquery>
<cfdump var="#sResult#">

Я получаю только CACHED, EXECUTIONTIME, RECORDCOUNT и SQL. Среда - CF2016, SQL Server 2014.

  • В настройках источника данных есть опция от Disable Autogenerated Keys до Disable retrieval of autogenerated keys. Это проверено? rrk 19.11.2020
  • @rrk, нет, это там не включено. Так что загадка продолжается.. CFML_Developer 19.11.2020
  • Вы недавно меняли драйвер JDBC или источник данных? Поскольку CF использует интерфейс java.sql.Statement метод getGeneratedKeys, который должен быть реализован соответствующим образом. Alex 19.11.2020
  • @CFML_Developer Не могли бы вы перепроверить наличие IDENTITYCOL в структуре? Kannan.P 19.11.2020
  • Серьезный вопрос - вы его выключали и снова включали? :-) Спрашиваю, потому что у меня была похожая проблема пару лет назад, на продакшене в интернет-магазине, где какая-то часть CF/JDBC-драйвера/MSSQL перестала возвращать result.GENERATEDKEY там, где он работал годами раньше, и не было недавние изменения. Я добавил некоторый резервный код, чтобы получить идентификатор другим способом, поскольку я не мог оправдать перезапуск в часы пик, но в конечном итоге после перезапуска службы CF + перезапуска SQL Server исходная проблема исчезла и больше не возвращалась, поэтому я так и не обнаружил, что. Sev Roberts 19.11.2020
  • @SevRoberts, я не уверен. Сервером управляет другой человек. Я видел такое поведение на 2 серверах, и оба они периодически перезагружались для обслуживания. Я постараюсь посмотреть, смогу ли я перезапустить их. CFML_Developer 19.11.2020

coldfusion-2016coldfusion

Ответы

Ответ 1 · рейтинг 1 · James A Mohler

Вы пытаетесь сделать что-то подобное?

<cfquery name="qryTest" datasource="#DSN#">
  INSERT
  INTO users(fName, lName, City)
  OUTPUT inserted.id
  VALUES('Test1', 'Test2', 'Test3')
</cfquery>

Ответ 2 · Kannan.P

Я просто просматриваю вашу проблему. Я считаю, что ваша таблица (пользователи) не имеет каких-либо ограничений - параметров PK (первичный ключ) и IDENTITYCOL (автоматическое увеличение). Чтобы он не возвращал ключи IDENTITYCOL & GENERATEDKEY в вашей структуре результатов. Здесь,

 <cfquery name="InsertData1" datasource="testmssql" result="test" >
     INSERT INTO loginDetails VALUES( 'xxx','yyy')
 </cfquery>

Я вставил данные двух столбцов, и в моей таблице loginDetails есть параметры PK и Identitycol. Таким образом, в результате дампа он должен возвращать структуру с ключом и значениями для CACHED, EXECUTIONTIME, GENERATEDKEY, IDENTITYCOL, RECORDCOUNT и SQL, как показано ниже.

<cfquery name="InsertData1" datasource="testmssql" result="test" >
   INSERT INTO test2 VALUES( 'xxx','yyy')
</cfquery>

Здесь моя таблица test2. Я не устанавливал параметры Autoincrements (Constraints). Таким образом, он не возвращает GENERATEDKEY,IDENTITYCOL в структуре результата. Как и мое изображение ниже.

Поэтому я предлагаю, пожалуйста, проверить, на стороне БД, есть ли у этой таблицы правильные ограничения или нет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы