Я испытываю что-то немного странное.
У меня есть таблица на 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 ...