【发布时间】:2009-06-11 04:07:12
【问题描述】:
我遇到了一些奇怪的事情。
我在 SQL Server 2008 上有一个表,例如 StockEvent,其中包含定义为 nVarchar(MAX) 的 Description 字段。
该字段设置为 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 个不同的 PC,结果是一致的。
我最初认为问题可能出在我的 Access 应用程序的某个地方,但我将上面的代码隔离到它自己的 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 将该表链接到测试 Access 2007 应用程序中。
该应用程序不包含任何表单,除了上面确切的 2 个子例程。
- 如果我单击链接表,我可以在数据表模式下编辑数据和添加新记录。
工作正常。 - 如果我尝试使用 2 个 subs 中的任何一个插入记录,它们都会失败并显示 3155 错误消息。
(该表已关闭且未在其他任何地方引用,并且编辑数据表已关闭。) - 如果我在 SQL Server Management Studio 中尝试 SQL 插入查询,它工作正常。
现在是有趣的一点:
- 似乎任何大于或大于
nvarchar(256)的东西,包括nvarchar(MAX)都会失败。 -
nvarchar(255)以上或以下的任何内容都有效。
就像 Access 将nvarchar视为一个简单的字符串,而不是一个大于 255 的备忘录。 - 更奇怪的是,
varchar(MAX)(没有n)确实有效!
我觉得烦人的是,Microsoft 自己的从 Access 到 SQL Server 2008 的转换器将 Memo 字段转换为 nvarchar(MAX),所以我希望它能够工作。
现在的问题是我需要 nvarchar,因为我正在处理 Unicode...
【问题讨论】:
-
我得到了类似的东西。请让我在这里发布我的问题的链接:http://stackoverflow.com/questions/1686431/varcharmax-datatype-odbc-mapping-to-ms-access2003 我刷新了登录 SQL-Server 2008 本身的 ODBC-Links,并从 clinet windows2003 64 位 Citrix-server 获得了不同的数据类型映射。第一次尝试是完美的 varchar(max) 映射到 ms-access 数据类型“备忘录”。第二次尝试是将 varchar(max) 映射到 ms-access 数据类型“text(255)”的效果不佳。并且不要忘记,
标签: sql-server ms-access