【问题标题】:How to up load xml string to sql server如何将xml字符串上传到sql server
【发布时间】:2013-05-12 13:14:42
【问题描述】:

我这几天一直在努力寻找这个问题的答案,但似乎无法得到答案。

我有一个从 Web 服务获得的 xml 字符串,我需要将其存储在我的 sql server 2012 中。

xml 字符串可以大到 100k。

我有下表

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TempXML](
[id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
[MyXML] [varbinary](max) NOT NULL,
CONSTRAINT [PK_TempXML] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,         ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[TempXML] ADD  CONSTRAINT [DF_TempXML_id]  DEFAULT (newid()) FOR [id]
GO

还有下面的存储过程

CREATE PROCEDURE [dbo].[InsertXML] 
(   @xml xml)

AS  
BEGIN

SET NOCOUNT ON;
Insert into TempXML
values(NEWID(), @xml)
END 

当我调用存储过程时,如果数据大小大于 43752 个字符,它会删除数据并仅安装 id。

另一方面,如果该字段设置为 nvarchar(max),则在删除整个字符串之前我可以加载的最大值为 65535 个字符

我正在从 c# 方法调用存储过程

internal static void InsertTempMovie(string xml)
{

{
        xmlSouce = xmlSouce.Replace("&", "&amp");
        xmlSouce = xmlSouce.Replace("'", "'");
        xmlSouce = xmlSouce.Replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<?xml version=\"1.0\" encoding=\"UTF-16\"?>");


        string xmlSouceEncoded = HttpUtility.HtmlDecode(xmlSouce);

        LinQTestDataContext dbTempXML = new LinQTestDataContext();
        dbTempXML .ExecuteCommand("exec InsertTempXML @xml={0}",xmlSouceEncoded);
    }
}

但是,即使我直接从 sql server 2012 management studio 调用,我也会得到相同的结果

关于我可以上传整个字符串而不被丢弃的任何想法

提前谢谢你

【问题讨论】:

  • 如果您的数据是XML 而您的参数是XML - 为什么要将数据存储为Varbinary?完全没有意义.... XML 数据 not 二进制数据 - 在这里似乎是一个非常糟糕的表结构选择.....
  • 仅使用基本的 ADO.NET,我可以轻松将 450-550K XML 文档插入到数据库表的 XML 列中。一定有其他原因导致这些问题....
  • 如何您访问 SQL Server 数据库?您使用的是 Linq-to-SQL 还是实体框架?哪个版本?
  • 好吧,我关于 varbinary 的错误我一直在努力让这个东西正常工作,却忘记在编写脚本之前将字段改回来,然后发布它的好电话,我很抱歉
  • 从上面的代码可以看出我使用Linq访问我的sql server

标签: xml sql-server-2012 visual-studio-2010


【解决方案1】:

我的第一个建议是:因为您有 XML 数据并且想要存储它 - 将其存储为 XML!为什么要转换成varbinary? XML 不是二进制数据...

所以将表定义更改为:

CREATE TABLE [dbo].[TempXML]
(
    [id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [MyXML] [XML] NOT NULL,

    CONSTRAINT [PK_TempXML] 
    PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

接下来,您可以使用纯 ADO.NET 将这些 XML 文件插入到您的数据库中 - 如下所示:

// define connection and command in using blocks to ensure proper disposal
using(SqlConnection conn = new SqlConnection(yourConnectionString))
using (SqlCommand cmdInsert = new SqlCommand("dbo.InsertXML", conn))
{
    cmdInsert.CommandType = CommandType.StoredProcedure;

    // define your parameters
    cmdInsert.Parameters.Add("@xml", SqlDbType.Xml, int.MaxValue);

    // set the parameter values
    string xmlContents = File.ReadAllText(@"...path to your XML file here.....");
    cmdInsert.Parameters["@xml"].Value = xmlContents;

    // open connection, execute command, close connection
    conn.Open();
    int affected = cmdInsert.ExecuteNonQuery();
    conn.Close();
 }

或者,如果您正在使用 Linq-to-SQL,则将您正在使用的存储过程导入到您的 Linq-to-SQL 数据上下文模型中,然后只需在您的 DataContext 类上调用该存储过程型号:

// use your DataContext class here - in a using block
using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    // load your XML document from a file
    XDocument doc = XDocument.Load(@"....path to your XML file here.....");

    // call the stored procedure that's defined on your DataContext class
    ctx.ProcInsertXML(doc.Root);
}

两种方式,我都能够毫无问题地将非常大的 XML(500 KB - 2.5 MB)插入 SQL Server。

【讨论】:

  • 它不是文件!它是一个字符串,请参阅我在上面调用我的 sproc 的方法这不是问题......我可以上传的字符数量的限制是......
  • 使用 XDocument doc = XDocument.Load(xmlString) 我收到错误“无效的 URI:Uri 字符串太长。”
  • @user662673:如果是 XML 字符串,则需要使用 XDocument doc = XDocument.Parse(-your-XML-string-here); 代替; Load 方法需要一个 文件名 - 不是整个 XML 字符串 ....
  • 对不起,我有点傻我用 XDocument.Parse 纠正了我的错误,但我仍然得到相同的结果......数据库中的 xml 列中没有任何内容
  • 我刚刚注意到,我检查 xml 列的填充方式是从表上的子菜单中从最初选择的前 200 名中直观地查看该列。但是,这什么也没显示。但是如果我从我的表中选择 xml 会显示一个指向数据的链接...是的...如果这个 Usless MS 功能将由 MS OK 宣布就好了,因为所有看起来都像是排序的感谢非常感谢marc_s
猜你喜欢
  • 2021-12-02
  • 2023-04-06
  • 1970-01-01
  • 2011-03-18
  • 2021-03-03
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多