当作为SQL Server中XML元素的一部分返回时,希腊字符会被破坏

时间:2018-04-05 09:09:07

标签: c# sql-server xml linq

我在SQL Server中编写了一个存储过程,它使用以下代码返回XML:

DECLARE @error1 XML, @error2 XML

SET @error1 = 
(
    SELECT 1 AS '@Code', 
           CAST(Ν'My message in Greek' AS NVARCHAR(MAX)) COLLATE Greek_CI_AS AS '@Message'
    WHERE NOT EXISTS (SELECT 1 FROM #Employee)  
    FOR XML PATH ('Error')
)

SET @error2 = 
(
   ... Similar query here
)

IF (@error1 IS NOT NULL) OR (@error2 IS NOT NULL) 
BEGIN
      SELECT @error1, @error2
      FOR XML PATH('Errors'))
   RETURN
END

我在客户端使用以下代码来阅读消息:

XElement xe = null;
using (SqlCommand cmdSelect = new SqlCommand("usp_MyProc", connection))
{
   cmdSelect.CommandType = CommandType.StoredProcedure;
   using (XmlReader xmlReader = cmdSelect.ExecuteXmlReader())
   {
      xe = XElement.Load(xmlReader);
   }
}

if (xe != null)
{
    lblResults.Text = xe.Descendants("Error")
                        .Where(x => (int)x.Attribute("Code") == 1)
                        .FirstOrDefault()
                        .Attribute("Message")
                        .Value;
}

不幸的是,lblResults.Text设置为'��� ???????? ????'。关于问题的原因是什么以及如何解决的任何想法?

修改:

我设法找到了错误的来源。我的proc包含在我在Visual Studio中创建的“SQL Server数据库项目”中。项目发布到SQL Server时会导致此问题。存储过程中的任何硬编码希腊字符在上传到服务器时都会损坏。

这是Visual Studio中项目的样子:

enter image description here

下图显示了发布配置文件配置

enter image description here

1 个答案:

答案 0 :(得分:1)

N放在你的文字之前可能就足够了:

CAST(N'My message in Greek' AS NVARCHAR(MAX)) COLLATE Greek_CI_AS 

试试这个:

SELECT  'αλφάβητο' WithoutTheN
      ,N'αλφάβητο' WithN

根据COLLATION,第一个表达式将返回更多或更少脏:使用我的默认值

a?f?ß?t?    αλφάβητο 

更新

OP中的最后一次编辑确实添加了N

但是 - 如果没有其他相关内容 - 我没有看到任何其他原因,为什么这应该出错。 XML是 - 无论如何! - 引擎NVARCHARC#在任何情况下都使用unicode作为字符串。在任何地方,这都在变化之中。

可能会将SP OUTPUT的{​​{1}}声明为usp_MyProc ...