C# MissingSchemaAction.AddWithKey真正做什么?

C# MissingSchemaAction.AddWithKey真正做什么?,c#,.net,ado.net,sqldataadapter,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 =

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
有用时?

说,它“添加了必要的列和主键信息以完成模式”

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

一点逆向工程可以揭示以下内容:

调用
DbDataAdapter.Fill(数据集,字符串)
时,它执行
DbCommand.ExecuteReader
,并将
CommandBehavior
设置为
SequentialAccess

如果指定
MissingSchemaAction=MissingSchemaAction.AddWithKey
CommandBehavior.KeyInfo
添加到行为中

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

SET NO_BROWSETABLE ON;
这是由Microsoft提供的(如下所示)

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

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

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

SET NO_BROWSETABLE ON
打开NO_BROWSETABLE选项时,所有SELECT语句 表现得就像在语句中附加了FOR BROWSE选项一样。 但是,NO_BROWSETABLE选项不会创建临时 FOR BROWSE选项通常用于发送结果的表 到您的应用程序


它似乎做了一些与文档中解释的不同的事情。如果我使用MissingSchemaAction.Add(默认值)填充数据集,并查看字符串列(System.Data.DataColumn)的MaxLength,它将返回-1。使用MissingSchemaAction.AddWithKey返回列的数据库定义!!我将其与SQL和Oracle驱动程序进行了比较,两者的作用相同。这是令人困惑的,因为没有关于此行为的任何信息:-(@Raul我在我的测试机上有完全相反的结果:Add将返回正确的MaxLength值,而AddWithKey将返回-1s。您是否找到了原因,或者更好的方法来解决此行为?