Задний план:
У нас есть приложение, которое использует ODBC API для взаимодействия с Access и SQL Server (динамически, в зависимости от конфигурации пользователя).
Я обнаружил ошибку, которая может быть в драйвере SQL ODBC, или может быть проблемой неправильной конфигурации с созданным нами ODBC DSN или может быть как-то ошибкой в нашем коде.
Когда документ редактируется и сохраняется, мы запрашиваем базу данных, чтобы узнать, имеет ли этот файл соответствующую запись в базе данных - если это так, мы обновляем запись с обновленными данными из документа; если нет, мы делаем вставку для создания необходимой записи для нее.
Мы используем имя файла как уникальный первичный ключ в нашей таблице, и это нормально работает нормально. Ошибка заключается в том, что если имя файла содержит символы за пределами текущей кодовой страницы ANSI, то выбор указывает на отсутствие совпадений:
SQL: SELECT * FROM "My Designs" WHERE "PATHNAME" = '\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo' [# matches = 0]
Однако, когда попытка вставки пыталась, мы получаем уникальное нарушение ключа (конечно) - так как уже есть запись с этим именем файла.
Database error: Violation of PRIMARY KEY constraint 'PK__My Desig__1B3D5B4BF643706B'. Cannot insert duplicate key in object 'dbo.My Designs'. The duplicate key value is (\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo).
The statement has been terminated.
Я был над кодом с тонкой зубной гребенкой, и я не вижу ничего плохого. :(
Сгенерированный оператор SQL выводит правильный выход Unicode имени файла. Наше приложение скомпилировано для Unicode. Столбец SQL_WVARCHAR
в ODBC говорят.
Я попытался добавить AutoTranslate=no
в строку конфигурации DSN, но это, похоже, не имеет никакого эффекта.
Я попытался подключиться к базе данных с панели управления ODBC. К сожалению, этот интерфейс создает файл журнала ANSI - поэтому я не могу проверить проблемы UNICODE/ANSI с помощью этого инструмента.
Вопросов:
В инструкции select убедитесь, что вы заключили строку where where с N, чтобы указать SQL в unicode:
..."PATHNAME" = N'\\FILE-SERVER\Home Folders\User Files\狭すぎて丸め処理が出来ません!!.foo'
Кроме того, MFC преобразует данные в MCBS или UNICODE в зависимости от вашей конфигурации. Убедитесь, что вы используете CStringT в наборе записей.