گاهی اوقات برای کار با 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>
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود