【发布时间】: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("&", "&");
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