آموزش ارسال لیست به StoredProcedure با XML به زبان ساده

گاهی اوقات برای کار با SP-Stored Procedure ها لازم است که یک List که تعداد مقادی آن می تواند متغیر باشد را به صورت یک پارامتر به یک SP بفرستیم. برای این کار راه حل های متفاوتی وجود دارد مانند استفاده از DataTable یا استفاده از متغیرهایی از نوع بایت یا همون image و حتی استفاده از متغیر های رشته ای. اما یکی از روشهای مناسب و اصولی برای این کار استفاده از XML هست. که گاهی اوقات از بک زبان برنامه نویسی مثل C# انجام می شه که در اینجا استفاده از این روش توضیح داده خواهد شد.ابتدا بصورت کلی نگاهی به یک کد نمونه برای این کار می اندازیم:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

کد 1- نمونه SP هستش که قراره یک XML به اون ارسال بشه و مقدار های موجود در XML داخل یک جدول به نام TestTable درج بشه.

CREATE PROCEDURE [dbo].[InsertData]
(
    @XMLData XML
)
AS
BEGIN

	DECLARE @handle INT

	EXEC sp_xml_preparedocument @handle OUTPUT, @XMLData

	INSERT INTO
		TestTable (id)
	SELECT * FROM OPENXML (@handle, '/ArrayOfInt/int') WITH (id INT '.') 
		
	EXEC sp_xml_removedocument @handle
END

کد 2-همچنین کد زیر هم در C# استفاده میشه تا چند مقدار رو از طریق SP بالا درج کنه.

var valuesList = new List<int> {1, 5, 8};

var xmlSerialize = new XmlSerializer(typeof(List<int>));
var memoryStream = new MemoryStream();
                
xmlSerialize.Serialize(memoryStream, valuesList);

var resultXml = Encoding.UTF8.GetString(memoryStream.ToArray());
context.Database.ExecuteSqlCommand("EXEC [dbo].[InsertData] '" + resultXml + "'");

در کد 1 ابتدا یک پارامتر از نوع XML تعریف می کنیم سپس با استفاده از spxmlpreparedocument (توضیحات) پارمتر ورودی را در حافظه مقیم می کنیم تا از طریق handle به محتوای XML دسترسی داشته باشیم. در خط بعد هم از دستور Insert برای درج اطلاعات استفاده می کنیم . OPENXML (توضیحات) هم محتوای XML رو با استفاده از handle که آدرس سند XML می باشد واکشی می کنه. پارامتر دومی هم که در OPENXML می بینید مشخص می کنه که در محتوای XML ما نود ها-Node با چه نامی درج شده اند.در آخر هم با دستور spxmlremovedocument محتوای XML از حافظه آزاد می شود.در کد 2 با استفاده از کلاس XmlSerializer لیست انتخابی رو به XML تبدیل می کنیم و در memoryStream قرار میدیم و در آخر با استفاده از یک نمونه dbContext در ENtityFrameWork با توجه به پارامتر ، SP مورد نظر رو اجرا می کنیم. نمونه کد XML که در کد2 و متغیر resultXml تولید میشه بصورت زیر می باشد:

<?xml version="1.0"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <int>1</int>
  <int>5</int>
  <int>8</int>
</ArrayOfInt>

موفق باشید


نظرات