2016-01-08 40 views
1

我从我的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 

寻找怎么样解决问题的指导。谢谢

+0

其中我可以指定编码,因为我没有使用'XmlTextWriter' – Mou

+0

我建议你简单地省略声明(重复的答案表明这一点)。或者,您可以执行类似[this](http://stackoverflow.com/a/3862106/1320845)的操作。 –

+0

'省略声明你正在谈论哪个声明? – Mou

回答

0

XML标头中的encoding="utf-16"正在致命。如果XML头是必需的,你可以摆脱编码?

MSDN的完整法律文件是here;重点在于XML文档中的编码必须与包含XML文档的字符串的编码相匹配。

+0

我只想知道我需要在我的C#代码中更改哪一行来将utf-16更改为utf-8?请参阅我的代码,并尽可能使用纠正版本。 – Mou

+0

看到这贴子:(http://stackoverflow.com/questions/1738511/easier-way-to-serialize-c-sharp-class-as-xml-text)。 –