PDA

View Full Version : سوال: چگونگی ارسال یک Generic List به Stored Procedure



hamide_kh
دوشنبه 30 فروردین 1389, 16:41 عصر
با عرض سلام خدمت دوستان
من در برنامه ام یک List<T> دارم که اطلاعاتی در اون ذخیره میشه
من می خوام تمام فیلدهاو سطور این لیست را در دیتا بیس ذخیره کنم،
برای این کار کد زیر را نوشتم


conn.open();
cmd2.Connection = conn;
cmd2.CommandText = "SpInsertFactorItems";
cmd2.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < Class1.khar.Count; i++)
{
cmd2.Parameters.Clear();
cmd2.Parameters.Add("@Code_Kala", SqlDbType.Int).Value = Class2.LList_Kharid[i].;
cmd2.Parameters.Add("@Name_Kala", SqlDbType.NVarChar, 30).Value = Class2.LList_Kharid[i].;
cmd2.Parameters.Add("@Tedad", SqlDbType.Int).Value = Class2.LList_Kharid[i].;
cmd2.Parameters.Add("@Fi", SqlDbType.Int).Value = Class2.LList_Kharid[i].;
cmd2.Parameters.Add("@Gheymat", SqlDbType.Int).Value = Class2.LList_Kharid[i].;
cmd2.ExecuteNonQuery();
}

با این روش اطلاعات ذخیره میشه،
اما فقط یکم دل می زنم چون این برنامه با asp.net هست در زمانی که سایت را آپلود کنم اگه بخواد به ازای هر سطر در لیست یکبار با sql ارتباط بر قرار کنه که فکر کنم توی سرعت تاثیر داره و خیلی طول می کشه که تمام لیست در دیتا بیس ذخیره بشه؟
آیا راهی وجود داره که بشه تمام لیست را یکباره به صورت آرایه ای به دیتابیس و sp بفرستم؟

mehdi.mousavi
سه شنبه 31 فروردین 1389, 15:34 عصر
با عرض سلام آیا راهی وجود داره که بشه تمام لیست را یکباره به صورت آرایه ای به دیتابیس و sp بفرستم؟

سلام.
البته که این کار میسر هستش. کافیه تا لیست مورد نظر رو بصورت XML یکبار Serialize کنید، و اونو به Stored Procedure خودتون ارسال کنید. سپس داخل SP، میتونید با استفاده از OpenXml یا دیگر دستوراتی که برای اینکار در نظر گرفته شده، XML مزبور رو بخونید و اونو یکباره در جدول خودتون Insert کنید.

برای اطلاعات بیشتر به این سایت (http://weblogs.sqlteam.com/travisl/archive/2005/01/04/3931.aspx) رجوع کنید.

موفق باشید.

hamide_kh
سه شنبه 31 فروردین 1389, 20:21 عصر
با عرض سلام و احترام خدمت شما آقای موسوی

البته که این کار میسر هستش. کافیه تا لیست مورد نظر رو بصورت XML یکبار Serialize کنید، و اونو به Stored Procedure خودتون ارسال کنید. سپس داخل SP، میتونید با استفاده از OpenXml یا دیگر دستوراتی که برای اینکار در نظر گرفته شده، XML مزبور رو بخونید و اونو یکباره در جدول خودتون Insert کنید.
من اصلا با دستورات xml کار نکرده ام و اون رفرنسی را هم که گذاشتید با vb بود واصلا متوجه نشدم چیکار کرده؟
آیا باید یک فایل xml در کنار برنامه بسازم؟
اگه ممکنه یکم بیشتر توضیح بدید؟
تشکر فراوان از شما

hamide_kh
سه شنبه 31 فروردین 1389, 21:32 عصر
با سلامی دوباره
این نمونه کد را هم پیدا کردم اما واقعیتش هیچ چیز ازش نفهمیدم اگه ممکنه روی این تکه کد توضیح بدید(البته بی زحمت)

public List<ImportJobMaterialsResult> ImportJobMaterials(int jobID, Stream stream, string coNumber, string coDesc, string xmlMapFile)
{
//Convert flat file to List<JobMaterialImport> using converter and XML mapping file
//Mapping file passed from FlatFileHandler.ashx in web project
FlatFileToObjectConverter<JobMaterialImport> converter = new FlatFileToObjectConverter<JobMaterialImport>(stream, xmlMapFile);
List<JobMaterialImport> imports = converter.ConvertToList();
imports = imports.Take(imports.Count - 2).ToList(); //last rows are bogus in flat-file

//Generate XML and pass to sproc
using (StringWriter sw = new StringWriter())
{
XmlSerializer xs = new XmlSerializer(typeof(List<JobMaterialImport>));
xs.Serialize(sw, imports);
try
{
//Pass materials into sproc
string xml = sw.ToString().Replace("utf-16", "utf-8");
return this.DataContext.ImportJobMaterials(xml, jobID, coNumber, coDesc).ToList();
}
catch (Exception exp)
{
Logger.Log("Error in JobManagementRepository.ImportJobMaterials", exp);
}
}
return null;
}
و

<ArrayOfJobMaterialImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<JobMaterialImport>
<Area>BUILDING A</Area>
<Phase>LIGHTING</Phase>
<WorkCode>0</WorkCode>
<WorkCodeTitle>Manually Assigned</WorkCodeTitle>
<Description>4x1 1/2in. SQ BOX COMB KO</Description>
<Quantity>2</Quantity>
<TotalHours>10.46</TotalHours>
</JobMaterialImport>
<JobMaterialImport>
<Area>BUILDING A</Area>
<Phase>LIGHTING</Phase>
<WorkCode>0</WorkCode>
<WorkCodeTitle>Manually Assigned</WorkCodeTitle>
<Description>#8x 3/4 P/H SELF-TAP SCREW</Description>
<Quantity>4</Quantity>
<TotalHours>0.28</TotalHours>
</JobMaterialImport>
<JobMaterialImport>
<Area>BUILDING A</Area>
<Phase>LIGHTING</Phase>
<WorkCode>605</WorkCode>
<WorkCodeTitle>Wiring and System Devices</WorkCodeTitle>
<Description>1G TGL SWITCH PLATE - PLASTIC IVY</Description>
<Quantity>2</Quantity>
<TotalHours>0.89</TotalHours>
</JobMaterialImport>
</ArrayOfJobMaterialImport>
و این هم پروسیجر

CREATE PROCEDURE [ImportJobMaterials]
@JobMaterialsXml AS VARCHAR(MAX),
@JobID AS INT,
@ChangeOrderNumber AS VARCHAR(10) = NULL,
@ChangeOrderDescription AS VARCHAR(100) = NULL
AS
BEGIN
DECLARE @XML AS XML

DECLARE @MaterialsTable TABLE
(
ID INT IDENTITY(1,1),
Area VARCHAR(250),
Phase VARCHAR(250),
WorkCodeID INT,
WorkCodeTitle VARCHAR(250),
MaterialTitle VARCHAR(250),
Quantity DECIMAL(18,2),
TotalHours DECIMAL(18,2)
)

SELECT @XML = @JobMaterialsXml

INSERT INTO @MaterialsTable (Area, Phase, WorkCodeID, WorkCodeTitle, MaterialTitle, Quantity, TotalHours)
SELECT M.Item.query('./Area').value('.','VARCHAR(250)') Area,
M.Item.query('./Phase').value('.','VARCHAR(250)') WorkCode,
M.Item.query('./WorkCodeID').value('.','INT') WorkCodeID,
M.Item.query('./WorkCodeTitle').value('.','VARCHAR(250)') WorkCodeTitle,
M.Item.query('./MaterialTitle').value('.','VARCHAR(250)') MaterialTitle,
M.Item.query('./Quantity').value('.','DECIMAL(18,2)') Quantity,
M.Item.query('./TotalHours').value('.','DECIMAL(18,2)') TotalHours
FROM @XML.nodes('/ArrayOfJobMaterialImport/JobMaterialImport') AS M(Item)

--Process the data
END


تشکر

nPad.Net
چهارشنبه 01 اردیبهشت 1389, 02:01 صبح
من اصلا با دستورات xml کار نکرده ام و اون رفرنسی را هم که گذاشتید با vb بود واصلا متوجه نشدم چیکار کرده؟
آیا باید یک فایل xml در کنار برنامه بسازم؟
اگه ممکنه یکم بیشتر توضیح بدید؟


سلام

اگه نمی خواید با XML کار کنید، بد نیست یه نگاه به این مقاله (http://www.30sharp.com/ShowArticle.aspx?nid=13&did=169&AuthorID=1) بندازید.

موفق باشید

hamide_kh
چهارشنبه 01 اردیبهشت 1389, 19:35 عصر
با عرض سلام خدمت شما
این نمونه از sql 2008 استفاده کرده،اگه ممکنه من با 2005 کار می کنم

hamide_kh
شنبه 11 اردیبهشت 1389, 12:49 عصر
سلام دوستان و بالاخص آقای موسوی کمکم نمی کنید

nPad.Net
پنج شنبه 16 اردیبهشت 1389, 02:11 صبح
پروژه ای که تو این تاپیک (http://barnamenevis.org/forum/showthread.php?t=50594&page=17)هست رو دانلود کنید(نسخه 7.1) قسمت حذف به صورت گروهی انجام شده تابعی درDB تحت نام iter_charlist_to_tbl هست که فکر میکنم کمک زیادی بهتون میکنه!
خروجی این تابع یه جدوله ، خیلی راحت میتونید با یه دستور insert کل جدول رو وارد DBکنید.
موفق باشید