Обнуляемые поля bool в связанных таблицах MS Access - PullRequest
5 голосов
/ 22 января 2011

Похоже, я не единственный, кто сталкивается с этой проблемой, но, похоже, этой проблемы нет.

Я работаю в Access 2010, используя связанную таблицу с базой данных SQL Server 2005 (через канал ODBC SQL Server). В этой таблице одно из логических полей помечено как обнуляемое, и несколько записей в этой таблице фактически имеют нулевое значение в поле. Пока все хорошо.

Входит Access, и как только вы открываете связанную таблицу, Access показывает 0 (false) вместо пустой ячейки (проблема № 1). И если вы попытаетесь что-либо изменить в записи, вы получите сообщение об ошибке, в котором говорится, что запись была изменена кем-то другим, и ваши изменения не могут быть сохранены. Эта последняя проблема связана с тем, что Access не допускает пустые поля bool и немного теряет сознание при попытке сохранить значение.

Мои исследования показывают, что это может иметь какое-то отношение к Access, использующему Jet в фоновом режиме для подключения к базе данных SQL Server, и Jet, по-видимому, не поддерживает допустимые логические операции Кажется, нет способа настроить Jet для поддержки этого (хотя, возможно, есть, если вы подключаетесь в коде). Я также думал, что MS заменяет Jet другой технологией, используемой в Office 2010 (ACE, я думаю), но не могу сказать, действительно ли это то, что на самом деле используется Access. В любом случае, я не могу найти никаких настраиваемых опций, относящихся к обнуляемым bools.

Наконец, эта проблема, кажется, была доведена до MS недавно, но с их стороны нет ответа: https://connect.microsoft.com/SQLServer/feedback/details/617339/null-bit-fields-produce-spurious-ms-access-errors-when-using-the-native-odbc-driver?wa=wsignin1.0#tabs

Мне интересно, сталкивался ли кто-нибудь еще с этим и нашел решение. И прежде, чем вы предложите это, отключение опции nullable и установка всех значений null в значение «false» в нашем случае не совсем вариант. Для нас null на самом деле является допустимым состоянием и очень отличается от 'false.

Thx!

Ответы [ 2 ]

6 голосов
/ 22 января 2011

ACE - это обновление Jet (созданное на основе кодовой базы Jet 4.0, которое поддерживается командой Windows и не ожидает дальнейшего развития, в то время как ACE находится в стадии полной разработки командой Access). Он не отличается значительно от Jet, за исключением того, что это новая версия ядра базы данных и имеет функции, которых не хватало Jet.

Обнуляемые логические значения не являются одной из дополнительных функций. В любом случае, если я не ошибаюсь, есть большие теоретические аргументы о том, должны ли Booleans быть Nullable, и Jet / ACE опускается на сторону, которая говорит, что они не должны быть.

Необнуляемые логические значения приводят к проблемам даже в Access / Jet / ACE ( Аллен Браун обсуждал одну такую ​​проблему с LEFT JOINs ). Я предлагаю изменить это поле на Nullable Bit, Byte или Integer (я не уверен, какие именно типы данных в SQL Server, и какие будут наиболее совместимы с Access / Jet / ACE).

В качестве альтернативы, вы можете подойти к нему так, как решается проблема BIGINT, используя представление CAST () от логического значения на стороне сервера до INT. Это делает его недоступным для редактирования, но (как и в случае с BIGINT) вы можете оставить исходное поле в VIEW и записать в него соответствующие значения, в то время как версия CAST () предназначена только для отображения.

Что бы это ни стоило, SSMA для доступа переводит логические значения Jet / ACE в недействительные битовые поля (хотя я не уверен, почему они обнуляемы - мне может понадобиться проверить некоторые из моих приложений, чтобы убедиться, что они работают правильно!) .

0 голосов
/ 15 февраля 2011

После анализа в этом Microsoft KB http://support.microsoft.com/kb/318882 вот что мы сделали, чтобы решить эту проблему. 1) Мы запустили скрипт sql для обновления строк в этой таблице, которые имели нулевые значения в битовых полях, 2) Затем мы изменили определение таблицы, добавив значение по умолчанию «0» в этих битовых полях.

...