Sql server 在nvarchar中插入NULL在MSAccess中失败
我有点奇怪 我在SQL Server 2008上有一个表,比如Sql server 在nvarchar中插入NULL在MSAccess中失败,sql-server,ms-access,Sql Server,Ms Access,我有点奇怪 我在SQL Server 2008上有一个表,比如StockEvent,其中包含一个Description字段,定义为nVarchar(MAX) 该字段设置为可空,没有默认值,也没有索引 该表链接到Access 2007应用程序中,但如果我在字段中显式插入一个NULL,则系统地得到: Run-time Error '3155' ODBC--insert on a linked table 'StockEvent' failed. 因此Access中的以下代码位都会复制错误: Pub
StockEvent
,其中包含一个Description
字段,定义为nVarchar(MAX)
该字段设置为可空,没有默认值,也没有索引 该表链接到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台不同的PC上进行了尝试,结果是一致的。起初我认为问题可能出在我的Access应用程序中的某个地方,但我将上面的代码隔离到它自己的Access数据库中,并将唯一的表链接到它,结果是一致的 那么,访问、ODBC和将
NULL
值插入nvarchar
字段是否存在已知问题
更新。感谢您迄今为止的回答。
尽管如此,还是不知道为什么-( 我尝试了一组更小的假设:我在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将该表链接到test Access 2007应用程序中。该应用程序不包含任何表单,除了上面的2个子例程之外,什么都不包含
- 如果单击链接表,我可以在数据表模式下编辑数据和添加新记录。
很好 - 如果我尝试两个SUB中的任何一个插入记录,它们将失败,并显示3155错误消息。
(该表已关闭,不在其他任何位置引用,编辑数据表已关闭。) - 如果我在SQLServerManagementStudio中尝试SQLINSERT查询,它可以正常工作
- 似乎任何比
大或大的东西,包括nvarchar(256)
都会失败nvarchar(MAX)
- 任何打开或低于
的操作都有效。nvarchar(255)
这就像Access将
视为一个简单的字符串,而不是一个大于255的备忘录nvarchar
- 更奇怪的是,
(虽然varchar(MAX)
)实际上可以工作n
Memo
字段转换为nvarchar(MAX)
,因此我希望这能起作用
现在的问题是,我需要
nvarchar
,因为我正在处理Unicode…这应该是合法的语法。您尝试提供空值的字段是否可能链接到其他不允许空值的字段?潜在的并发问题…记录是由同一个或dif上的另一个Access实例打开的或者绑定到表的表单是否在同一台计算机上的同一Access实例中打开了记录
Renaud,当你插入时,试着在其他字段中插入一些内容
另外,尝试插入一个空字符串(“”),而不是null。Renaud
您是否尝试运行SQL事件探查器跟踪?如果查看“错误和警告”类别,如果您的插入由于SQL Server约束而失败,则该类别将显示错误
如果您没有看到任何错误,您可以放心地认为问题出在您的应用程序中
另外,是否确实已连接到SQL Server?CurrentDB是否与您在访问测试循环中使用的变量不同?好的,我可能找到了相关答案: 我尝试使用标准的SQL Server驱动程序而不是SQL Server本机客户端驱动程序,
nvarchar(MAX)
与旧的驱动程序一样工作
这似乎是一个长期存在的、未修复的bug,这让我非常恼火。没有正当理由说明为什么一个驱动程序会将
nvarchar
错误地解释为字符串
,而在使用另一个驱动程序时会将其错误地解释为备忘录。
在这两种情况下,在Access的表设计视图下查看数据类型时,它们都显示为memo
如果有人有更多信息,请将其留在本页。我相信其他人会很高兴找到它。我收到了另一个问题(这里是我的帖子:
在一些非常罕见的情况下,保存带有更改的备注字段的行时会出现错误-这与我在前一篇文章中解释的构造相同,但驱动sql2000服务器及其相应的odbc驱动程序(SQL SERVER)
唯一的解决方法是:在sql server上用一列数据类型[timestamp]扩展表结构并刷新odbc链接。这样就可以在这一行上释放此列中的show stopper
也许这些信息可以帮助某些人——对我来说,在将数据类型[text]更改为[varchar(max)]时,使用sql2008进一步使用odbc已经是历史了.否。我提取了您在问题中看到的代码,这是Access应用程序中唯一的东西,没有表单,没有其他表试图访问数据,没有并发问题。表中的所有其他字段都允许Null,除了用作主键的标识字段。我不知道的是,如果案例与表定义相关,则恩,它在SQL Server management studio控制台中也不起作用。耶,我只是在这里胡说:)这一个是现成的,但您可以更改链接表的某些属性,required是其中之一。如果您进入设计视图,则链接表的“required”设置为“Yes”有可能吗?我还会检查链接表和源表,以确保没有违反任何验证规则。嗨,Aaron。更新甚至没有到达探查器,因此在发送数据之前,显然是ODBC或访问问题。我