更新链接视图时 MS Access 写入冲突

问题描述 投票:0回答:1

我有一个表单(子表单,但不相关),它有一个多表链接表视图作为其记录源。到目前为止,我们在通过表单更新任何列时从未遇到过任何实际问题。我们已将本地 SQL 数据库迁移到 Azure SQL,这意味着我们还必须开始使用适用于 SQL Server 的 ODBC 驱动程序 17。现在,当我们尝试更新任何字段时,我们会收到臭名昭著的写入冲突错误。我已经遇到过很多次这种情况,并且能够通过确保所有位字段都有默认值并且不包含空值来解决。这次,我还在相关表中添加了时间戳字段。

尽管如此,我仍然收到写入冲突错误。我有另一个表单,以单个表视图作为其记录源,我可以毫无问题地更新它。

我没有可能影响此问题的底层代码。我只是尝试更改单个值并尝试使用写入符号提交它。我读过许多建议使用查询而不是直接视图/表绑定的线程,但这已经工作了很多年了,而且查询似乎很难构造,因为它包含 MS Access 不包含的数字连接似乎无法应对。

对于可能导致此问题的原因或任何解决方法有什么建议吗?

查看:

    CREATE VIEW [dbo].[vewCardsLatestByPerson]
    AS
    SELECT        TOP (100) PERCENT dbo.tblCard.crdID, 
    dbo.tblCard.crdStatus, dbo.tblCard.crdDate, 
    dbo.tblCard.crdExpiry, dbo.tblCard.crdType, dbo.tblCard.perID, 
    dbo.tblCard.crdACode, dbo.tblCard.crdNumber, 
                         dbo.ufnGetCardScope(dbo.tblCard.crdID) AS 
    crdScope, dbo.tblCard.crdColour, dbo.tblCard.logID, 
    dbo.tblCard.crdWorkStationID, dbo.tblCard.crdUserID, 
                         CASE WHEN dbo.tblCard.crdStatus = 12 THEN 
    '01-JAN-1800' ELSE dbo.tblCard.crdDateCreated END AS orderdate, 
    dbo.tblCard.crdDateCreated, dbo.tblCard.batID, 
    dbo.tblCard.crdMinor, dbo.tblCard.crdConditional, 
                         dbo.tblCard.crdCardEntireNumber, 
    dbo.tblCard.crdUseIF, dbo.tblImageExported.ID, 
    dbo.tblCardTransaction.trnDate, dbo.tblCard.jobReady
    FROM            dbo.tblCard LEFT OUTER JOIN
                         dbo.tblCardTransaction ON dbo.tblCard.crdID 
    = dbo.tblCardTransaction.crdID AND dbo.tblCardTransaction.ctyID = 
    4 LEFT OUTER JOIN
                         dbo.tblImageExported ON 
    dbo.tblCard.crdCardEntireNumber = dbo.tblImageExported.CardNumber
    ORDER BY dbo.tblCard.perID, dbo.tblCard.crdID DESC
    GO

tbl卡:

CREATE TABLE [dbo].[tblCard](
    [crdID] [int] IDENTITY(1,1) NOT NULL,
    [crdStatus] [smallint] NOT NULL,
    [crdDate] [smalldatetime] NOT NULL,
    [crdExpiry] [smalldatetime] NOT NULL,
    [crdType] [int] NOT NULL,
    [perID] [int] NOT NULL,
    [crdACode] [nchar](3) NOT NULL,
    [crdNumber] [int] NOT NULL,
    [crdScope] [nchar](3) NOT NULL,
    [crdColour] [nchar](1) NOT NULL,
    [logID] [int] NULL,
    [crdWorkStationID] [nchar](25) NULL,
    [crdUserID] [nchar](100) NULL,
    [crdDateCreated] [datetime] NULL,
    [batID] [int] NULL,
    [crdMinor] [bit] NOT NULL,
    [crdConditional] [bit] NOT NULL,
    [crdEntireNumber]  AS (calculated field)
    [crdUseIF] [bit] NOT NULL,
    [crdIssuer] [nvarchar](50) NULL,
    [issBatID] [int] NULL,
    [crdVersion] [nvarchar](10) NULL,
    [NewFormat] [bit] NOT NULL,
    [CASA] [bit] NOT NULL,
    [jobReady] [bit] NOT NULL,
    [CRN] [nvarchar](10) NULL,
    [BatchID] [int] NULL,
    [timestamp] [timestamp] NOT NULL,
 CONSTRAINT [PK_tblCard] PRIMARY KEY CLUSTERED 
(
    [crdID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdStatus]  DEFAULT ((0)) FOR [crdStatus]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdDate]  DEFAULT ('1/1/2000') FOR [crdDate]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdExpiry]  DEFAULT ('1/1/2000') FOR [crdExpiry]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdType]  DEFAULT ((0)) FOR [crdType]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdNumber]  DEFAULT ((0)) FOR [crdNumber]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdDateCreated]  DEFAULT ((sysdatetimeoffset() AT TIME ZONE 'AUS Eastern Standard Time')) FOR [crdDateCreated]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdMinor]  DEFAULT ((0)) FOR [crdMinor]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdConditional]  DEFAULT ((0)) FOR [crdConditional]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_crdUseICAO]  DEFAULT ((0)) FOR [crdUseICAO]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_NewFormat]  DEFAULT ((1)) FOR [NewFormat]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_CASA]  DEFAULT ((0)) FOR [CASA]
GO

ALTER TABLE [dbo].[tblCard] ADD  CONSTRAINT [DF_tblCard_jobReady]  DEFAULT ((0)) FOR [jobReady]
GO

ALTER TABLE [dbo].[tblCard]  WITH NOCHECK ADD  CONSTRAINT [FK_tblCard_tblCard] FOREIGN KEY([crdID])
REFERENCES [dbo].[tblCard] ([crdID])
GO

ALTER TABLE [dbo].[tblCard] CHECK CONSTRAINT [FK_tblCard_tblCard]
GO

tbl卡交易:

CREATE TABLE [dbo].[tblCardTransaction](
    [trnID] [int] IDENTITY(1,1) NOT NULL,
    [trnDate] [datetime] NOT NULL,
    [ctyID] [int] NULL,
    [trnDetails] [nvarchar](500) NULL,
    [crdID] [int] NOT NULL,
    [trnwkstationID] [nvarchar](50) NULL,
    [trnUserID] [nvarchar](50) NULL,
    [timestamp] [timestamp] NOT NULL,
 CONSTRAINT [PK_tblCardTransaction] PRIMARY KEY CLUSTERED 
(
    [trnID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

tbl图片导出:

CREATE TABLE [dbo].[tblImageExported](
    [Number] [nvarchar](50) NOT NULL,
    [ID] [nvarchar](50) NOT NULL,
    [perName] [nvarchar](100) NOT NULL,
    [ImportFileName] [nvarchar](256) NOT NULL,
    [timestamp] [timestamp] NULL,
 CONSTRAINT [PK_tblImageExported] PRIMARY KEY CLUSTERED 
(
    [Number] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

编辑2: 实际上,我已经将其剥离回仅包含 tblCard 的视图,但它仍然出现相同的错误

ms-access azure-sql-database odbc
1个回答
0
投票

我终于解决了这个问题。由于 Azure SQL 仅是 UTC 日期和时间,因此在插入当前日期时,我将插入和更新存储过程中的所有 GetDate() 实例更改为 SYSDATETIMEOFFSET() AT TIME ZONE 'AUS Eastern Standard Time' 以便所有日期会是一致的。其他应用程序也写入此数据库,并且它遵循它们的时区,但由于存储过程位于 SQL Server 本身内,因此它以 UTC 写入。

出于我仍在试图理解的原因,该视图不喜欢这些日期。我更改了视图以将其格式设置为 dd/MM/yyyy,然后它再次开始工作。

© www.soinside.com 2019 - 2024. All rights reserved.