当使用 ds.GetXml 将类型化 DataSet 写入 XML 时,具有空值的列将从 XML 中删除。我知道这是因为架构没有写入等,但是有没有办法覆盖它,而不必在写入 XML 之前解析数据集并将所有数据库空值转换为空字符串?
编辑:附加信息:
1)我的主要任务是获取数据集并将其流式传输到 WebRequest。所以我正在创建一个 XML 文档
Dim xmldoc As New Xml.XmlDocument()
xmldoc.LoadXml(dsUpload.GetXml)
然后像这样在 HTTpWebRequest(req) 上上传 xmldoc
Using xw As XmlTextWriter =
New XmlTextWriter(req.GetRequestStream, System.Text.Encoding.Default)
xw.Formatting = Formatting.Indented
xmldoc.WriteTo(xw)
xw.Close()
End Using
2)我说的是DBNull
3)我需要显示这些列,因为我上传到的网站需要包含所有标签,以便他们可以解析它(必须是旧系统)
编辑
1)我同意代码效率不高,但我没有提到的是上传方法是另一个类中的通用方法。因此它接受 XMLDoc,因为同样的方法可以将数据集上传为 xml 和硬编码的 XML 字符串
2)是的,同意只有 System.String 可以转换为 String.Empty。这就是我的数据集的主要内容。
3)关于遗留系统评论的哈哈。这里有更荒谬的东西。我认为他们可能会像解析逗号分隔的文件一样解析 XML。只要数据中存在逗号,它就会将其丢弃! :)
最佳答案
首先,我建议您永远不要将 XML 作为字符串处理。您应该始终使用对 XML 规则敏感的 API。在这种情况下,您应该使用 DataSet.WriteXml 的重载之一。
其次,当你说“null”时,你指的是DBNull吗?也就是说,数据库术语中的 NULL,或者您指的是 C# 中的值 null
和 VB.NET 中的 Nothing
值?
最后,为什么要显示这些列?它们只是占用空间。
编辑:
代码更正:此代码效率低下:将
DataSet
保存到 XML 字符串,然后再次解析 XML 以加载到XmlDocument
中,然后最后再次将 XML 写入请求流。它还使用XmlTextWriter
,该方法从 .NET 2.0 开始已弃用。以下内容更加清晰:Dim settings As New XmlWriterSettings With {.Indent = True} Using stream = req.GetRequestStream Using writer = XmlWriter.Create(stream, settings) dsUpload.WriteXml(writer, XmlWriteMode.IgnoreSchema) End Using End Using
根据研究,似乎没有一种简单的方法可以强制显示列。您可以将所有
DBNull.Value
值替换为其类型的默认值(注意String.Empty
仅当列的 .NET 类型为string
。例如,它不适用于DateTime
列)。一旦设置为DBNull.Value
以外的值,我认为您将必须遍历表中的所有列,并将其AllowDBNull
属性设置为假
。
真正需要发生的是您要上传到的网站需要学习 XML。在当今时代,软件不能很好地理解 XML,无法提供 XML 架构以便它们了解需要哪些列,这是可耻的。
如果您愿意说出这是哪个网站,我相信我们都会很乐意公开 mock 他们。
:-)
关于.net - XML 中包含空值的类型化数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1196058/