我正在尝试创建一个数据库,该数据库将充当正在生成的系列XML文件的存储库。
在我的SQL Server数据库中,我有一个类似于以下的表来存储XML文件:
CREATE TABLE [dbo].[MyTable]
(
[InternalID] INT NOT NULL IDENTITY,
[ExternalID] INT NOT NULL,
[XmlData] XML NOT NULL
)
每个XML文件都使用以下标头以US-ASCII编码:
<?xml version="1.0" encoding="us-ascii"?>
我已经创建了一个存储过程来将文件插入到表中,并且我使用以下命令使用.NET:
int externalKey = someint;
string myXML = File.ReadAllText(xmlFilePath);
using (SqlCommand myCommand = new SqlCommand ("My_Stored_Proc", myConnection)) {
myCommand.CommandType = SqlCommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter ("@ExternalID", externalID));
myCommand.Parameters.Add(new SqlParameter ("@XmlData", myXML));
myCommand.ExecuteNonQuery();
}
当我的代码尝试运行时,在尝试执行非查询时会遇到以下SqlException
:
XML解析:第1行,第41个字符,无法切换编码
如果我在执行之前通过将encoding="us-ascii"
替换为使用UTF-8的字符串来修改字符串,那么它就可以了。但最好不要在数据库中修改源。
答案 0 :(得分:2)
这是不可能的。请参阅文章&#34; xml数据类型的限制&#34;:https://technet.microsoft.com/en-us/library/ms187107%28v=sql.90%29.aspx?f=255&MSPPError=-2147217396
XML提供自己的编码。排序规则仅适用于字符串类型。 xml数据类型不是字符串类型。但是,它确实具有字符串表示形式,并允许在字符串数据类型之间进行转换。
和(强调我的):
如果将XML作为字符串文字复制并粘贴到SQL Server Management Studio的“查询编辑器”窗口中,则可能会遇到[N] VARCHAR字符串编码不兼容问题。这取决于XML实例的编码。 在许多情况下,您可能希望删除XML声明。
在读取XML文件时,只需删除<?xml ?>
前奏并直接插入即可。鉴于ASCII是UTF-8的子集,您不会遇到任何问题。