我有一个表单(子表单,但不相关),它有一个多表链接表视图作为其记录源。到目前为止,我们在通过表单更新任何列时从未遇到过任何实际问题。我们已将本地 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 的视图,但它仍然出现相同的错误
我终于解决了这个问题。由于 Azure SQL 仅是 UTC 日期和时间,因此在插入当前日期时,我将插入和更新存储过程中的所有 GetDate() 实例更改为 SYSDATETIMEOFFSET() AT TIME ZONE 'AUS Eastern Standard Time' 以便所有日期会是一致的。其他应用程序也写入此数据库,并且它遵循它们的时区,但由于存储过程位于 SQL Server 本身内,因此它以 UTC 写入。
出于我仍在试图理解的原因,该视图不喜欢这些日期。我更改了视图以将其格式设置为 dd/MM/yyyy,然后它再次开始工作。