如果多次调用,DbDataAdapter.Fill会向表中附加行吗?

时间:2015-12-09 21:30:14

标签: .net vb.net

我继承了一些相当混乱,没有文档的代码,我不确定这种方法的行为:

pclsAuditLog = New Data.clsAuditLog()
pclsAuditLog.mfpGetAuditLog(pDS)

pclsPROcAuditLog = New PROcData.clsAuditLog()
pclsPROcAuditLog.mfpGetAuditLog(pDS)

Data.clsAuditLog.mfpGetAuditLog(ByRef ds As DataSet)PROcData.clsAuditLog.mfpGetAuditLog(ByRef ds As DataSet)都会调用此方法:

Public Function mGetDataSet(ByRef objDs As DataSet, ByVal aStrDSName As String)
    Dim pObjDataAdaptor As New SqlClient.SqlDataAdapter

    pObjDataAdaptor.SelectCommand = New SqlCommand(aStrQuery, pCon)
    pObjDataAdaptor.SelectCommand.CommandTimeout = 3600

    pObjDataAdaptor.Fill(aObjDS, aStrDSName)
End Function

我希望我能解答为什么这些代码是以这种方式编写的,但它是我给出的,我试图理解这一切。

无论如何,我的问题是,当SqlDataAdapter使用对同一Fill对象的引用调用DataSet方法时会发生什么?

MSDN讨论了很多行为,就案例敏感性问题,不同的表名和事物的情况所发生的情况而言,但我似乎无法找到关于行是否被追加或覆盖的答案,当存在具有相同名称的现有表时。具体地,

  

如果调用Fill并且DataSet只包含一个DataTable,其名称仅按大小写不同,则更新DataTable。在这种情况下,比较不区分大小写。以下C#代码说明了这种行为。

"更新"意思?不幸的是,我无法具体测试此时发生的情况。只是希望有人知道他们的头脑。

2 个答案:

答案 0 :(得分:3)

来自msdn

  

使用后续Fill调用刷新内容时   DataSet,必须满足两个条件:

The SQL statement should match the one initially used to populate the DataSet.

The Key column information must be present.
     

如果存在主键信息,则表示任何重复的行   已对帐并且仅在与之对应的DataTable中出现一次   DataSet。可以通过设置主键信息   FillSchema,通过指定DataTable的PrimaryKey属性,或   通过将MissingSchemaAction属性设置为AddWithKey

重点是我的。所以似乎"更新"表示附加,除非这会导致主键违规。

答案 1 :(得分:0)

也许您应该在Microsoft Reference Source

检查SqlDataAdapter参考代码