将大型xml文件插入xml列的最佳方法(在远程SQL Server上)

Bog*_*anB 15 c# xml sql-server insert stream

假设我有一个这样的表:

CREATE TABLE [dbo].[TBL_XML]
(
   [XmlFileID]       [BIGINT] IDENTITY (1, 1) NOT NULL,
   [FileName]        [NVARCHAR](500) NULL,   
   [XmlData]         [XML] NULL,
   [DateCreated]     [DATETIME] NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

我目前用来填充表格的方法是这样的:

using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = @"INSERT INTO [dbo].[TBL_XML] 
                                    ( [XmlData] , 
                                    [FileName] , 
                                    [DateCreated]
                                    ) 
                        VALUES (@XMLData, @FileName, GETDATE())";

    using (var xmlReader = new XmlTextReader(new FileStream(item.XmlFileName, FileMode.Open)))
    {
        cmd.Parameters.Add("@FileName", SqlDbType.NVarChar, 500).Value = System.IO.Path.GetFileName(item.XmlFileName);
        cmd.Parameters.Add(
        new SqlParameter("@XMLData", SqlDbType.Xml)
        {
            Value = new SqlXml(xmlReader)
        });

        SetConnectionParameters(cmd);

        cmd.ExecuteScalar());
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不适用于非常大的XML,因为整个文件都加载到内存中,我得到了OutOfMemory异常.

从运行在与服务器不同的机器上的.net应用程序中将大(> 100MB)XML文件插入XMLData列的最佳方法是什么?

批量插入是不可能的,因为SQL服务器将无法访问我的XML文件.

Tho*_*ser 0

将 XML 加载到数据库中的最佳方法是不将 XML 加载到数据库中。如果您确实需要这样做(而且您可能不需要),您应该考虑使用像 Cassandra 或 Mongo 这样的 noSQL 解决方案。

如果“需要”存储 XML,那么您很可能在其他地方做出了错误的架构选择。考虑是否有更好的方法来表示信息。XML 是一种交换格式,不是长期保存信息的好格式。

话虽如此,您可以使用支持流媒体的 BCP 或 OLEDB 接口。这是一个示例: 批量导入示例

  • 这根本没有回答问题。 (3认同)