Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理来自SQL Server的XML中的空对象?_C#_Sql Server_Xml - Fatal编程技术网

C# 如何处理来自SQL Server的XML中的空对象?

C# 如何处理来自SQL Server的XML中的空对象?,c#,sql-server,xml,C#,Sql Server,Xml,我有一个以XML形式返回对象的存储过程。我如何处理对象不存在的情况 我不能返回null或空字符串,因为XmlReader抱怨它不是有效的XML 如果我返回一个空标记,我如何判断它只是一个空对象还是没有对象?嗯,一种常见的方法是一些标记属性,例如xsi:nil=“true”(尽管这只是一个示例)。要么返回一个自定义的空标记()并检查它,要么只是更改读取数据的方式: 首先将流提取到字符串变量中,并检查string.IsNullOrEmpty 只需尝试捕获ArgumentNullException/

我有一个以XML形式返回对象的存储过程。我如何处理对象不存在的情况

我不能返回null或空字符串,因为XmlReader抱怨它不是有效的XML


如果我返回一个空标记,我如何判断它只是一个空对象还是没有对象?

嗯,一种常见的方法是一些标记属性,例如
xsi:nil=“true”
(尽管这只是一个示例)。

要么返回一个自定义的空标记()并检查它,要么只是更改读取数据的方式:

  • 首先将流提取到字符串变量中,并检查string.IsNullOrEmpty
  • 只需尝试捕获ArgumentNullException/ArgumentException的读取器

为存储过程创建一个out参数。在存储过程内部,将现有对象的值设置为1,将不存在的对象的值设置为0。如果out参数为1,则仅反序列化存储过程的xml结果

CREATE PROCEDURE sp_GetObjectAsXml         
(
    @intId  int,
    @intExists int out
) 
AS  
BEGIN
    SELECT 'hello world'  WHERE 1 = @intId
    SET @intExists = @@ROWCOUNT
END

-- Happy Path
DECLARE @intExists int
exec sp_GetObjectAsXml 1, @intExists out
SELECT @intExists -- results in 1

-- Sad Path
DECLARE @intExists int
exec sp_GetObjectAsXml 10, @intExists out
SELECT @intExists -- results in 0
根据您的“外部约束”(例如,您控制了多少XML生成/使用过程),可以通过根本不包含元素来表示null


接收方(方案验证等)当然必须准备好处理可选元素。

我看到的两种方法是:

  • 包含一个属性以指示该项是否为null(isnull=“true | false”)。通常,如果不包括属性,则假定为false
  • 不要包含该节点的元素。如果它在xml中不存在,则为null。如果它确实存在并且是空的,那么它只是一个空字符串。当然,这依赖于解析代码能够确定应该存在哪些元素(通常通过模式或xml文件前面的信息)

  • 第一个选项通常更容易处理,但会产生更多的文本。第二个可以生成更小的xml文件。

    这假设我们返回一个对象-我们可以有多个子对象:一些为null,一些为not.Fair point。在这种情况下,我喜欢使用属性的方法。