我正在将Access前端/ Access后端应用程序移植到Access前端/ SQL Server后端,并且遇到了特定表单的问题。我认为这是因为我没有正确理解我想要做的事情的基本概念。特别是通过视图更新数据。
它是一个资源预订应用程序,我有“客户”,主要通过他们的clientID知道,试图在“日记”中预订“资源”(由其resourceID知道)。 “日记”中的每条记录都是预订,包含预订的日期和时间以及clientID和resourceID。
在现有的Access应用程序中,我有一个查询作为表单的记录源,该表单通过它们的相互clientID连接日记和客户端。沿着这些方向的东西(虽然在真实的东西中涉及更多的领域)
SELECT d.bookdate,d.booktime, d.clientID, c.clientID AS CID, c.name
FROM diary d INNER JOIN client c ON d.clientID = c.clientID
ORDER BY bookdate,booktime
我发现我可以通过打开表单为clientID创建一个新的日记录 acFormAdd和OpenArgs设置为clientID,并将表单加载写入数据字段CID(c.clientID)喜欢的表单字段,因此
DoCmd.OpenForm "frmDiary", acNormal, , "ClientID = " & Me.ClientID, acFormAdd, , Me.ClientID
然后在Form_Current子
中的frmDiary中 If Nz(Me.OpenArgs, "") <> "" Then Me.CID = Me.OpenArgs
写入Me.CID字段(该数据已存在的查询的一侧)导致在日记表中创建新记录,同时使用来自该日志表的正确数据填充表单。客户记录中的其他字段。
在应用程序的SQL Server版本中,我动态创建tabledef,以指向启动序列期间SQL Server数据库的正确实例中的表。我还为适当的视图创建tabledef。我动态地这样做,使我能够很容易地在我的数据库的各种版本之间切换。
因为我的日记表长度为80,000条记录,而客户端表的长度为40000条记录,所以我并不特别想在Access客户端中进行两者的连接。因此,我在SQL Server上创建了一个与上面的select子句匹配的视图(减去order by),并在初始化期间为它创建了一个tabledef。
但是整个表单不起作用,因为它告诉我视图不可更新。这似乎可以通过在Access中打开tabledef作为数据表来确认 - 导航集中没有新的记录按钮。
我正在努力,因为
所以我不确定我的下一步应该是什么。有什么想法吗?
答案 0 :(得分:0)
我的问题的一个关键要素是“你如何让视图更新?”。简单的回答是给它一个独特的聚集索引。
我发现虽然您可以在视图上创建,但如果您更改了视图(比如添加其他字段),则需要重新创建索引,因为它会被删除。
答案 1 :(得分:0)
这是视图的代码吗?
SELECT d.bookdate,d.booktime, d.clientID, c.clientID AS CID, c.name
FROM diary d INNER JOIN client c ON d.clientID = c.clientID
ORDER BY bookdate,booktime
如果是,您将无法更新视图。如果视图上只有一个表,则只能使用视图更新表。来自MSDN:
Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table
但为什么你需要使用视图来更新?
关于db_datawriter,你是对的。如果登录映射到具有db_datawriter的用户,则为 写数据时不应该面临许可问题。