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。您是否找到了原因,或者更好的方法来解决此行为?