访问链接到SQL:为新创建的记录

时间:2015-09-24 12:11:57

标签: sql ms-access ms-access-2013 sql-server-2014

我在Access(2013)中使用链接到SQL数据库的表。主键是一个包含GUID的列' RowId'

当我向表中添加新记录时,我将RowId留空。该记录将插入SQL数据库中,但随后添加的记录将填充另一条记录的数据。

在调查SQL Server Profiler的问题后,我发现这种情况发生了:

首先,处理INSERT语句:

exec sp_executesql
    N'INSERT INTO  "{table}"  ("{column1}","{column2}", {column4}") 
      VALUES (@P1,@P2,@P3)',
    N'@P1 int,@P2 nvarchar(50),@P3 nvarchar(50)',
    3438,
    N'Smith',
    N'Sofia'

然后,传递第二个语句,以获取保存记录的值(我猜):

declare @p1 int
set @p1=5
exec sp_prepexec
   @p1 output,
   NULL,
   N'SELECT "{column1}","{column2}", {column3}","{column4}","{column5}", {column6}",
     "RowID","RV"  FROM "{table}"  WHERE "RowID" IS NULL'
select @p1

创建记录时最初没有给出RowID,因此现在Access要求RowId IS为NULL的行。这发生两次,并且失败了两次。然后,RowId由insert语句中给出的参数询问:

exec sp_executesql
   N'SELECT "{table}"."RowID"
     FROM "{table}"
     WHERE "{column1}" = @P1 AND "{column2}" = @P2 AND "{column4}" = @P3',
   N'@P1 int,@P2 nvarchar(50),@P3 nvarchar(50)',
   3438,
   N'Smith',
   N'Sofia'

如果存在具有相同参数的另一条记录(例如3438,Smith,Sofia),则返回此记录的RowID,并使用该其他记录中的数据填充Access中的新记录(包括错误的RowID) )。此记录上的每个操作现在都在错误的记录上进行,因为语句中给出了错误的RowID。刷新表后,将显示新插入的记录,其中包含正确的数据和新生成的RowID。

如何防止这种情况发生?如何在插入行后立即显示正确的数据?

1 个答案:

答案 0 :(得分:1)

我怀疑Access不知道RowId是主键,或者它(或ODBC驱动程序)无法正确处理GUID数据类型。

如果在设计视图中打开链接表,Access会为RowId显示哪种数据类型?它是否显示主键的“键”图标?

在对Recommendations on using SQL Server GUID from MS Access的评论中,David-W-Fenton(他对这些事情了解很多)写道:

  

如果您的前端位于Access中,则处理GUID存在严重问题:http://www.trigeminal.com/usenet/usenet011.asp?1033

不幸的是,此页面已关闭 编辑 archive.org救援:INFO: Replication and GUIDs, the Good, the Bad, and the Ugly
虽然这似乎是关于Jet GUID,而不是SQL Server,所以可能不适用。

有关GUID的更多信息:What are the best practices for using a GUID as a primary key, specifically regarding performance?