Вставка NULL в nvarchar завершается неудачно в MSAccess - PullRequest
2 голосов
/ 11 июня 2009

Я испытываю что-то немного странное.

У меня есть таблица на SQL Server 2008, скажем StockEvent, которая содержит поле Description, определенное как nVarchar(MAX).
Поле имеет значение Nullable, не имеет значения по умолчанию и индекса для него.

Эта таблица связана с приложением Access 2007, но если я явно вставлю NULL в поле, я систематически получаю:

Run-time Error '3155' ODBC--insert on a linked table 'StockEvent' failed.

Таким образом, следующие биты кода в Access воспроизводят ошибку:

Public Sub testinsertDAO()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("StockEvent", _
                              dbOpenDynaset, _
                              dbSeeChanges + dbFailOnError)
    rs.AddNew
    rs!Description = Null
    rs.Update
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

Public Sub testinsertSQL()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "INSERT INTO StockEvent (Description) VALUES (NULL);", _
               dbSeeChanges
    Set db = Nothing
End Sub

Однако, если я делаю то же самое из SQL Server Management Studio , я не получаю сообщение об ошибке и запись вставлена ​​правильно:

INSERT INTO StockEvent (Description) VALUES (NULL);

Похоже, что это не зависит от компьютера: я пробовал на 3 разных установках SQL Server и 2 разных компьютерах, и результаты совпадают.
Сначала я думал, что проблема может быть где-то в моем приложении Access, но я выделил приведенный выше код в его собственную базу данных Access, с этой уникальной таблицей, связанной с ней, и результаты согласованы.

Итак, есть ли известная проблема с Access или ODBC и вставкой NULL значений в nvarchar поля?

Update.
Спасибо за ответы.
Тем не менее, все-таки не везет, понимая почему; - (

Я попытался с еще меньшим набором предположений: я создал новую базу данных в SQL Server с одной таблицей StockEvent, определенной следующим образом:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[StockEvent](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Description] [nvarchar](max) NULL
) ON [PRIMARY]

GO

Затем связал эту таблицу через ODBC с тестовым приложением Access 2007.
Это приложение не содержит форм, ничего, кроме двух указанных выше подпрограмм.

  • Если я нажму на связанную таблицу, я смогу редактировать данные и добавлять новые записи в режиме таблицы.
    Работает нормально.
  • Если я попытаюсь вставить запись в любую из 2-х сабвуферов, произойдет сбой с сообщением об ошибке 3155.
    (Таблица закрыта и больше нигде не используется, а таблица редактирования закрыта.)
  • Если я попытаюсь вставить SQL-запрос в SQL Server Management Studio, он будет работать нормально.

Теперь для интересного:

  • Кажется, что все, что больше или больше, чем nvarchar(256), включая nvarchar(MAX), потерпит неудачу.
  • Все, что включено или меньше nvarchar(255) работает.
    Как будто Access рассматривал nvarchar как простую строку, а не памятку, если ее размер больше 255.
  • Даже странно, что varchar(MAX) (без n) действительно работает!

Что меня раздражает, так это то, что собственный конвертер Microsoft из Access в SQL Server 2008 преобразует поля Memo в nvarchar(MAX), поэтому я ожидаю, что это сработает.

Проблема в том, что мне нужно nvarchar, так как я имею дело с Unicode ...

Ответы [ 5 ]

4 голосов
/ 11 июня 2009

ОК, возможно, я нашел связанный ответ: Таблица привязки Ms Access с nvarchar (max) .

Я пытался использовать стандартный драйвер SQL Server вместо собственного клиента SQL Server , и nvarchar(MAX) работает должным образом с этим более старым драйвером.

Меня действительно раздражает, что это давняя, нефиксированная ошибка.
Нет веских причин, по которым nvarchar должен ошибочно интерпретироваться как string одним драйвером и как memo при использовании другого.
В обоих случаях они отображаются как memo при поиске типа данных в представлении дизайна таблицы в Access.

Если у кого-то есть дополнительная информация, пожалуйста, оставьте ее на этой странице. Я уверен, что другие будут рады найти его.

1 голос
/ 11 июня 2009

Потенциальная проблема параллелизма ... Открыта ли запись другим экземпляром Access на том же или другом компьютере, или форма, связанная с таблицей, открыла запись в том же экземпляре Access на том же компьютере?

Рено, попробуйте поместить что-нибудь в одно из других полей, когда вы делаете вставку.

Также попробуйте вставить пустую строку ("") вместо нуля.

1 голос
/ 11 июня 2009

Renaud,

Вы пытались запустить трассировку SQL Profiler? Если вы посмотрите на категорию «Ошибки и предупреждения», то должна появиться ошибка, если ваша вставка не удалась в результате ограничения SQL Server.

Если вы не видите ошибок, вы можете смело предположить, что проблема в вашем приложении.

Кроме того, вы уверены, что действительно подключены к SQL Server? Разве CurrentDB - это не та переменная, которую вы используете в цикле тестирования Access?

1 голос
/ 11 июня 2009

Это должен быть допустимый синтаксис. Возможно ли, что поле, которое вы пытаетесь задать нулевое значение, связано с другими полями, которые не допускают нулевые значения?

0 голосов
/ 10 ноября 2009

я получил еще одну проблему (здесь мое сообщение: текст ссылки

В некоторых очень редких случаях возникает ошибка при сохранении строки с измененным мемо-полем - та же конструкция, описанная в моем предыдущем посте, но для управления sql2000-серверами и соответствующим odbc-драйвером (SQL SERVER).

Единственное исправленное исправление: расширить структуру таблицы на sql-сервере столбцом типа данных [timestamp] и обновить odbc-ссылки. Это работает и выпускает ограничитель шоу в этом столбце в этой строке ...

Может быть, эта информация может кому-то помочь - для меня это история - идти дальше к odbc с sql2008 в изменении типов данных [text] на [varchar (max)].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...