Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在nvarchar中插入NULL在MSAccess中失败_Sql Server_Ms Access - Fatal编程技术网

Sql server 在nvarchar中插入NULL在MSAccess中失败

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

我有点奇怪

我在SQL Server 2008上有一个表,比如
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将
    nvarchar
    视为一个简单的字符串,而不是一个大于255的备忘录
  • 更奇怪的是,
    varchar(MAX)
    (虽然
    n
    )实际上可以工作
我感到恼火的是,Microsoft自己的Access到SQL Server 2008的转换器将
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或访问问题。我