MissingSchemaAction.AddWithKey到底做了什么?

时间:2015-11-10 23:20:44

标签: c# .net ado.net sqldataadapter

SqlDataAdapter.MissingSchemaAction的默认值为MissingSchemaAction.Add,但是当我指定AddWithKey时,我无法理解它的真正含义?

System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter();
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

DataSet ds = new DataSet();
da.Fill(ds, "mytable");

使用AddWithKey时有用吗?

1 个答案:

答案 0 :(得分:3)

Documentation here说,它“添加了必要的列和主键信息来完成架构”

它将AddWithKey的主要功能说明为:“这可确保更新与现有记录匹配的传入记录而不是附加。”

一点反向工程揭示了以下内容:

当您调用DbDataAdapter.Fill(DataSet, string)时,它会执行DbCommand.ExecuteReader并将CommandBehavior设置为SequentialAccess

如果您指定MissingSchemaAction = MissingSchemaAction.AddWithKey;,则CommandBehavior.KeyInfo会添加到行为中。

这会导致内部调用的DbCommand.ExecuteReader在您的查询之上添加以下内容:

SET NO_BROWSETABLE ON;

Microsoft的documented here(如下所示)

  

使用浏览模式可以扫描SQL Server表中的行   一次更新表格中的数据。访问SQL   应用程序中的服务器表在浏览模式下,必须使用一个   以下两个选项:

     

用于从SQL访问数据的SELECT语句   服务器表必须以关键字FOR BROWSE结尾。当你打开   FOR BROWSE选项使用浏览模式,临时表是   创建

     

您必须运行以下Transact-SQL语句才能打开   使用NO_BROWSETABLE选项浏览模式:

SET NO_BROWSETABLE ON
     

当您打开NO_BROWSETABLE选项时,所有SELECT语句   表现就像FOR BROWSE选项附加到语句一样。   但是,NO_BROWSETABLE选项不会创建临时   FOR BROWSE选项通常用于发送结果的表   到你的申请。