为什么“生成插入、更新和选择语句”选项是灰色的?

4
在“配置数据源”时,为什么在“高级”部分中,“生成插入、更新和选择语句”会变灰?在某些表格上它没有变灰并且可以正常工作。
我知道可以通过在属性中将autogenerateeditbutton标签更改为true来解决这个问题,然后可以通过这种方式进行编辑,但是当你尝试更新时,数据库不会有任何更新。
当我在论坛上查看此事时,也提到了这可能与设置主键有关。但我没有得到确定的答案。
浏览器中的错误如下:
NotSupportedException: Updating is not supported by data source 'AccessDataSource1' unless UpdateCommand is specified.
有什么办法可以更新这些有问题的表格中的数据库吗?它们为什么有问题?
如何为表格分配主键?这应该在Access中完成吗?还是可以在VS08中完成?

你没有使用Access——你只是在使用Jet。 - David-W-Fenton
3个回答

9
为了自动生成插入/选择/更新语句,表必须具有主键,以便在插入或更新时选择正确的行。如果表中没有一个列具有唯一值,则可能会出现多行匹配应该更新的行的情况。使用主键允许设计人员生成可靠地选择要更新的正确行的代码。

主键如何分配给表?这应该在Access中完成吗?它可以在VS08中完成吗? - CGF
您不必拥有Access才能向Jet MDB表添加主键 - 您只需要知道正确的DDL并拥有ODBC或OLEDB驱动程序即可。 - David-W-Fenton

1
创建数据源,视图如下: mainkey 是主键。 授予用户插入、更新、选择、删除视图的权限:

“ DeleteCommand="DELETE FROM [VW_Security_UK_UserAccess] WHERE [MainKey] = @MainKey"

                InsertCommand="INSERT INTO [VW_Security_UK_UserAccess] ([UserName], [HasAccess], [ApplicationDefinitionmainkey], [SortOrder]) VALUES (@UserName, @HasAccess, @ApplicationDefinitionmainkey, @SortOrder)" 
                SelectCommand="SELECT [MainKey], [UserName], [HasAccess], [ApplicationDefinitionmainkey], [SortOrder] FROM [VW_Security_UK_UserAccess]" 
                UpdateCommand="UPDATE [VW_Security_UK_UserAccess] SET [UserName] = @UserName, [HasAccess] = @HasAccess, [ApplicationDefinitionmainkey] = @ApplicationDefinitionmainkey, [SortOrder] = @SortOrder WHERE [MainKey] = @MainKey">
                <DeleteParameters>
                    <asp:Parameter Name="MainKey" Type="Int16" />
                </DeleteParameters>
                <InsertParameters>
                    <asp:Parameter Name="UserName" Type="String" />
                    <asp:Parameter Name="HasAccess" Type="String" />
                    <asp:Parameter Name="ApplicationDefinitionmainkey" Type="Byte" />
                    <asp:Parameter Name="SortOrder" Type="Int32" />
                </InsertParameters>
                <UpdateParameters>
                    <asp:Parameter Name="UserName" Type="String" />
                    <asp:Parameter Name="HasAccess" Type="String" />
                    <asp:Parameter Name="ApplicationDefinitionmainkey" Type="Byte" />
                    <asp:Parameter Name="SortOrder" Type="Int32" />
                    <asp:Parameter Name="MainKey" Type="Int16" />
                </UpdateParameters>
            </asp:SqlDataSource>

1

请参考tvanfosson的回答,主键是一种可能性。如果您的选择语句使用视图而不是直接表格,您也会得到这种行为。

您可以通过在.xsd文件中生成或手工编写xml来解决这个问题,但这是一个相当极端的解决方案;-)


这个问题以前也困扰过我,那些在VS中创建但在数据库中不存在的视图无法拥有原始的更新例程。不过你可以手动添加任何查询语句,而且通常你也不需要全部四个本地的例程。 - Karl
“Views?”在Jet MDB中并不存在这样的东西。 - David-W-Fenton
@[David W. Fenton]:当我写这个答案时,没有MS-Access标签,也没有提到Access。 - Steven A. Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接