【问题标题】:Illigal qualified name character with XML parsing into SQL using C#使用 C# 将 XML 解析为 SQL 的非法限定名称字符
【发布时间】:2017-01-18 12:01:33
【问题描述】:

我正在尝试使用带有 XML 解析的查询来过滤表中的列。这个查询是用 C# 编写的,我正在使用 SQLDataAdapter 来执行查询。我的代码如下:

string sqlstring = $@"select * from [AS_GOV_PS_oud] inner join [AS_GOV_PStest13_1_2017v2]
                        on   
                                [AS_GOV_PStest13_1_2017v2].[I/O name]        = 'ST' where
cast('<a>' + replace([AS_GOV_PS_oud].Interconnection, '\""', ' </ a >< a > ') + ' </ a > ' as xml).query('for $x in / a order by $x return string($x)').value(' / ', 'varchar(max)') =                            
cast('<a>' + replace([AS_GOV_PStest13_1_2017v2].Interconnection, '\""', ' </ a >< a > ') + ' </ a > ' as xml).query('for $x in / a order by $x return string($x)').value(' / ', 'varchar(max)') ";

string cn = ConfigurationManager.ConnectionStrings["Scratchpad"].ConnectionString;
using (SqlConnection myConnection = new SqlConnection(cn))
            {
                SqlDataAdapter dataadapter = new SqlDataAdapter(sqlstring, myConnection);
            }

错误代码如下:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:XML 解析:第 1 行,字符 33,非法限定名字符

【问题讨论】:

  • 使用 SQL Server 附带的 SQL Server Management Studio (SSMS) 在 C# 中使用之前使 SQL 语句正常工作。 SSMS 中的错误信息比 c# 好很多。
  • @jdweng,这告诉我完全一样:XML parsing: line 1, character 33, illegal qualified name character
  • @wouterdejong 我刚刚找到了你的previous question,并且对你想要什么有了更好的理解。但主要问题是:为什么一列中有 CSV 数据? 这破坏了 1NF...如果您没有充分的理由这样做,您应该将其存储在真正的 XML 中,或者 - 根据您的需要 - 在相关的边表中。在一列中放置多个值是一个巨大的设计缺陷......
  • @wouterdejong:顺便说一句:如果一个元素可以存在多次,那么您将其作为排序字符串加入的想法将会中断。想象一下A"B"C 在一张桌子上,B"A"C"A 在第二张桌子上。相同的值,但 ABC 将不等于 AABC... CSV 数据往往是模糊的...
  • @wouterdejong 还有一件事要考虑:如果分隔值可以 - 任何机会 - 包括禁止字符,如 &lt;, &gt; or &amp; 或许多特殊(非纯拉丁)字符(如 This"is"fobidden &amp; ugly"don't do it)简单的 XML 拆分会崩溃...

标签: c# sql-server xml


【解决方案1】:

你的代码超级丑!

这样你就打破了几乎所有应该如何做到这一点的规则。不过你的问题还是可以回答的:空白在错误的地方

试试这个:

SELECT CAST('<a>test</a>' AS XML) --works

SELECT CAST('< a>test</a>' AS XML) --exception due to the blank in '< a>'

SELECT CAST('<a>test</ a>' AS XML) --exception due to the blank in '</ a>'

我的建议:再想一想整个事情......你真正想要达到什么目标?使用这种结构作为连接条件是一种非常错误的方法......

重新思考并提出一个新问题,您可以在其中设置一些示例数据,描述您的需求并提供预期的输出。

放置一个指向这个问题的链接 - 如果你关注 these sugggestions - SO 的舰队会冲进来并帮助你找到比这更好的解决方案......

【讨论】:

  • 我刚刚遇到了类似的问题。就我而言,我将工作 TSQL 复制/粘贴到 C# 代码中。 TSQL 包含双引号。然后粘贴完全破坏了文本。我必须在粘贴之前替换双引号 -> 双双引号,以便正确保留格式。 Visual Studio 插入了不需要的空格和换行符。
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2019-02-02
相关资源
最近更新 更多