将US-ASCII导入SQL Server

时间:2015-04-08 20:39:34

标签: c# .net sql-server xml c#-4.0

我正在尝试创建一个数据库,该数据库将充当正在生成的系列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的字符串来修改字符串,那么它就可以了。但最好不要在数据库中修改源。

1 个答案:

答案 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的子集,您不会遇到任何问题。