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

مشكل في الحفظ المتعدد في قاعدة البيانات SQL server

بدأه zaka88 في 5 أكتوبر 2012 · 6 رد · 876 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

اعمل على برنامج تسيير زبائن لغرض التعلم

انا اعمل على فيجوال ستيديو 2008 و SQL server 2005

باستراتيجية الوضع المنفصل عن قاعدة البيانات

واجهتني المشكلة الاتية

انا اقوم باستعمال الاستعلام الاتي لجلب المعلومات الى الداتا غريد

select c.id, c.nom, c.pre, d.date, d.mon 
from clients c, credit d 
where c.id = d.n_client

بعد العمل على البيانات اقوم بالحفظ بالامر الاتي

da.Update(ds, "clients");

حيث

ds هو داتاسات

da هو داتاادبتر

عند التنفيذ نتج خطا وهذا نصه

Dynamic SQL generation is not supported against multiple base tables.

كيف احل هذا الاشكال؟

#2

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

  1. أنت تظهر في الــ Grid خمسة أعمدة , ثلاثة من جدول الــ Clients و اثنان من جدول الــ Credit , بينهما علاقة One-to-Many ..
  2. الـــ Adapter يفشل في مثل هذه الحالة بتوليد الــ SQL , عليك وضع الـــ UpdateCommand و الــ InsertCommand بشكل يدوي ..
  3. هل تريد التغيير في كل الأعمدة , أم فقط الأعمدة الخاصة بالجدول الأول ؟ مثلا لو تم إضافة سطر جديد في الغريد بالبيانات
    (10=c.id=1, c.nom='xx', c.pre='y', d.date='kkkk', d.mon). هنا غير واضح , هل سنقوم بــ Insert في الجدول الثاني و Update على الأول أم ماذا ؟
  4. Editing Data from Two Tables in a Single DataGridView رابط

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

السلام عليكم

شكرا اخ houssam11350_11350 لاهتمامك

عدلت على الـــ UpdateCommand و الــ InsertCommand كما اشرت

لكن لم افلح

---

اصبت في شرحك للــ Grid والجداول والعلاقة بينهم

انا اريد ان اعدل فقط على الجدول credit بحيث اضيف واحذف واغير في قيمة في احد الاعمدة

هذه محاولتي بالنسبة للـ UpdateCommand

da.UpdateCommand = new SqlCommand("update credit set mon= "+ ds.Tables[0].Rows[0][0].ToString()+ " where n_client= "+ ds.Tables[0].Rows[0][0].ToString());

ليست فعالة لانها محصورة على خانة واحدة هي (0.0)

اما الــ InsertCommand فمازلت احاول

احتاج لمزيد من التوضيح فانا اول مرة اتعامل مع الوضع المنفصل في قواعد البيانات

وشكرا مقدما

#4

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

  1. إذا كنت فقط تريد عمل تعديل على الأعمدة الخاصة بالــ Credit فيكفي تزويد UpdateCommand للــ adapter كمايلي :
     private void btnSave_Click(object sender, EventArgs e)
        	{
    
            	OleDbCommand updateCommand = new OleDbCommand("UPDATE Credit SET ClientID = @ClientID , TheDate=@TheDate , TheMoney =@TheMoney WHERE ID=@ID;");
            	updateCommand.Parameters.Add("@ClientID", OleDbType.Numeric, 0, "ClientID");
            	updateCommand.Parameters.Add("@TheDate", OleDbType.VarChar, 255, "TheDate");
            	updateCommand.Parameters.Add("@TheMoney", OleDbType.Numeric, 0, "TheMoney");
            	updateCommand.Parameters.Add("@ID", OleDbType.Numeric, 0, "CreditID");
            	updateCommand.Connection = connection;
    
            	adapter.UpdateCommand = updateCommand;
            	adapter.Update(dataTable);
    
            	MessageBox.Show("Save OK");
    
        	}

  2. أما إذا كنت تريد إضافة و تعديل الــ Client و الــ Credit معا , فيمكنك ذلك و هذه هي الطريقة :
    private void btnSaveClientCredit_Click(object sender, EventArgs e)
        	{
            	OleDbCommand insertClient = new OleDbCommand("INSERT INTO Client (ClientName , Pre) VALUES (@ClientName , @Pre)");
            	insertClient.Connection = connection;
            	insertClient.Parameters.Add("@ClientName", OleDbType.VarChar, 255);
            	insertClient.Parameters.Add("@Pre", OleDbType.VarChar, 255);
    
            	OleDbCommand updateClient = new OleDbCommand("UPDATE Client SET ClientName=@ClientName , Pre =@Pre WHERE ID=@ID");
            	updateClient.Connection = connection;
            	updateClient.Parameters.Add("@ClientName", OleDbType.VarChar, 255);
            	updateClient.Parameters.Add("@Pre", OleDbType.VarChar, 255);
            	updateClient.Parameters.Add("@ID", OleDbType.Numeric, 0);
    
    
            	OleDbCommand insertCredit = new OleDbCommand("INSERT INTO Credit (ClientID ,TheDate  , TheMoney) VALUES (@ClientID ,@TheDate  , @TheMoney)");
            	insertCredit.Connection = connection;
            	insertCredit.Parameters.Add("@ClientID", OleDbType.Numeric, 0);
            	insertCredit.Parameters.Add("@TheDate", OleDbType.VarChar, 255);
            	insertCredit.Parameters.Add("@TheMoney", OleDbType.Numeric, 0);
    
            	OleDbCommand updateCredit = new OleDbCommand("UPDATE Credit SET ClientID = @ClientID , TheDate=@TheDate , TheMoney =@TheMoney WHERE ID=@ID;");
            	updateCredit.Connection = connection;
            	updateCredit.Parameters.Add("@ClientID", OleDbType.Numeric, 0, "ClientID");
            	updateCredit.Parameters.Add("@TheDate", OleDbType.VarChar, 255, "TheDate");
            	updateCredit.Parameters.Add("@TheMoney", OleDbType.Numeric, 0, "TheMoney");
            	updateCredit.Parameters.Add("@ID", OleDbType.Numeric, 0, "CreditID");
    
            	OleDbCommand idCommand = new OleDbCommand();
            	idCommand.Connection = connection;
    
    
            	foreach (DataRow row in dataTable.Rows)
            	{
                	if (row.RowState == DataRowState.Added || row.RowState == DataRowState.Modified)
                	{
                    	int ClientID = (row["ClientID"] == DBNull.Value || (int)row["ClientID"] == 0) ? 0 : (int)row["ClientID"];
                    	int CreditID = (row["CreditID"] == DBNull.Value || (int)row["CreditID"] == 0) ? 0 : (int)row["CreditID"];
    
                    	if (ClientID == 0)
                    	{
                        	insertClient.Parameters["@ClientName"].Value = row["ClientName"];
                        	insertClient.Parameters["@Pre"].Value = row["Pre"];
                        	insertClient.ExecuteNonQuery();
                        	idCommand.CommandText = "SELECT MAX(ID) AS ID FROM Client;";
                        	ClientID = Convert.ToInt32(idCommand.ExecuteScalar().ToString());
                        	row["ClientID"] = ClientID;
    
                    	}
                    	else
                    	{
                        	updateClient.Parameters["@ClientName"].Value = row["ClientName"];
                        	updateClient.Parameters["@Pre"].Value = row["Pre"];
                        	updateClient.Parameters["@ID"].Value = row["ClientID"];
                        	updateClient.ExecuteNonQuery();
                    	}
    
    
                    	if (CreditID == 0)
                    	{
                        	insertCredit.Parameters["@ClientID"].Value = row["ClientID"];
                        	insertCredit.Parameters["@TheDate"].Value = row["TheDate"];
                        	insertCredit.Parameters["@TheMoney"].Value = row["TheMoney"];
                        	insertCredit.ExecuteNonQuery();
                        	idCommand.CommandText = "SELECT MAX(ID) AS ID FROM Credit;";
                        	CreditID = Convert.ToInt32(idCommand.ExecuteScalar().ToString());
                        	row["CreditID"] = CreditID;
    
                    	}
                    	else
                    	{
                        	updateCredit.Parameters["@ClientID"].Value = row["ClientID"];
                        	updateCredit.Parameters["@TheDate"].Value = row["TheDate"];
                        	updateCredit.Parameters["@TheMoney"].Value = row["TheMoney"];
                        	updateCredit.Parameters["@ID"].Value = row["CreditID"];
                        	updateCredit.ExecuteNonQuery();
                    	}
    
    
    
                	}
            	}
    dataTable.AcceptChanges();
            	MessageBox.Show("Save OK");
        	}

  3. المشروع مرفق .

ArabteamCS2.rar

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 6 أكتوبر 2012 في 16:46

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

بارك الله فيك اخ حسام وجزاك الله خيرا

تم الامر بنجاح والحمد لله

في البرنامج الذي اعمل عليه يكون الحفظ(تحديث او اظافة) في دالة واحدة

عملت الكود هكذا

 /*--updateCommand--*/
            SqlCommand updateCommand = new SqlCommand("UPDATE Credit SET mon = @mon WHERE n_client=@id and date=@date;");
            updateCommand.Parameters.Add("@id", SqlDbType.Int, 0 );
            updateCommand.Parameters.Add("@date", SqlDbType.DateTime, 255);
            updateCommand.Parameters.Add("@mon", SqlDbType.Real, 255);
            updateCommand.Connection = cn;

            /*--insertcommand--*/
            SqlCommand insertcommand = new SqlCommand("insert into credit (n_client,date,mon)values(@id, @date, @mon);");
            insertcommand.Parameters.Add("@id", SqlDbType.Int, 0);
            insertcommand.Parameters.Add("@date", SqlDbType.DateTime, 255);
            insertcommand.Parameters.Add("@mon", SqlDbType.Real, 255);
            insertcommand.Connection = cn;

            /*--Update database--*/
            try
            {
                cn.Open();
                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    if (row.RowState == DataRowState.Modified)
                    {
                        updateCommand.Parameters["@id"].Value = row["id"];
                        updateCommand.Parameters["@date"].Value = row["date"];
                        updateCommand.Parameters["@mon"].Value = row["mon"];

                        updateCommand.ExecuteNonQuery();

                    }
                    else
                        if (row.RowState == DataRowState.Added)
                        {
                            insertcommand.Parameters["@id"].Value = row["id"];
                            insertcommand.Parameters["@date"].Value = row["date"];
                            insertcommand.Parameters["@mon"].Value = row["mon"];

                            insertcommand.ExecuteNonQuery();
                        }
                }
            }
            finally
            {
                cn.Close();
            }

شكرا

#6

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

الحمد لله أنه يعمل ...

لكن نسينا :

dataTable.AcceptChanges();

التي تجعل الــ Rows في حالة Unchaged بحيث انه لو ضغط حفظ مرة أخرى , فأنه لن ينفذ أي أمر ما لم يحداث تغيير في الأسطر (تعديل أو إضافة) ..

تم تعديل المرفق السابق و الكود .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

حسنا

بارك الله فيك وجزاك خيرا

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…