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

مشكلة Concurrency Violation

بدأه wimaxmax في 5 مارس 2009 · 17 رد · 1,914 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــة ،،

تحية طيبة

حصلت عندي مشكلة في ال Data Base

مشروعي عبارة عن فحص الاكواد وايجاد الاخطاء Static

المهم عند تنفيذ البرنامج يتم الفحص للمرة الاولى بنجاح

عند تكرار التجربة يطلع هذا الخطأ

Concurrency violation: the UpdateCommand affected 0 of the expected 1 records

الكود الموجود فيه المشكلة

public void stgraph(SymbT st)
	{
		//

		olecon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test1.mdb";

			olecon.Open();

			adapt = new OleDbDataAdapter("Select * FROM STG", olecon);
			commbld = new OleDbCommandBuilder(adapt);
		  commbld.QuotePrefix = "[";
		  commbld.QuoteSuffix = "]";

			adapt.Fill(dtTable);
			//
			for (int i = 0; i < p.stsize; i++)
			{
				if (p.symbolTable.type == p.types[0])
				{
					if (p.symbolTable.lexeme == "filename")
					{
						DataRow dr = dtTable.NewRow();
						dr["ID"] = dtTable.Rows.Count;
						dr[1] = "";
						dtTable.Rows.Add(dr);
						//rowpos = dtTable.Rows.Count - 1;

						if (dtTable.Rows.Count != 0)
						{
							dtTable.Rows[rowpos]["ID"] = rowpos + 1;
							dtTable.Rows[rowpos][1] = p.symbolTable.lexeme;
							adapt.Update(dtTable);
						}

					}

				}

				if (p.symbolTable.type == p.types[0])
				{
					if (p.symbolTable.lexeme == "Open")
					{
						dtTable.Rows[rowpos]["Enter1"] = rowpos + 1;
						dtTable.Rows[rowpos][2] = p.symbolTable.lexeme;
						adapt.Update(dtTable);

					}
					else if (p.symbolTable.lexeme == "Read")
					{
						dtTable.Rows[rowpos]["Enter2"] = rowpos + 1;
						dtTable.Rows[rowpos][3] = p.symbolTable.lexeme;
						adapt.Update(dtTable);

					}
					else if (p.symbolTable.lexeme == "Write")
					{
						dtTable.Rows[rowpos]["Enter2"] = rowpos + 1;
						dtTable.Rows[rowpos][3] = p.symbolTable.lexeme;
						adapt.Update(dtTable);

					}
					else if (p.symbolTable.lexeme == "Close")
					{
						dtTable.Rows[rowpos]["Enter3"] = rowpos + 1;
						dtTable.Rows[rowpos][4] = p.symbolTable.lexeme;
						adapt.Update(dtTable);

					}
				}
			}
	 olecon.Close();   
	}

وفي المرفقات المشروع كامل بلغة C# 2008 Express

اذا عندكم اي اقتراحات في البرمجة اتمنى تضيفوها هنا او تعديل على الكود حتى استفيد منها

ومارأيكم في واجهة البرنامج

شاكر لكم مقدماً

مع التحية

StaticTester.rar

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 5 مارس 2009 في 05:48

#2

25 مشاهدة ولا رد

:cry:

مع التحية

#3

السلام عليكم

لم أجد الوقت الكافي لكي أقرأ الموضوع كامل مع المثال ولكنني واجهت مثل هذه المشكلة منذ يومين والحمد لله بعد عمل يومين متواصلين تمكنت من حلها وإليك الحل:

المشكلة كانت أن OLEDBCommandBuilder لم يكن ينشئ أوامر الInsert,Update,Delete بشكل جيد عند التعديل على DataGridView مربوطة مع قاعدة بيانات Access يواسطة BindingSource حيث أن المشكلة أن يظهر رسالة INSERT INTO خطأ في تعليمة وقد تمكنت بحل المشكلة بتغيير نوع BindingSource من Class إلى Component أي عوضاً عن تعريف Class

BindingSource bs = new BindingSource()

قم بإضافة الكائن BindingSource إلى الForm

هذا والله أعلم.

أعوذ بالله من الشيطان الرجيم

قل إنّ صلاتي و نسكي و محيّاي و مماتي لله رب العالمين

صدق الله العظيم

#4

السلام عليكم ,,,

اريد ان اعرف لماذا لا تستخدم مصمم الفورم في إنشاء الكنترولات بدل من كتابة الكود بهذه الطريقة. :S

بالنسبة لمشكلة Concurrency :

جرب ان تغير نوع العمود ID في قاعدة البيانات من ترقيم تلقائي إلى رقم.

او ان تقوم بتحديد الأوامر في DataAdapter بنفسك عوضاً عن استخدام CommandBuilder.

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#5

^^^

مسألة تعود لاأكثر

تعودت وانا في الجامعة كتابة الاكواد هكذا

اقتباس
او ان تقوم بتحديد الأوامر في DataAdapter بنفسك عوضاً عن استخدام CommandBuilder.

كيف هذه الطريقة

مع التحية

تم تعديل هذه المشاركة بواسطة wimaxmax في 6 مارس 2009 في 05:07

#6

اولاً جرب ان تغير نوع العمود من ترقيم تلقائي إلى رقم .

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#7

جربت الحل الاول وطلع يقول يوجد قيم متكررة في قاعدة البيانات

شاكر لك على المساعدة

مع التحية

#8

آسف للتأخير,,,

مشكلة التكرار في الرقم تحصل لأنك تعتمد على موقع الصف في الترقيم ، وهذا بلا شك خطأ كبير.

الأسهل في هذه الحالة انك تستخدم القيمة القصوى ، وفي كل مرة تعطي رقم جديد تزيد واحد .

كيف؟

قبل for تضيف هذا الكود علشان نحصل على اكبر قيمة لـ ID :

OleDbCommand maxCmd = new OleDbCommand("SELECT MAX(ID) FROM STG",olecon);
object tempRet=maxCmd.ExecuteScalar();
int maxID = 0;
if (tempRet != DBNull.Value)
maxID = (int)tempRet;

الآن maxID يحتوي على اكبر رقم في جدول قاعدة البيانات، فلما نحتاج نعطي رقم لصف نضيف واحد إلى maxID ونعطيه الناتج ، هكذا :

dr["ID"] = ++maxID;

اتمنى تكون الفكرة وصلت.

بالتوفيق

تم تعديل هذه المشاركة بواسطة HassanAlattas في 7 مارس 2009 في 17:13

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#9

وعليكــم السـلام ورحمة الله وبركاتـه..

تحية طيبة

هل تقصد ان يصبح الكود هكذا


{
//

olecon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test1.mdb";

olecon.Open();

adapt = new OleDbDataAdapter("Select * FROM STG", olecon);
commbld = new OleDbCommandBuilder(adapt);
commbld.QuotePrefix = "[";
commbld.QuoteSuffix = "]";

adapt.Fill(dtTable);
//
OleDbCommand maxCmd = new OleDbCommand("SELECT MAX(ID) FROM STG", olecon);
object tempRet = maxCmd.ExecuteScalar();
int maxID = 0;
if (tempRet != DBNull.Value)
maxID = (int)tempRet;


for (int i = 0; i < p.stsize; i++)
{
if (p.symbolTable.type == p.types[0])
{
if (p.symbolTable.lexeme == "filename")
{
DataRow dr = dtTable.NewRow();
dr["ID"] = dtTable.Rows.Count;
dr[1] = "";
dtTable.Rows.Add(dr);
//rowpos = dtTable.Rows.Count - 1;
dr["ID"] = ++maxID;

if (dtTable.Rows.Count != 0)
{
dtTable.Rows[rowpos]["ID"] = rowpos + 1;
dtTable.Rows[rowpos][1] = p.symbolTable.lexeme;
adapt.Update(dtTable);
}

}

}

if (p.symbolTable.type == p.types[0])
{
if (p.symbolTable.lexeme == "Open")
{
dtTable.Rows[rowpos]["Enter1"] = rowpos + 1;
dtTable.Rows[rowpos][2] = p.symbolTable.lexeme;
adapt.Update(dtTable);

}
else if (p.symbolTable.lexeme == "Read")
{
dtTable.Rows[rowpos]["Enter2"] = rowpos + 1;
dtTable.Rows[rowpos][3] = p.symbolTable.lexeme;
adapt.Update(dtTable);

}
else if (p.symbolTable.lexeme == "Write")
{
dtTable.Rows[rowpos]["Enter2"] = rowpos + 1;
dtTable.Rows[rowpos][3] = p.symbolTable.lexeme;
adapt.Update(dtTable);

}
else if (p.symbolTable.lexeme == "Close")
{
dtTable.Rows[rowpos]["Enter3"] = rowpos + 1;
dtTable.Rows[rowpos][4] = p.symbolTable.lexeme;
adapt.Update(dtTable);

}
}
}
olecon.Close();
}
public void stgraph(SymbT st)

تمت تجربته وعمود الترقيم التلقائي موجود

ووجدت نفس المشكلة

تم الغاء الترقيم التلقائي وطلعت هذه المشكلة

post-155139-1236501180_thumb.jpg

وحصلت مشكلة قيمة متكررة

عارف تعبتك معاي وشاكر لك مقدماً

مع التحية

#10

الخطأ الذي يظهر لك في السطر 27 واظن انه قبل الدالة stgraph.

استخدم هذا في اي مكان تحتاج فيه تعين ID

dr["ID"] = ++maxID;

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#11

مشكلة ال Concurrency Violation لازالت موجودة

سويت rowpos اخر للجدول الثاني وحلت مشكلة السطر

الان عند تشغيل البرنامج بواسطة مفتاح F5 تظهر هذه الرسالة Concurrency Violation :tantrum:

اما عند تشغيل البرنامج بواسطة ctrl+F5 ماتطلع هذه الرسالة

مالحل

تم تعديل هذه المشاركة بواسطة wimaxmax في 14 مارس 2009 في 09:11

#12

للرفع

#13

السلام عليكــم ورحمـة الله وبركاتــة ،،

اخي فتحت كل ملفات قواعد البيانات في المرفق الخاص بك ، ولا يوجد إلا جدول واحد هو STG . فمن اين اتي الجدول الثاني!!.

انصحك ان تبحث اكثر حول طريقة التعامل مع قواعد البيانات في بيئة الدوت نت.

تحياتي,,,

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#14
HassanAlattas كتب:
السلام عليكــم ورحمـة الله وبركاتــة ،،

اخي فتحت كل ملفات قواعد البيانات في المرفق الخاص بك ، ولا يوجد إلا جدول واحد هو STG . فمن اين اتي الجدول الثاني!!.

انصحك ان تبحث اكثر حول طريقة التعامل مع قواعد البيانات في بيئة الدوت نت.

تحياتي,,,

جدول الكود الصحيح تحت مسمى Good.mdb

وجدول الكود test.mdb

مع التحية

#15

في الدالة stgraphC تحتاج تضيف نفس الكود ايضاً:

commbld.QuotePrefix = "[";
commbld.QuoteSuffix = "]";

وحاول تشرح عمل الدوال:

- stgraph

- stgraphC

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#16

هنا شرحت وظائف كل من الدالتين في الموضوع

/index.ph...=183679&hl=

شاكر لك مساعدتي اخي الكريم

مع التحية

#17

السلام عليكــم ورحمـة الله وبركاتــه ،،

ما شاء الله البرنامج كبير :lol: .

لكن لم تحصل اي مشكلة عند تشغيلة في جهازي..

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#18

انحلت المشكلة نهاائياً

شاكر لك على المساعدة :clapping:

مع التحية

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