我在Access 2002中遇到了一些麻烦......
我有两个表,一个包含大约60k个实例,一个包含列和外键以进行连接。在我的表单中,我将源设置为一个查询,这两个表连接在一起(左连接在空的表上)。基本上,我最终得到了我的60k事件和我的新专栏。
现在,我需要允许我的用户在我的表单中编辑此字段。我发现当我的空表中存在相应的数据时,我可以编辑该字段就好了,但是因为我们需要这个空表只包含我们需要添加新列的事件,所以我不能简单地做一个我所有事件的新条目。
以下是两个表的架构:
表1:
ID Sequence Col1 Col2 Col3 Col5
60k
表2:
ID Sequence Col6
0
我的疑问:
SELECT tblOne.*, tblTwo.Col6
FROM tblOne
LEFT JOIN tblTwo ON (tblOne.Sequence=tblTwo.Sequence) AND (tblOne.ID=tblTwo.ID);
答案 0 :(得分:2)
如果您愿意考虑不同的方法,使用表单/子表单方法可能会更容易。
将主要表单基于tblOne
,并将子表单基于tblTwo
。使用Sequence
和ID
作为主/子链接字段(您可以在子窗体控件的属性表中找到该设置)。
使用该设计,子表单将显示与主表单的当前tblTwo
行匹配的现有tblOne
行。您可以在子表单的新记录中添加新的匹配tblTwo
行 - 它将“继承”当前主表单行的Sequence
和ID
值。
顺便说一句,Sequence
是reserved word。如果可能,重命名该字段。如果必须保留该名称,则可以通过将名称括在方括号中或通过在SQL语句中使用表名(或别名)限定字段名来避免混淆db引擎的风险。
答案 1 :(得分:1)
如果您的查询无法更新,请查看Allen Browne关于可能导致此问题的提示:http://allenbrowne.com/ser-61.html
MS Access有一个缺点。如果您希望在类似列表的视图中编辑数据,它通常最适合以与存储在表中的结构基本相同的结构显示。 编辑:在谈到Yawar留下的关于这不是Access缺点的评论时,我想指出在.NET中开发时,拥有一个数据库结构并不罕见与您的应用程序中使用的数据模型类完全不同。在这种情况下,GUI建立在数据模型上,因此数据库可能与您的数据模型/ GUI有些不同(或事件非常不同)。
回到MS Access,当您使用表连接为数据表表单或连续表单创建记录源/记录集时,我的理解是只有一个表可以更新。换句话说,只有连接的一侧是可更新的。在许多情况下,由于DAO引擎混淆,记录集根本不可更新。 更新:我从下面的链接中推断出,我上面写的内容似乎比使用JET / ACE后端的SQL Server更为真实。
最常见的解决方案是HansUp建议的,使用表单/子表单方法。实际上,您可以将数据表子表格作为另一个数据表子表单的子表单,这在您的情况下可以很好地工作。每条记录的最左侧只会有一个可扩展的加号,因此您可以添加/编辑/删除tblTwo中的记录。
另一种选择是使用ActiveX网格控件,例如来自10tec的iGrid,这意味着您将为各种事情编写相当多的代码,例如加载记录集,将更改/添加/删除写回数据库,处理单元格的格式化等。
另一种选择是使用伪造的ADO记录集。这是一个非常笨拙的方法,我不能说我真的看到它在使用中,大多数只是试验它并在理论上阅读它。问题是你必须创建一个与你生成的记录集几乎相同的伪造记录集,然后你必须循环并将生成的记录集中的所有记录复制到你的伪造记录集中。这是一个巨大的开销,特别是对于那么多的记录。然后,您必须再次编写代码以将所有添加/更改/删除写回数据库。处理新主键的创建可能很棘手。这种特殊的方法并不容易或简单,也不是我推荐VBA初学者处理的方法。
如果您使用的是SQL Server,请查看Microsoft网站上的以下文章。它涵盖了各种材料,包括从单个记录源/视图更新多个表。 http://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx