是否可以将XML文件作为参数从C#应用程序流式传输到MS SQL存储过程,而无需将其加载到c#end的内存中?
我拥有的XML文件相当大,约600MB,有2mil条目。你可以想象,这需要大量的内存。
一旦SP on SQL在这些文件中插入/更新数据库中的值,它就没有进一步的用途,可以处理它们。
SQL示例:
CREATE PROCEDURE [dbo].[AddAllFromList]
(
@XmlData XML
)
BEGIN
Do something with @XmlData;
END;
C#示例
using (Stream XMLFileStream = new someFileInfo.OpenRead())
using (SqlConnection Connection = new SqlConnection(SQLConnectionString))
{
var opensql = Connection.OpenAsync();
SqlCommand sqlcommand = new SqlCommand("AddAllFromList", Connection)
{
CommandType = System.Data.CommandType.StoredProcedure,
CommandTimeout = 360
};
sqlcommand.Parameters.Add("@XmlData", SqlDbType.Xml).Value = XMLFileStream;
try
{
await sqlcommand.ExecuteNonQueryAsync()
}
catch
{
Console.WriteLine("Failed");
}
这样的事情会起作用吗?有没有人有成功的故事?
答案 0 :(得分:2)
如果负担如此之大,我建议分两步完成。首先将其读入临时表,然后从那里完成其余的工作。
如果文件位于SQL-Server有权访问的位置,则可以直接从T-SQL加载XML。
This question要求上传多个XML(使用CURSOR
),但您会看到该怎么做。
This question解决了导出到XML的问题,但有关文件编码的几个重要事项需要了解。
This question涵盖了一些人可能陷入的陷阱。
一般
C#在任何情况下都使用unicode(2字节编码)作为字符串。这样的字符串可以传递给SQL Server的NVARCHAR(MAX)
类型。如果XML格式正确,您可以将其直接传递给XML
类型的变量。
SQL-Server在编码方面非常有限。这些大文件通常与utf-8
一起存储。提供的链接提供了相关信息。
SQL-Server未按运行。如果它在另一台机器上运行,它将看到您看到的其他驱动器和路径。权利也可能不同。
是否使用C#加载XML并将其传递给SQL-Server,或者如果您使用来自T-SQL的某些命令,那么数据必须完全相同,必须从A传送到B. / p>
如果记忆很重要,你可能会将其分成几部分。