الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة إستغراق الوقت في حدث Fill

مغلق
بدأه albahr في 28 نوفمبر 2006 · 24 رد · 3,662 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عندي مشكلة يا شباب هي عندما أقوم بعمل زر لتحميل البيانات في البرنامج بحث يكون في قاعدة البيانات ما يقارب 10000 صف يحتاج في جهازي الى 5 ثواني تقريبا حيث جهازي مواصفاته عالية بعض الشي فكيف يكون في أجهزة أخرى التي تكون ضعيفة المواصفات فسيعمل البرنامج ستك (توقف) ويغضب المستخدم على غبائي في البرمجة فكيف الحل ، حيث عندي مئات الملفات بهذه المواصفات ، كذك في حالة البحث بحث يقوم المستخدم بالبحث عن كلمة في عدة قواعد بيانات في نفس الوقت بحيث يعرض البرنامج الصف الذي وجده ويقوم المستخدم بالتنقل بين الصفوف المستخرجة فأرجو إيجاد حل ،،،،،

وعذرا على ركاكة شرح المشكلة ،،،، -waf

#2

عشرة قراء ولا رد ،،،،،،،،

#3

أرغب أن يكون الحل على الفجوال بيسك 2005 دونت نت ،،، أنا أنتطر يا إخواني

#4

أولاً: هذا منتدى و ليس ساحة شات. لا تتوقع أن يتم الإجابة على سؤالك خلال بضعة دقائق أو حتى ساعات. ثم أنه ليس كل من قرأ الموضوع مجبر أو قادر على الإجابة. الصبر يا أخي. الصبر.

تعليقاً على سؤالك: لماذا تقوم بإخراج الـ10000 كلها دفعة واحدة؟ هل ستقوم بعمليات عليها كلها؟ أو تظهرها كلها في نفس الوقت؟

إذا كانت الإجابة على السؤالين كلا قم فقط بسحب البيانات التي تحتاجها فقط. لا داعي لسحب محتويات الداتابيس كلها.

#5

السلام عليكم

مثل ما قال الاخ الكريم System Down لا داعي لجلب كل البيانات و إنما أجعل عملية الجلب تعتمد

على عملية البحث ( اي اجلب ما تم البحث عنه فقط )

لكن للتنويه فقط إذا كان الجدول ذوي حقول كثيرة, فلربما تراجع تصميم ذلك الجدول من جديد..

والتدارك في بادئ الامر ولو بتعب قليل , أفضل بكثير عن مرارة تجرع علقم الحسرة و الندم الشديد عند الانتهاء من المشروع.

والله الموفق.

في المثال يتضح المقال

#6

ا اخي جرب استخدم الThreads فهي تفيدك طبعا هي مش الحل لكنها تفيد

Sami is the name .net is the game

SamiKaraeen@hotmail.com

#7

السلام عليكم

أستاذتي الكرام ردا على

اقتباس
تعليقاً على سؤالك: لماذا تقوم بإخراج الـ10000 كلها دفعة واحدة؟ هل ستقوم بعمليات عليها كلها؟ أو تظهرها كلها في نفس الوقت؟
اقتباس
لا داعي لجلب كل البيانات و إنما أجعل عملية الجلب تعتمدعلى عملية البحث ( اي اجلب ما تم البحث عنه فقط )

انا مجبر على التعامل مع 30.000 صنف في احدى الشاشات هل تصدقوا هذا ولايوجد حل لهذا الموضوع فهذا العدد هو عباره عن تصنيفات بنود مخزنية لشركة صناعية فانا استخدم زر التالي والسابق للتنقل بين الصفوف "وهي من متطلبات المستخدم" اى احتاج ان اعرض في dataset التصنيف الرئيسي والفرعي والنوعي لكل صنف وان كان هنالك فكرة افضل انا عارف انكم لن تبخلوا علينا بها

اخي XP.net اتمني ان توضح لنا الفكرة اكثر واكثر

"نحن لا نستسلم... ننتصر أو نموت.... وهذه ليست النهاية... بل سيكون عليكم أن تحاربوا الجيل القادم والاجيال التي تليه... اما أنا... فإن عمري سيكون أطول من عمر شانقي."

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#8
عبدالجليل العقوري كتب:
السلام عليكم

أستاذتي الكرام ردا على

انا مجبر على التعامل مع 30.000 صنف في احدى الشاشات هل تصدقوا هذا ولايوجد حل لهذا الموضوع فهذا العدد هو عباره عن تصنيفات بنود مخزنية لشركة صناعية فانا استخدم زر التالي والسابق للتنقل بين الصفوف "وهي من متطلبات المستخدم" اى احتاج ان اعرض في dataset التصنيف الرئيسي والفرعي والنوعي لكل صنف وان كان هنالك فكرة افضل انا عارف انكم لن تبخلوا علينا بها

اخي XP.net اتمني ان توضح لنا الفكرة اكثر واكثر

هل الـ30,000 صنف كلها موجودة في نفس الصفحة في "نفس الوقت"؟

في الغالب يكفي إظهار واحد (أو خمسة أو عشرة حسب الحاجة) من الأصناف في الشاشة في المرة الواحدة (لا أعتقد أن هناك شاشة في العالم يمكنها احتواء 30.000 صنف في وقت واحد). أي أنه يكفي جلب هذا العدد المحدود فقط، ثم عندما يضغط المستخدم على زر التالي مثلاً يقوم البرنامج بسحب الدفعة التالية و إظهارها. و كذلك بالنسبة لبقية الأزرار.

#9

بالأضافة إلى ما قالوه الأخوة الكرام

أحي أن أضيف أعمل أخي الكريم index للحقل الذي تبحث عنه باستمرار مثل رقم الموظف او الأسم وهكذا

والسلام خير ختام

رَبِّ لَا تَذَرْنِي فَرْداً وَأَنتَ خَيْرُ الْوَارِثِينَ

#10

أخي الكريم

هذه المشكلة موجودة ومعروفة ، ليس لها حل حتى الآن إلا ان تستخدم طريقة الاتصال المباشر ( غير المنفصل )

كما يجب أن تلاحظ أن البرنامج سيكون ابطأ في وضع الـ Debug أما في عمل الإصدار النهائي والتعامل مباشرة مع ملف EXE فسيكون أسرع بعض الشيء

يمكنك مراجعة الوصلة التالية لهذه المشكلة

/index.ph...=111407&hl=

وشكرا

#11
مجرد إنسان كتب:
أخي الكريم

هذه المشكلة موجودة ومعروفة ، ليس لها حل حتى الآن إلا ان تستخدم طريقة الاتصال المباشر ( غير المنفصل )

كما يجب أن تلاحظ أن البرنامج سيكون ابطأ في وضع الـ Debug أما في عمل الإصدار النهائي والتعامل مباشرة مع ملف EXE فسيكون أسرع بعض الشيء

يمكنك مراجعة الوصلة التالية لهذه المشكلة

/index.ph...=111407&hl=

وشكرا

لماذا ليس لها حل؟ طرحنا هنا عدة حلول. الفكرة هنا فقط هي تغيير التفكير من النظام المتصل إلى النظام الغير متصل.

و كذلك البطء في عملية fill حله هو استخدام الــreader و هو أسرع بكثير (جربتها و وقتها) من الـfill لذا هو مناسب للكويريات الضخمة و التي لا تستخدم عادةً إلا في إخراج التقارير. أما موضوع التنقل يبن البيانات فالحل قد ذكرناه. المظلوب فقط هو ترك تفكير الـADO المتصل إلى الـADO.NET الغير متصل.

#12
System Down كتب:
لماذا ليس لها حل؟ طرحنا هنا عدة حلول. الفكرة هنا فقط هي تغيير التفكير من النظام المتصل إلى النظام الغير متصل.

و كذلك البطء في عملية fill حله هو استخدام الــreader و هو أسرع بكثير (جربتها و وقتها) من الـfill لذا هو مناسب للكويريات الضخمة و التي لا تستخدم عادةً إلا في إخراج التقارير. أما موضوع التنقل يبن البيانات فالحل قد ذكرناه. المظلوب فقط هو ترك تفكير الـADO المتصل إلى الـADO.NET الغير متصل.

مع احترامي لآرائكم فالتقنية جعلت لتلبية رغبات المستخدم ، لا لتتحكم بها وهو يمشي خلفها

الـ Reader أسرع بكثير ، صحيح ، لكنه للقراءة فقط !!! وللأمام فقط !!!!

مع يقيني بأننا ندافع الآن عن هذه التقنية ونرى أنها كاملة ، لكن في المستقبل عندما تحدث ويندوز طريقة عمل ADO.NET وترى القصور الحالي فيه ، كلنا سيقول بالفعل كان فيه قصور وجاء الحل ...!!!

وشكرا

#13
مجرد إنسان كتب:
مع احترامي لآرائكم فالتقنية جعلت لتلبية رغبات المستخدم ، لا لتتحكم بها وهو يمشي خلفها

عندما قلت في السابق تغيير طريقة التفكير لم أقصد تغيير طريقة تفكير العميل. هذه صعبة و أدرك ذلك. و لكن أقصد طريق التفطير البرمجي. إطرح المتطلب الي يريده العميل و أنا متأكد أننا سنجد حل "سريع" تحت مظلة البيانات المنقطعة الإتصال.

مجرد إنسان كتب:
الـ Reader أسرع بكثير ، صحيح ، لكنه للقراءة فقط !!! وللأمام فقط !!!!

إذاً استخدمها وقت القراءة فقط. استخدم الـreader لتعبئة DataTable أو DataSet (حسب الإحتياج) أو حتى بنية خاصة فيك. أقفل الإتصال ثم استخدم البيانات التي سحبتها كما تريد. تنتقل فيها كما تريد. و إذا أردت الإضافة أو التعديل أو غيرها من العمليات تصدر أوامر SqlCommand (أو OleDBCommand، حسب قاعدة البيانات المستخدمة).

السابق سيناريو شائع جداً. قد نحتاج إلى تعديله قليلاً حسب متطلبات العميل و هنا تأتي قوة الـADO.NET لأنه مرن جداً و يسمح بتصميم سيناريوات متعددة.

مجرد إنسان كتب:
مع يقيني بأننا ندافع الآن عن هذه التقنية ونرى أنها كاملة ، لكن في المستقبل عندما تحدث ويندوز طريقة عمل ADO.NET وترى القصور الحالي فيه ، كلنا سيقول بالفعل كان فيه قصور وجاء الحل ...!!!

وشكرا

نحن بشر و الكمال لله. إذا كنا سننتظر حتى يأتينا السر الإلهي سننتظر إلى الأبد. لذا نستخدم الموجود حتى يأتي الأفضل. الـADO.NET جاءت بديلاً للـADO و حلت العديد من المشاكل. قد تكون الـADO سهلة و لكنها صممت منذ البداية لحلول الـserver-client و موائمتها للحلول الضخمة و حلول الويب كان له مشاكل. كما أن الـADO.NET أسرع لأنه يتحدث إلى قاعدة البيانات مباشرة من غير وسيط مثل الـodbc و غيره. نعم في المستقبل القريب سيأتي ما يحل مكانه فالـADO.NET ليس من دون عيوب هو الآخر. و لكن هذه طبيعة تقنية المعلومات.

#14
System Down كتب:
عندما قلت في السابق تغيير طريقة التفكير لم أقصد تغيير طريقة تفكير العميل. هذه صعبة و أدرك ذلك. و لكن أقصد طريق التفطير البرمجي. إطرح المتطلب الي يريده العميل و أنا متأكد أننا سنجد حل "سريع" تحت مظلة البيانات المنقطعة الإتصال.

إذاً استخدمها وقت القراءة فقط. استخدم الـreader لتعبئة DataTable أو DataSet (حسب الإحتياج) أو حتى بنية خاصة فيك. أقفل الإتصال ثم استخدم البيانات التي سحبتها كما تريد. تنتقل فيها كما تريد. و إذا أردت الإضافة أو التعديل أو غيرها من العمليات تصدر أوامر SqlCommand (أو OleDBCommand، حسب قاعدة البيانات المستخدمة).

السابق سيناريو شائع جداً. قد نحتاج إلى تعديله قليلاً حسب متطلبات العميل و هنا تأتي قوة الـADO.NET لأنه مرن جداً و يسمح بتصميم سيناريوات متعددة.

نحن بشر و الكمال لله. إذا كنا سننتظر حتى يأتينا السر الإلهي سننتظر إلى الأبد. لذا نستخدم الموجود حتى يأتي الأفضل. الـADO.NET جاءت بديلاً للـADO و حلت العديد من المشاكل. قد تكون الـADO سهلة و لكنها صممت منذ البداية لحلول الـserver-client و موائمتها للحلول الضخمة و حلول الويب كان له مشاكل. كما أن الـADO.NET أسرع لأنه يتحدث إلى قاعدة البيانات مباشرة من غير وسيط مثل الـodbc و غيره. نعم في المستقبل القريب سيأتي ما يحل مكانه فالـADO.NET ليس من دون عيوب هو الآخر. و لكن هذه طبيعة تقنية المعلومات.

أخي الحبيب

أنا آسف إن كان كلامي أزعجك لكننا نتناقش ...وكله من أجل العلم

ذكرت أخي الكريم ما يلي : إذاً استخدمها وقت القراءة فقط. استخدم الـreader لتعبئة DataTable أو DataSet (حسب الإحتياج) أو حتى بنية خاصة فيك. أقفل الإتصال ثم استخدم البيانات التي سحبتها كما تريد. تنتقل فيها كما تريد .

كيف أتنقل فيها وهي للأمام فقط ، ماذا لو احتاج المستخدم أن ينظر في السجل السابق ، ماذا لو أراد التراجع عن التغييرات التي حصلت ... كل ذلك لا بد من إدارته ذاتيا بنفسي ؟؟

#15
مجرد إنسان كتب:
أخي الحبيب

أنا آسف إن كان كلامي أزعجك لكننا نتناقش ...وكله من أجل العلم

لا لا لا لست مننزعجاً أو شئ من هذا القبيل. كما فلت، نحن نتناقش. :lol:

مجرد إنسان كتب:
ذكرت أخي الكريم ما يلي : إذاً استخدمها وقت القراءة فقط. استخدم الـreader لتعبئة DataTable أو DataSet (حسب الإحتياج) أو حتى بنية خاصة فيك. أقفل الإتصال ثم استخدم البيانات التي سحبتها كما تريد. تنتقل فيها كما تريد .

كيف أتنقل فيها وهي للأمام فقط ، ماذا لو احتاج المستخدم أن ينظر في السجل السابق ، ماذا لو أراد التراجع عن التغييرات التي حصلت ... كل ذلك لا بد من إدارته ذاتيا بنفسي ؟؟

صحيح أنك لا تستطيع التنقل وسط الـReader و لكن يمكنك التنقل داخل الـDataTable. أحد السيناريوات الشائعة هي تعبئة الـDataTable بواسطة الـReader من خلال حلقة Loop. بعد إنتهاء الحلقة يقفل الـReader. ثم تستخدم الـDataTable نفسها للقراءة حيث أنه يمكنك الإطلاع على أي صف داخلها.

DataTable.Rows(1).Item("EMP_ID")

نعم هذا يعني كود أكثر قليلاً و لكن الفرق (في رأيي) ليس بهذا السوء و ما تجنيه من سرعة إتصال و مرونة هي مكافأة جيدة للجهد الإضافي.

#16

أولا إذروني على الإلحاح ،،، لو علمت ما بي لعذرتني ،،،،

ثانيا أشكر كل من شارك في هذا الموضوع

أخي XP.net رأيك جميل ولكن هذه الطريقة تحتاج الى بعض المهارة حيث حاولت أن أبرمج بإستخدام الــ Threads ، وكمثال عندما أقوم بعمل هذا الطريقة

الكود كامل

Imports System.Threading
Public Class Form1
	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim bgThread As New Thread(AddressOf FillList)
		bgThread.Start()
	End Sub
	Public Sub FillList()
		Try
			Dim i As Integer = 1
			For i = 1 To 100000
				ListBox1.Items.Add(i.ToString)
			Next
			MsgBox("تم ملئ القائمة!")
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try

	End Sub

	Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
		MsgBox(ListBox1.SelectedIndex.ToString)
	End Sub
End Class

يظهر لي إستثناء "خطأ"

فكيف الحل

#17

100,000 بند في القائمة!! لا أعتقد أن هذه طريقة سليمة لعرض البيانات.

ما هو الإستثناء الذي تحصل عليه؟

#18

الإستثناء هو

Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on.

ثم نرجع الى الموضوع الأصلي:

أنا ملزم على تحميل جميع الصفوف في نفس الوقت بحيث مشروعي هو مكتبة لتصفح الكتب فكل كتاب به ما يقارب 10000 صفحة كل صفحة في صف فلابد من تحميلها كلها في نفس الوقت لكي يتسنى للمستخدم التنقل بين صفحات الكتاب .

ولكم جزيل الشكر على التفاعل والإجابة

#19

يمكنك تحميل فقط الصفحة التي يتم قراءتها فقط ثم تحميل الصفحات الأخرى حسب الطلب. و التنقل بين الصفحات يجب أن لا يتم يالـListBox لأنه من غير العملي بتاتاً استخدامه لهذا العدد الكبير من البنود. تخيل للحظة أن القارئ يريد أن ينتقل من الصفحة رقم 5 إلى الصفحة رقم 5000. تخيل التنقل الطويل الذي سيحدث بين بيانات الـقائمة. حل أفضل هو وضع أزرار للصفحة الأولى، الصفحة التالية، الصفحة السابقة و الصفحة الأخيرة. و كذلك زر معه textbox للتنقل السريع بحيث يكتب القارئ رقم الصفحة في الـtextbox ثم يضغط الزر و يأخذه إلى الصفحة.

#20

بالنسبة لهذا الخطأ

Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on.

ضع هذا الكود في constructor الفورم

CheckForIllegalCrossThreadCalls = false

#21

أخي System Down أنا وضعت المثال لحل المشكلة في Thread

سأدرج لك مثال به الكثير من الصفوف في قواعد البيانات وشكرا لك

#22

السلام عليكم ...

أولا أود أعتذر عن تأخري الكثير في مواصلة الموضوع وذلك لأسباب منها:

قلت سابقا انني سأدرج مثال به الكثير من الصفوف في قواعد البيانات ولكن واجهتني مشاكل منها كيف ممكن أن أرفع ملف حجمه 30 MB أو أكثر والشبكة ضعيفة عندي ولو رفعتها فكيف للأعضاء إنزالها قد تكون عندهم الشبكة ضعيفة ....

ولكن وجدت حلا وهو :

قمت بعمل مثال فيه قاعدة بيانات فارغة ويوجد به TextBox به صفحة واحدة - وهي نص قوانين المنتدى- وعملت جملة تكرارية تقوم بإدراج هذه الصفحة في قواعد البيانات 17000 صف حتى تنتج قاعدة بيانات كبيرة وبها الكثير من الصفوف حتى نبين فكرة إستغراق الوقت في تحميلها ....

الحل الأول لهذه المشكلة هي إستخدام Thread ولكن هل هناك من حل أفضل ..

المهم المثال موجود في المرفقات .. شكرا لكم .... في إنتظاركم...

WindowsApplication1.rar

تم تعديل هذه المشاركة بواسطة albahr في 27 يوليو 2007 في 09:22

#23

السلام عليكم

راجع هذا الرابــــ المشروع معمول على 2003 يمكن تطويرة الى 2005 للأخ العزيز SOLO.NET

في المثال يتضح المقال

#24

شكرا جزيلا ...

ولكن هناك مشكلة إنه معمول على SQLServer وبه إجراء وحد علمي الإجراءات المخزنة لا تعمل على أكسس هل من الأخوة يقوم بتطويه على أكسس أو يعننا على تطويه ،،، وشكرا ..

المثال

#25

اعتقد ان الموضوع دسم ولكن توجد تعصبات ههههههههههه

يعني هذي التقنية الموجودة فنحن نسخرها لخدمة متطلباتنا فالحمدلله اننا وصلنا لهذا الحال وغيرنا قبل سنين كان يحلم بيها

اخي الكريم اريدك ان تقوم بعمل بحث على ملفات في يوندوز ولاحظ طريقة تعبئة البيانات ستجد انها تعبئ على دفعات بحيث ان العميل يرى الدفعات الأولى بينما يقوم الجهاز بتبعئة الباقي الى ان يتم الانتهاء من العمل فانت تشغل المستخدم بالبيانات الحالية وفي الخلف تقوم باستكمال البيانات هذا في حال ان البيانات كلها يجب ان تعرض للعميل

واريدك ان تفكر في حل اخر وهو مثل جميع المنتديات حيث ان الردود تنقسم الى عدة صفحات

ثم ان العميل يحصل على نتائج سريعة على دفعات افضل من ان يحصل على نتائج كاملة وتاخد وقت كبير

تحياتي

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

هذا الموضوع مغلق.

مواضيع مشابهة