تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشكلة في إستدعاء Method
#1
السلام عليكم اخوانى 
عندى مشكلة في استدعاء ميثود .. والمشكلة كالاتى
انا عامل ميثود عباره عن لوب داخل الدتا جريد فيو بعدين بتعمل طرح ما بين قيمتين .. المهم هذه الميثود انا استدعتها بعد عمليه الاضافه مباشرة ولكن المشكلة ان الميثود مش بتشتغل بعد عمليه الاضافه مباشرة  .. ولكن اذا استدعيت هذه الميثود عن طريق اضافتها في زر بتشتغل تمام من غير اي مشاكل .. 

هذا هو كود الاضافه 
كود :
               con.Open();
               cmd = new SqlCommand("insert into Cash (Account_Name,Date,Invoice_No,Department,Description,Debit,Credit,Project_Name,Remarks)values(@Account_Name,@Date,@Invoice_No,@Department,@Description,@Debit,@Credit,@Project_Name,@Remarks)", con);
               cmd.Parameters.AddWithValue("Account_Name", cmbAccountName.Text);
               cmd.Parameters.AddWithValue("Date", dateTimePicker1.Text);
               cmd.Parameters.AddWithValue("Invoice_No", txtInvoiceNO.Text);
               cmd.Parameters.AddWithValue("Department", txtDepartment.Text);
               cmd.Parameters.AddWithValue("Description", txtDescription.Text);
               cmd.Parameters.AddWithValue("Debit", txtDebit.Text);
               cmd.Parameters.AddWithValue("Credit", txtCredit.Text);
               cmd.Parameters.AddWithValue("Project_Name", txtProjectname.Text);
               cmd.Parameters.AddWithValue("Remarks", txtRemarks.Text);
               cmd.ExecuteNonQuery();
               con.Close();
               MessageBox.Show("Add Successfully", "Add", MessageBoxButtons.OK, MessageBoxIcon.Information);
               ClearBoxes();
               FillData();
هذه إسم الميثود المراد تشغيلها بعد الاضافه      CalculateBalance();
وهذه هي الميثود 
كود :
           double TDebit=0, TCredit=0, Results;

           foreach(DataGridViewRow Loop in dataGridView1.Rows)
           {
               TDebit +=Convert.ToDouble(Loop.Cells[6].Value);
               TCredit += Convert.ToDouble(Loop.Cells[7].Value);
           }
           Results = TCredit - TDebit;
           txtbalance.Text = Results.ToString();
[b]بتمني من حد يساعدني في حل المشكلة دى .. شكراً مقدماً
[/b]
الرد
تم الشكر بواسطة:
#2
هل تستخدم قاعدة بيانات اكسس ؟ ربما نسيت الاتصال مفتوح وبالتالي اخذ البرنامج وقت لكي يحدث البيانات

ارجو توضيح المزيد من الكود المستخدم
الرد
تم الشكر بواسطة: mir2 , mir2 , maxruined
#3
اخي طريقة التعامل هذه مع البيانات تؤدي دائما لسلوك غير متوقع

الاسلوب الافضل هو استخدام SqlConnection محلي ينتهي بانتهاء العملية المطلوبة ، ابقاء كائن الاتصال حيا هو ما يسبب غالبا مشاكل عدم تحديث البيانات فعلا

الافضل ان تخزن نص الاتصال فقط بشكل عام ، وكل مرة نحتاج الى اتصال نقوم بعمل كائن اتصال SqlConnection باستخدام using

جرب ان تجعل الكود هكذا :

كود :
string connectionString = "نص الاتصال هنا";
string commandString = "insert into Cash (Account_Name,Date,Invoice_No,Department,Description,Debit,Credit,Project_Name,Remarks)values(@Account_Name,@Date,@Invoice_No,@Department,@Description,@Debit,@Credit,@Project_Name,@Remarks)";

using(SqlConnection conn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandString, con);) {
 cmd.Parameters.AddWithValue("Account_Name", cmbAccountName.Text);
 cmd.Parameters.AddWithValue("Date", dateTimePicker1.Text);
 cmd.Parameters.AddWithValue("Invoice_No", txtInvoiceNO.Text);
 cmd.Parameters.AddWithValue("Department", txtDepartment.Text);
 cmd.Parameters.AddWithValue("Description", txtDescription.Text);
 cmd.Parameters.AddWithValue("Debit", txtDebit.Text);
 cmd.Parameters.AddWithValue("Credit", txtCredit.Text);
 cmd.Parameters.AddWithValue("Project_Name", txtProjectname.Text);
 cmd.Parameters.AddWithValue("Remarks", txtRemarks.Text);

 con.Open();
 cmd.ExecuteNonQuery();
 con.Close();
}

MessageBox.Show("Add Successfully", "Add", MessageBoxButtons.OK, MessageBoxIcon.Information);
ClearBoxes();
FillData();
CalculateBalance();

وكذلك عدل FillData لتستخدم اسلوب using :

كود :
using(SqlConnection conn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandString, con);) {


}

هكذا تضمن ان كائن الاتصال لن يعيش طويلا
الرد
تم الشكر بواسطة: Rabeea Qbaha , maxruined , ابراهيم ايبو
#4
(30-11-20, 10:01 PM)Anas Mahmoud كتب : اخي طريقة التعامل هذه مع البيانات تؤدي دائما لسلوك غير متوقع

الاسلوب الافضل هو استخدام SqlConnection محلي ينتهي بانتهاء العملية المطلوبة ، ابقاء كائن الاتصال حيا هو ما يسبب غالبا مشاكل عدم تحديث البيانات فعلا

الافضل ان تخزن نص الاتصال فقط بشكل عام ، وكل مرة نحتاج الى اتصال نقوم بعمل كائن اتصال SqlConnection باستخدام using

جرب ان تجعل الكود هكذا :

كود :
string connectionString = "نص الاتصال هنا";
string commandString = "insert into Cash (Account_Name,Date,Invoice_No,Department,Description,Debit,Credit,Project_Name,Remarks)values(@Account_Name,@Date,@Invoice_No,@Department,@Description,@Debit,@Credit,@Project_Name,@Remarks)";

using(SqlConnection conn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandString, con);) {
 cmd.Parameters.AddWithValue("Account_Name", cmbAccountName.Text);
 cmd.Parameters.AddWithValue("Date", dateTimePicker1.Text);
 cmd.Parameters.AddWithValue("Invoice_No", txtInvoiceNO.Text);
 cmd.Parameters.AddWithValue("Department", txtDepartment.Text);
 cmd.Parameters.AddWithValue("Description", txtDescription.Text);
 cmd.Parameters.AddWithValue("Debit", txtDebit.Text);
 cmd.Parameters.AddWithValue("Credit", txtCredit.Text);
 cmd.Parameters.AddWithValue("Project_Name", txtProjectname.Text);
 cmd.Parameters.AddWithValue("Remarks", txtRemarks.Text);

 con.Open();
 cmd.ExecuteNonQuery();
 con.Close();
}

MessageBox.Show("Add Successfully", "Add", MessageBoxButtons.OK, MessageBoxIcon.Information);
ClearBoxes();
FillData();
CalculateBalance();

وكذلك عدل FillData لتستخدم اسلوب using :

كود :
using(SqlConnection conn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandString, con);) {


}

هكذا تضمن ان كائن الاتصال لن يعيش طويلا

السلام عليكم اخوي 

عملت اللى قولتلي عليه ولكن للاسف المشكلة مازالت موجوده 
الرد
تم الشكر بواسطة: ابراهيم ايبو
#5
طيب اعطنا مثال صغير نعدل عليه ونتتبع المشكلة
الرد
تم الشكر بواسطة: maxruined , ابراهيم ايبو
#6
(01-12-20, 11:56 AM)Anas Mahmoud كتب : طيب اعطنا مثال صغير نعدل عليه ونتتبع المشكلة

شكرا جداً اخوي .. تم حل المشكلة .. العيب كان من عندي انا 
ولكن لي استفسار بسيط
فى الكود بتاعي بتاع الاضافه في الاول انا فاتح الاتصال وبعد الاضافه مباشرة قفلت الاتصال .. سؤالي هو اين المشكلة في الاتصال .. اقصد يعني الاتصال مقفول فعلا وليس حياً كما ذكرت سابقاً .. بتمني توضيح اكتر لفكرتك .. شكراً مقدماً
الرد
تم الشكر بواسطة: ابراهيم ايبو
#7
احيانا يسبب مشاكل تبقى البيانات معلقة الى ان يحين وقت ال Timeout

نظريا نعم طالما تفتح الاتصال وتغلقه لن يحدث مشاكل

ولكن يبقى الاسلوب غير امن لانه معتمد على ان لا تنسى ان تغلق الاتصال

واذا كان البرنامج كبير بما يكفي وحدث مشكلة بسبب اتصال مفتوح لن يكون تتبع الامر بسيط

اسلوب using ليس معتمد على ذلك ، بعد نهاية جملة using ينتهي الكائن ويغلق الاتصال تماما

وهو الاسلوب المتبع من مايكروسوفت نفسها : https://docs.microsoft.com/en-us/dotnet/...at-ext-5.0
الرد
تم الشكر بواسطة: maxruined , ابراهيم ايبو
#8
(01-12-20, 01:24 PM)Anas Mahmoud كتب : احيانا يسبب مشاكل تبقى البيانات معلقة الى ان يحين وقت ال Timeout

نظريا نعم طالما تفتح الاتصال وتغلقه لن يحدث مشاكل

ولكن يبقى الاسلوب غير امن لانه معتمد على ان لا تنسى ان تغلق الاتصال

واذا كان البرنامج كبير بما يكفي وحدث مشكلة بسبب اتصال مفتوح لن يكون تتبع الامر بسيط

اسلوب using ليس معتمد على ذلك ، بعد نهاية جملة using ينتهي الكائن ويغلق الاتصال تماما

وهو الاسلوب المتبع من مايكروسوفت نفسها : https://docs.microsoft.com/en-us/dotnet/...at-ext-5.0


شكراً جداً اخوي على معلوماتك القيمه

دمت بالف خير
الرد
تم الشكر بواسطة: ابراهيم ايبو



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم