我在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中项目的样子:
下图显示了发布配置文件配置
答案 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是 - 无论如何! - 引擎NVARCHAR
和C#
在任何情况下都使用unicode
作为字符串。在任何地方,这都在变化之中。
可能会将SP OUTPUT
的{{1}}声明为usp_MyProc
...