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

У меня есть код, который использует 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.


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


Ответы (2)


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

<cfquery name="qryTest" datasource="#DSN#">
  INSERT 
  INTO users(fName, lName, City) 
  OUTPUT inserted.id 
  VALUES('Test1', 'Test2', 'Test3')
</cfquery>
person James A Mohler    schedule 18.11.2020
comment
На самом деле настоящий запрос — это upsert. Таким образом, в зависимости от того, было ли это обновление или вставка, он полагался на сгенерированный ключ. Если это существует, это означало, что это была вставка, и действовало соответственно. Я знаю о предложении OUTPUT и могу изменить код. Но я просто пытаюсь определить, почему текущий код перестал работать. Я считал, что сгенерированный ключ всегда будет возвращаться для вставки сервера sql. Это неправда, я думаю. - person CFML_Developer; 19.11.2020

Я просто просматриваю вашу проблему. Я считаю, что ваша таблица (пользователи) не имеет каких-либо ограничений - параметров 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 в структуре результата. Как и мое изображение ниже. введите здесь описание изображения

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

person Kannan.P    schedule 19.11.2020
comment
Учитывая первый абзац вопроса, я не согласен. - person Dan Bracuk; 19.11.2020
comment
Почему,? Возможно, они отключены от опций IDENTITYCOL. В этот раз мы должны столкнуться с той же проблемой. Поскольку его результирующий ключ не возвратил GENERATEDKEY,IDENTITYCOL. Что полностью связано только с параметрами автоинкремента. - person Kannan.P; 19.11.2020
comment
Неа. Ни одно из ваших предположений не соответствует действительности. У меня есть не только PK, но и столбец Identity. И на самом деле он раньше работал в той же среде (точно до 4 месяцев назад, но мог перестать работать в любое время после этого). - person CFML_Developer; 19.11.2020