我继承了一些相当混乱,没有文档的代码,我不确定这种方法的行为:
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#代码说明了这种行为。
"更新"意思?不幸的是,我无法具体测试此时发生的情况。只是希望有人知道他们的头脑。
答案 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)