我正在尝试插入XML列(SQL SERVER 2008 R2),但服务器抱怨:
System.Data.SqlClient.SqlException(0x80131904):
XML解析:第1行,第39个字符,无法切换编码
我发现XML列必须是UTF-16才能使插入成功.
我正在使用的代码是:
XmlSerializer serializer = new XmlSerializer(typeof(MyMessage));
StringWriter str = new StringWriter();
serializer.Serialize(str, message);
string messageToLog = str.ToString();
Run Code Online (Sandbox Code Playgroud)
如何将对象序列化为UTF-8字符串?
编辑:好的,抱歉混淆 - 字符串需要是UTF-8.你是对的 - 默认情况下它是UTF-16,如果我尝试以UTF-8插入它就会通过.所以问题是如何序列化为UTF-8.
例
这会在尝试插入SQL Server时导致错误:
<?xml version="1.0" encoding="utf-16"?>
<MyMessage>Teno</MyMessage>
Run Code Online (Sandbox Code Playgroud)
这不是:
<?xml version="1.0" encoding="utf-8"?>
<MyMessage>Teno</MyMessage>
Run Code Online (Sandbox Code Playgroud)
更新
我想出当SQL Server 2008的Xml列类型需要utf-8时,以及当encoding你尝试插入xml规范的属性中的utf-16时:
如果要添加utf-8,请将参数添加到SQL命令,如下所示:
sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
Run Code Online (Sandbox Code Playgroud)
如果您尝试encoding=utf-16在上一行中添加xmlValueToAdd,则会在插入中产生错误.此外,VarChar意味着国家字符不被识别(它们变成问号).
要将utf-16添加到db,请使用SqlDbType.NVarChar或SqlDbType.Xml在前面的示例中,或者根本不指定type:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));
Run Code Online (Sandbox Code Playgroud) 我一直在与这个争夺几天,我正在寻求使用以下语法自动化XML输出
SELECT (
SELECT CONVERT(VARCHAR(10),GETDATE(),103)
FOR XML PATH('DataVersion'),
TYPE
),
(
SELECT CoNum,
CoName,
CONVERT(VARCHAR(10),AccountToDate,103) 'DLA',
LAFileNet
FROM @XMLOutput
FOR XML PATH('Company'),
TYPE
)
FOR XML PATH(''),
ROOT('Companies')
Run Code Online (Sandbox Code Playgroud)
这会创建以下输出
<Companies>
<DataVersion>15/11/2010</DataVersion>
<Company>
<CoNum>111</CoNum>
<CoName>ABCLmt</CoName>
<DLA>12/12/2010</DLA>
<LAFileNet>1234</LAFileNet>
</Company>
<Company>
<CoNum>222</CoNum>
<CoName>DEFLmt</CoName>
<DLA>12/12/2007</DLA>
<LAFileNet>5678</LAFileNet>
</Company>
</Companies>
Run Code Online (Sandbox Code Playgroud)
我正在努力的是如何将XML声明添加<?xml version="1.0" encoding="ISO-8859-1" ?>到输出的顶部?
更新1:我认为我需要在SQL服务器中创建XML模式来定义xsl:output是否正确?然后将输出分配给该架构?
更新2:此后发现这些链接 http://forums.asp.net/t/1455808.aspx - 查看健康的评论.另外 http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx
我在使用.NET Framework 4.5的C#项目中使用Entity Framework 6.0.0版.我有一个Filing具有SQL Server列的类,该列XmlContent是xml数据类型.我有数据库优先实体框架我主要用于将行保存到Filing表中(我目前不读回那些行,如果这有所不同)
我已经阅读了这些关于使用Entity Framework保存到XML列的"字符串"支持属性的帖子,如此处和此处所述
我的XML声明看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
....
Run Code Online (Sandbox Code Playgroud)
我的实体框架自动生成(数据库优先)如下所示:
public partial class Filing
{
// ...
public string XmlContent { get; set; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用我的自定义分部类(保存到字符串属性...):
public partial class Filing
{
[NotMapped]
public XmlDocument XmlDocument
{
get
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(this.XmlContent);
return xmlDocument;
}
set
{
this.XmlContent = value.OuterXml;
}
}
// ...
} …Run Code Online (Sandbox Code Playgroud) 我现在已经挣扎了将近一周,仍然没有找到任何解决方案 - .-
我的目标是通过查询"FOR XML"语句从SQL Server接收XML,将此XML作为字符串/流转发到XSLT Transformer并将结果显示为HTML.
关于它的糟糕之处是我应该使用的Web服务器环境:IBM Domino 8.5.2,它通常使用Lotus Script和Lotus Notes数据库来生成网站.
但是现在Notes数据库的性能已经走到了死胡同,在谈论大型数据库时,比如我们的网站点击统计数据,这些数据库将数百万次点击存储为数据集.因此,我们决定迁移到mssql2008服务器,该服务器可以更快地提供自定义筛选结果.
我确实设法建立与SQL Server的连接,提交查询并将结果作为xml.但现在?:)似乎SQL Server提供了他的"for xml" - 结果作为一种自己奇怪的二进制编码字符数据类型,在打印它们或保存到文件时没有任何意义.Lotus Script(几乎是VBScript)似乎没有办法处理这个xml数据类型.
我尝试了各种方法,我可以找到结果 - Lotus构建在ODBC类,LCConnection通过OleDB,ADO连接通过OleDB ......但每次尝试都以一堆不可读的数据结束.
我可以想象多米诺骨牌和SQL Server之间的网络服务,将数据准备为我的多米诺骨牌脚本的字符串,但这是我想避免的不必要的开销.
你能在sql语句中告诉你想要生成的xml是什么数据类型吗?就像对于字段的cast()/ convert()而言,对于整个xml结果?这样我就可以将结果作为text/varchar字段读取?
谢谢,克里斯
努力编写可以在 XML 中生成嵌套元素的查询。谁能帮忙
输入:
SELECT EmpName AS [Name],
EmpDOB AS [Birthdate],
EmpSalary AS [WageAmount],
Add1 AS [Address1],
Add2 AS [Address2],
Mobile AS [Mobile]
FROM Employee
FOR XML PATH
Run Code Online (Sandbox Code Playgroud)
输出:(这有附加信息作为嵌套元素)
<Employee>
<Name>Conrad</Name>
<Birthdate>14-oct-76</BirthDate>
<WageAmount>10000</WageAmount>
<AdditionalInfo>
<Address1>Washington DC</Address1>
<Address2>DC</Address2>
<Mobile>989898989</Mobile>
</AdditionalInfo>
</Employee>
Run Code Online (Sandbox Code Playgroud)