【问题标题】:Unable to switch the encoding [duplicate]无法切换编码[重复]
【发布时间】:2016-01-08 14:18:21
【问题描述】:

我正在从我的 C# 应用程序生成一个 xml,然后将其发送到 SQL Server 存储过程。当存储过程解析xml时,它会抛出错误

XML解析:第1行,字符39,无法切换编码

这就是我生成 XML 的方式。该函数是一个扩展函数。

public static string ToXml<T>(this T obj, string rootName)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(rootName));

    var xmlNs = new XmlSerializerNamespaces();
    xmlNs.Add(string.Empty, string.Empty);

    using (StringWriter sw = new StringWriter())
    {
        serializer.Serialize(sw, obj, xmlNs);
        return sw.ToString();
    }
}

存储过程如下所示:

/*
        SET @Data = '<?xml version="1.0" encoding="utf-16"?>
                    <Students>
                      <Student>
                        <ID>2</ID>
                        <FirstName>Soument</FirstName>
                        <LastName>Sen</LastName>
                        <IsActive>true</IsActive>
                        <StateID>2</StateID>
                        <StateName>Bihar</StateName>
                        <CityID>4</CityID>
                        <CityName>DharBganga</CityName>
                      </Student>
                    </Students>'  

*/
CREATE PROCEDURE [dbo].USP_SaveStudent
(
        @Data               xml,
        @PageNbr            INT = 1,
        @PageSize           INT = 10,
        @SortColumn         NVARCHAR(20) = 'ID',
        @SortOrder          NVARCHAR(4)= 'ASC'  
)
AS
BEGIN TRY
    MERGE INTO Student as Trg  
    USING (SELECT
               d.x.value('id[1]', 'varchar(MAX)') as ID,
               d.x.value('FirstName[1]', 'varchar(MAX)') as FirstName ,  
               d.x.value('LastName[1]', 'varchar(MAX)') as LastName,
               d.x.value('StateID[1]','int') as StateID,
               d.x.value('CityID[1]','int') as CityID,
               d.x.value('IsActive[1]','bit') as IsActive
           FROM
               @Data.nodes('/Students/Student') as  d(x)) AS Src ON Trg.ID = Src.ID  

    WHEN MATCHED THEN
        UPDATE 
            SET Trg.FirstName = Src.FirstName,  
                Trg.LastName = Src.LastName,
                Trg.StateID = Src.StateID,
                Trg.CityID = Src.CityID,
                Trg.IsActive = Src.IsActive

    WHEN NOT MATCHED BY TARGET THEN
        INSERT (FirstName, LastName, StateID, CityID, IsActive) 
        VALUES(Src.FirstName, Src.LastName, Src.StateID, Src.CityID, Src.IsActive);   
END TRY
BEGIN CATCH
    -- Insert Error into table
    --INSERT INTO #error_log(message)
    --VALUES (ERROR_MESSAGE());
END CATCH

EXEC USP_GetStudentData @PageNbr, @PageSize, @SortColumn, @SortOrder

寻求解决方法等指导。谢谢

【问题讨论】:

  • 我可以在哪里指定编码,因为我没有使用XmlTextWriter
  • 我建议你简单地省略声明(副本有一个答案表明这一点)。或者,您可以执行 this 之类的操作。
  • omit the declaration你说的是哪个声明?
  • XML 声明。我提到的答案是this one
  • 抱歉请求....你能发布一些代码吗?我只是不明白在我的代码中要省略什么。谢谢

标签: c# sql-server xml


【解决方案1】:

XML 标头中的encoding="utf-16" 让你丧命。如果需要xml头,可以去掉编码吗?

来自 MSDN 的完整法律术语是 here;关键是 XML 文档中的编码必须与包含 XML 文档的字符串的编码相匹配。

【讨论】:

  • 我只是想知道我需要在 C# 代码中更改哪一行才能将 utf-16 更改为 utf-8 ?如果可能,请查看我的代码并提供修正版本。
猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多