Использование функций при вставке MS SQL.
От: collider  
Дата: 29.07.19 20:34
Оценка:
Проект на C++, используется SQLNCLI11 в качестве провайдера и класс CCommand.
Когда при первом insert вызываешь метод CCommand.Prepare()
ругается на "Insert value list does not match column list"
хотя запрос вроде выглядит честно.
Я выяснил, что если поубирать CONVERT(date,?, 104), то все работает.
INSERT INTO DMS.DBO.PROJEKTE ([PROJEKT],[BESCHRIFTUNG],[MANDANT],[DATUM_VON],[DATUM_BIS],[PRODUKT_ID],[KUNDE_ID],[MEDIENGATTUNG_ID],[TIMESTAMP]) VALUES (?,?,?,CONVERT(date,?, 104),CONVERT(date,?, 104),?,?,?,?)

Кто нибудь сталкивался с такой ситуацией? И как ее можно обойти?
Re: Использование функций при вставке MS SQL.
От: _ABC_  
Дата: 30.07.19 04:25
Оценка:
Здравствуйте, collider, Вы писали:

C>Кто нибудь сталкивался с такой ситуацией? И как ее можно обойти?

Похоже на баг драйвера. Попробуй в порядке бреда поставить вставку convert в самый конец или в самое начало списка.
Re[2]: Использование функций при вставке MS SQL.
От: collider  
Дата: 30.07.19 19:27
Оценка:
Здравствуйте, _ABC_, Вы писали:

_AB>Здравствуйте, collider, Вы писали:


C>>Кто нибудь сталкивался с такой ситуацией? И как ее можно обойти?

_AB>Похоже на баг драйвера. Попробуй в порядке бреда поставить вставку convert в самый конец или в самое начало списка.
Ничего не дает. Такая же фигня. Самое прикольное, что после этого, если забить на ошибку, вставка идет нормально а update и с Prepare и так работает нормально.
Я решил не связываться с такой фигней и не терять времени и тупо руками без CONVERT пишу дату в формате ISO yyyymmdd.
Re: Использование функций при вставке MS SQL.
От: Слава  
Дата: 30.07.19 19:33
Оценка: -1
Здравствуйте, collider, Вы писали:

C>Кто нибудь сталкивался с такой ситуацией? И как ее можно обойти?


Я бы попробовал снять и распознать трафик, который идёт от вашего приложения к sql-серверу

https://stackoverflow.com/questions/2023589/how-can-i-decode-sql-server-traffic-with-wireshark
Re[3]: Использование функций при вставке MS SQL.
От: _ABC_  
Дата: 30.07.19 19:58
Оценка:
Здравствуйте, collider, Вы писали:

_AB>>Похоже на баг драйвера. Попробуй в порядке бреда поставить вставку convert в самый конец или в самое начало списка.

C>Ничего не дает. Такая же фигня.
Ну, собственно, поэтому и в порядке бреда предложение было...

C>Самое прикольное, что после этого, если забить на ошибку, вставка идет нормально а update и с Prepare и так работает нормально.

Угу. Почти 100% баг драйвера. Я просто поэксперементировал внутри SQL Server — там всё нормально, sp_prepare отрабатывает хорошо такие ситуации, да и сообщение об ошибке драйверское, а не SQL Server'а.

C>Я решил не связываться с такой фигней и не терять времени и тупо руками без CONVERT пишу дату в формате ISO yyyymmdd.

Вполне рабоичй вариант, почему нет.
Как другой вариант — а prepare тебе вообще нужен на самом деле?
Re[4]: Использование функций при вставке MS SQL.
От: collider  
Дата: 30.07.19 21:18
Оценка:
Здравствуйте, _ABC_, Вы писали:

_AB>Здравствуйте, collider, Вы писали:


_AB>>>Похоже на баг драйвера. Попробуй в порядке бреда поставить вставку convert в самый конец или в самое начало списка.

C>>Ничего не дает. Такая же фигня.
_AB>Ну, собственно, поэтому и в порядке бреда предложение было...

C>>Самое прикольное, что после этого, если забить на ошибку, вставка идет нормально а update и с Prepare и так работает нормально.

_AB>Угу. Почти 100% баг драйвера. Я просто поэксперементировал внутри SQL Server — там всё нормально, sp_prepare отрабатывает хорошо такие ситуации, да и сообщение об ошибке драйверское, а не SQL Server'а.

C>>Я решил не связываться с такой фигней и не терять времени и тупо руками без CONVERT пишу дату в формате ISO yyyymmdd.

_AB>Вполне рабоичй вариант, почему нет.
_AB>Как другой вариант — а prepare тебе вообще нужен на самом деле?
Ну как нужен... Как это бывает- тебе говорят- бери, вот этот уже проверенный рабочий код, который используется в туеву кучу мест и все работает.
А потом хрясь, и он не работает для твоей конструкции...
А менять эту хрень в общем классе уже как то и стремновато. Вот и приходится думать,прям как врач- "не навреди" )
Re: Использование функций при вставке MS SQL.
От: VladCore  
Дата: 01.08.19 11:43
Оценка:
Здравствуйте, collider, Вы писали:

C>Проект на C++, используется SQLNCLI11 в качестве провайдера и класс CCommand.

C>Когда при первом insert вызываешь метод CCommand.Prepare()
C>ругается на "Insert value list does not match column list"
C>хотя запрос вроде выглядит честно.
C>Я выяснил, что если поубирать CONVERT(date,?, 104), то все работает.
C>INSERT INTO DMS.DBO.PROJEKTE ([PROJEKT],[BESCHRIFTUNG],[MANDANT],[DATUM_VON],[DATUM_BIS],[PRODUKT_ID],[KUNDE_ID],[MEDIENGATTUNG_ID],[TIMESTAMP]) VALUES (?,?,?,CONVERT(date,?, 104),CONVERT(date,?, 104),?,?,?,?)

C>Кто нибудь сталкивался с такой ситуацией? И как ее можно обойти?


Никогда не сталкивался, а видел много разного.
Попробуй так:

declare @date datetime = CONVERT(date,?, 104);
insert .... ,@date, ....
Re: Использование функций при вставке MS SQL.
От: VladCore  
Дата: 01.08.19 11:49
Оценка:
Здравствуйте, collider, Вы писали:

C>Проект на C++, используется SQLNCLI11 в качестве провайдера и класс CCommand.

C>Когда при первом insert вызываешь метод CCommand.Prepare()
C>ругается на "Insert value list does not match column list"

Очень похоже что это ошибка не сервера а клиента. проверь кол-во вопросиков в тексте команды и кол-во параметров на клиенте. одинаковое?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.