【问题标题】:Typed Dataset with null values to XML具有空值的类型化数据集到 XML
【发布时间】:2009-07-28 18:54:05
【问题描述】:

当使用 ds.GetXml 将类型化 DataSet 写入 XML 时,具有空值的列将从 XML 中删除。我知道这是因为未写入架构等,但是有没有办法覆盖它而无需在写入 XML 之前解析 DataSet 并将所有数据库空值转换为空字符串?


编辑:附加信息:

1) 我的主要任务是获取 DataSet 并将其流式传输到 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) LOL 关于遗留系统的评论。这是更荒谬的东西。我认为他们可能会像解析逗号分隔文件一样解析 XML。只要数据中有逗号,它就会抛出它! :)

【问题讨论】:

  • 您使用的是什么版本的 .NET?

标签: .net xml xml-serialization dataset


【解决方案1】:

首先,我建议您永远不要将 XML 处理为字符串。您应该始终使用对 XML 规则敏感的 API。在这种情况下,您应该使用 DataSet.WriteXml 的重载之一。

其次,当您说“null”时,您指的是DBNull吗?也就是说,数据库术语中的 NULL,或者您指的是 C# 中的值 null 和 VB.NET 中的 Nothing

最后,为什么要出现这些列?它们只是占用空间。


编辑:

  1. 更正代码:此代码效率低下:将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
    
  2. 根据研究,似乎没有一种简单的方法可以强制显示列。您可以将所有DBNull.Value 值替换为其类型的默认值(注意String.Empty 仅在列的.NET 类型为string 时才有效。它不适用于DateTime 列, 例如)。一旦设置为DBNull.Value 以外的其他值,我认为您将不得不遍历表中的所有列,并将它们的AllowDBNull 属性设置为false

真正需要的是,您要上传到的站点需要学习 XML。在当今时代,软件对 XML 的理解不够好,以至于您无法提供 XML Schema 以便他们了解预期的列,这是可耻的。

如果您愿意说出这是哪个网站,我相信我们都会很乐意公开嘲笑他们。

:-)

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2012-07-06
    • 2013-05-25
    • 2014-08-14
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多