سؤال لخبراء تصميم واجهات البرمجيات
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
في ال Windows App نستطيع استخدام الأداة DataGridView و التي من خلالها أستطيع أن أقوم بادخال عدة بنود
ومن ثم بالضغط على زر الارسال يتم تسجيل البنود كافة في قاعدة البيانات

أما لنفس البرنامج لكن على Pocket PC App فلا توجد الأداة DGV بل توجد الأداة DataGrid بحيث أنني لم أستطع من خلالها
أن أقوم بنفس الطريقة المتبعة من خلال DGV و خصوصا أن DG لاتملك navigator bar يمكن من خلاله أن أقوم بعملية
اضافة للبنود أو الحذف
لذلك اضطررت لأن أقوم ببناء واجهة ال PPC app كالتالي :

وعند حدث SelectChange للعنصر ComboBpx الخاص ب Quantity أقوم بتنفيذ منهح الاتصال بقاعدة البيانات
و تخزين البند ( فمثلا لوكان لدي بالفاتورة 10 بنود بالتالي أنا مضطر لأن أقوم باستدعاء منهج الاتصال و التخزين عشر مرات )
بالاضافة الى أن العنصر ComboBox حساس جدا في واجهة جهاز الPocket Pc الحساس للمس ، وبالتالي امكانية ادخال بيانات خاطئة كبير جدا
لذلك سؤالي هل توجد طريقة ما يمكن أن أتبعها لتوفير هذه المشاكل ؟؟
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات | قراءة: 338 |
|
مشرف
تاريخ التسجيل: 2006-10-12 مشاركات: 1645
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الرابعة الاختصاص: هندسة برمجيات
|
طيب ليش الحدث ما يكون هو button Click
New look, new work, new laptop, new room, new challenges,and many new stuff It's not my birthday it's my revolution
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
كتب NightWolf: طيب ليش الحدث ما يكون هو button Click
لأنه وقت تضغط الزر يجب أن يتم التخزين في جدول الفاتورة Invoice
أما وقت تختار البنود سوف يتم التخزين في جدول المبيعات Sales
بحيث أن الفاتورة الواحدة لها عدة بنود و بالتالي بيانات كل من الجدةولين مختلفين
وطبعا على خلاف الواجهة يلي بتطبيق Windows App لا يمكن أن أقوم بتخزين الفاتورة مع باقي البنود بضغطة زر واحدة على الPocket
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مشرف
تاريخ التسجيل: 2006-10-12 مشاركات: 1645
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الرابعة الاختصاص: هندسة برمجيات
|
ما فهمت عليك حسب ما شفت البيانات هي بيانات فاتورة يعني بتخزن بالفواتير .
قصدك عم تعمل Update على جدول تاني كمان ؟
New look, new work, new laptop, new room, new challenges,and many new stuff It's not my birthday it's my revolution
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
كتب NightWolf: ما فهمت عليك حسب ما شفت البيانات هي بيانات فاتورة يعني بتخزن بالفواتير .
قصدك عم تعمل Update على جدول تاني كمان ؟
أنا عندي جدولين واحد للفواتير و الآخر للمبيعات
جدول الفواتير بياخد ( No PK , Date , Customer , Sum )
جدول المبيعات ( No + Pro_ID Pk , Quantity , Price )
بما أنه الفاتورة يمكن أن تتضمن شراء أكثر من مادة
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مشرف
تاريخ التسجيل: 2006-10-12 مشاركات: 1645
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الرابعة الاختصاص: هندسة برمجيات
|
طيب خلي عملية بناء الفاتورة Wizard ..
يعني كل ما بدو يشتري شغلة بيكبس Next وهيك لحتى يخلص .. بس يخلص ممكن تخليه يخزن الفاتورة
New look, new work, new laptop, new room, new challenges,and many new stuff It's not my birthday it's my revolution
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
كتب bayrn:
وعند حدث SelectChange للعنصر ComboBpx الخاص ب Quantity أقوم بتنفيذ منهح الاتصال بقاعدة البيانات
و تخزين البند ( فمثلا لوكان لدي بالفاتورة 10 بنود بالتالي أنا مضطر لأن أقوم باستدعاء منهج الاتصال و التخزين عشر مرات )
مو منطقية نهائياً هالطريقة!
في عندك اسلوبين لحتى اتدخل بيانات Master-Details (متل الفاتورة)
الطريقة الأولى متل الي انت مستخدمها بالبرنامج الأول (يعني ادخال البنود من خلال الـgrid مباشرةً)
الطريقة التانية بكون عندك read-only grid أو listbox وادخال البنود من خلال dialog (بكون في زر Add Item بجانب الـ grid)
(طبعاً البيانات مابتنبعت على قاعدة البيانات وانما بتتخزن بالذاكرة)
أما طريقة التخزين ممكن تخزن البنود بـ DataTable وبعدين من خلال DataAdapter تحفظ التغييرات إلى قاعدة البيانات.
ولاتنسى انو تغلف العملية كلها (عملية حفظ الفاتورة) بـtransaction وحدة.
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
كتب foaad:
مو منطقية نهائياً هالطريقة!
لكن أنا ليش طرحت السؤال و عذبت حالي
كتب foaad:
في عندك اسلوبين لحتى اتدخل بيانات Master-Details (متل الفاتورة)
الطريقة الأولى متل الي انت مستخدمها بالبرنامج الأول (يعني ادخال البنود من خلال الـgrid مباشرةً)
ما أنا ذكرت أنه ما ظبطت هي الطريقة في ال Pocket PC App بحيث أن البرنامج الأول استخدمت DataGridView بحيث أنا فيني أنشأ أعمدة
بس وقت فتحت مشروع Pocket PC مافي عنصر DGV بس في DG و ما في خاصية انشاء أعمدة و بالتالي حسيت أنه هالعنصر بس لاستيراد بيانات من جدول في قاعدة معطيات
كتب foaad:
الطريقة التانية بكون عندك read-only grid أو listbox وادخال البنود من خلال dialog (بكون في زر Add Item بجانب الـ grid)
(طبعاً البيانات مابتنبعت على قاعدة البيانات وانما بتتخزن بالذاكرة)
هلأ هي فكرة منطقية أنه ضيف ListBox وبعدين عنطرقها ضيف العناصر ثم خزنهن دفعة واحدة ، بس المشكلة الواجهة ما فيها مكان لهذا العنصر عنصر كبير صعي أنا فيني أتحكم بحجمه بس على الأقل يجب أن يكون بارتفاع أربعو بنود
كتب foaad:
أما طريقة التخزين ممكن تخزن البنود بـ DataTable وبعدين من خلال DataAdapter تحفظ التغييرات إلى قاعدة البيانات.
بدي عذبك معي ممكن تشرحلي ياها بالكود
كتب foaad:
ولاتنسى انو تغلف العملية كلها (عملية حفظ الفاتورة) بـtransaction وحدة.
شو قصدك هون بال Transaction هل تعني أنه يكون عندي منهج اتصال و تخزين البيانات تبع الفاتورة يلي هي بدها تتخزن بجدولين ، بحيث أنه بعملية فتح اتصال واحدة أقوم بتنفيذ جميع تعليمات
SqlCommand و من ثم اغلق الاتصال بقاعدة البيانات
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|

قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2006-09-28 مشاركات: 298
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الثالثة
|
ليش عال pocket PC app مافي data adapter؟؟
..dont limp at the disabled boulevard
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
ممكن تعملها متل هيك شي:

(هي مجرد رسمة بس على الأغلب فيك تعمل متلها)
استخدم DataGrid بحيث تقرأ من DataTable (موشرط يكون في Table مقابل بقاعدة البيانات) ولما المستخدم يكبس Add طلعلوا Dialog من خلاله بدخل معلومات بند (سطر) واحد وبتم تخزين المعلومات بالـ DataTable
وبعدين لما يكبس OK أو حفظ الفاتورة بتفتح اتصال مع قاعدة البيانات (أنا بفضل يكون الاتصال مفتوح دائماً) وبتفتح Transaction وبتخزن رأس الفاتورة وبعدين بنود الفاتورة وبعدين بتعمل Commit للـ Transaction وبتسكر الاتصال.
يعني عملية التخزين يدوية.
مابعرف اذا في عناصر تحكم أو مكونات ممكن تأتمت هالعملية بالـ compact framework على الأغلب فيك تستخدم DataAdapter بس بأسواء الأحوال ممكن تعملها من خلال حلقة وأوامر Insert و/أو Update
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
على فكرة انت موضح شغلة هو أنه لازم يكون ال Label من اليسار لليمين لأنه بالانكليزي ، لكن أنا بدي ساوي بالعربي بشان هيك من اليمين لليسار ، و هي مشكلة عندي أنو وقت عم حط ال LAbel عربي ما عم يترمز على ال Pocket PC
هلأ حضرتك ذكرت أنه يجب أن أعمل Commite ، كيف برمجيا ؟
هي الطريقة المتبعة في البرنامج الأول استخدمت حلقة For لتحزين البنود
private void rec_btn_Click(object sender, EventArgs e){ //DGV = DataGridView int crow = DGV.RowCount;if (DGV[0, 0].Value == "" || DGV[1, 0].Value == "" || DGV[2, 0].Value == "" || DGV[3, 0].Value == "") { MessageBox.Show("تأكد من البيانات");} //تخزين بيانات الفاتورة else { try { connect.Open(); //SqlCommand comm = new SqlCommand(); comm.Connection = connect; comm.CommandText = "INSERT INTO invoice (stoid,customer,dat,datid)";comm.CommandText += "VALUES ('" + stoID_Box.Text +"','" + cust_Box.Text + "','" + datBox.Text +"','" + datID_Box.Text + "' ";comm.ExecuteNonQuery(); //تخزين بيانات المبيعات for (int row = 0; row < crow - 1; row++){ ArrayList list = new ArrayList(4); for (int col = 0; col < 4; col++) { list.Add(DGV[col, row].Value); } comm.CommandText = "INSERT INTO stosale (invid,procode,quant,price,totprice)";comm.CommandText += "VALUES ('" + type +"','" + list[index] + "','" + list[index + 1] +"','" + list[index + 2] + "','" + list[index + 3] + "' ";comm.ExecuteNonQuery(); index = 0; } }
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
It should be something like this:
SqlConnection mainConnection = new SqlConnection();
mainConnection.Open();
//Start a transaction
SqlTransaction mainTransaction = mainConnection.BeginTransaction();
SqlCommand invoiceCommand = new SqlCommand();
invoiceCommand.Connection = mainConnection;
//Pass the transaction to the command elsewise it'll fail
invoiceCommand.Transaction = mainTransaction;
//You can initilize the Command text once...
invoiceCommand.CommandText = "INSERT INTO Invoice(StoreID, CustomerID, Date, SeasonID) " +
"VALUES(@StoreID, @CustomerID, @Date, @SeasonID)";
//Add its parameters once...
invoiceCommand.Parameters.Add(new SqlParameter("@StoreID", SqlDbType.Int));
invoiceCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.Int));
invoiceCommand.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime));
invoiceCommand.Parameters.Add(new SqlParameter("@SeasonID", SqlDbType.Int));
//And then you can assign the values and execute as many times as you want
invoiceCommand.Parameters["@StoreID"].Value = cboStore.Value;
//cboStore is a ComboBox where the text is the name of the store and the value is its ID
//the user should not write the ID by hand but select the store name from the
//pre-populated ComboBox
invoiceCommand.Parameters["@CustomerID"].Value = cboCustomer.Value;
invoiceCommand.Parameters["@Date"].Value = dtbInvoiceDate.Value;
invoiceCommand.Parameters["@SeasonID"].Value = cboSeason.Value;
invoiceCommand.ExecuteNonQuery();
//Items command. same approach as above...
SqlCommand saleCommand = new SqlCommand();
saleCommand.Connection = mainConnection;
saleCommand.Transaction = mainTransaction;
saleCommand.CommandText = "INSERT INTO StoreSale(InvoiceID, ProductID, Qty, Price) " +
"VALUES(@InvoiceID, @ProductID, @Qty, @Price)";
saleCommand.Parameters.Add(new SqlParameter("@InvoiceID", SqlDbType.Int));
saleCommand.Parameters.Add(new SqlParameter("@ProductID", SqlDbType.Int));
saleCommand.Parameters.Add(new SqlParameter("@Qty", SqlDbType.Float));
saleCommand.Parameters.Add(new SqlParameter("@Price", SqlDbType.Float));
//TotalPrice is calculated (using a calculated column or using a view)
for (int rowIndex = 0; rowIndex < dgvBillItems.RowCount - 1; rowIndex++)
{
saleCommand.Parameters["@InvoiceID"].Value = invoiceID; // Where is it comming from?!
saleCommand.Parameters["@ProductID"].Value = dgvBillItems["ProductID", rowIndex].Value;
saleCommand.Parameters["@Qty"].Value = dgvBillItems["Qty", rowIndex].Value;
saleCommand.Parameters["@Price"].Value = dgvBillItems["Price", rowIndex].Value;
saleCommand.ExecuteNonQuery();
}
// It's a good idea to do the checking at this point (in the database)
// by calling a stored procedure which return 0 if everything is OK
// or an error code otherwise
//Commit or rollback the transaction (based on the previous result)
mainTransaction.Commit();
mainConnection.Close();
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
In fact Mr.Foaad I dont konw how to thank you .
But I Wonder what do you mean exactly by checking DB at prticular point
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
قصدي يكون في اجرائية (stored procedure) بقاعدة البيانات بتتحقق من صحة كامل بيانات الفاتورة وتحقيقها لشروط العمل (Business Logic) أو ممكن يكون Trigger
اذا اجرائية بكون عندك اجرائية بتاخد ID الفاتورة وبترجع رقم الخطأ (اذا كان في خطأ)
واذا Trigger فبكون في عندك حقل بجدول الفاتورة مثلاً Posted بياخدالقيمة 0 بشكل افتراضي (وبتكون الفاتورة لساها مسودة)
بعدين بعد ادراج البنود بتعمله Update إلى 1 وبيشتغل الـ trigger وبيتحقق من صحة بيانات الفاتورة واذا في أي مشكلة بيعمل rollback
ليش لازم يكون التحقق بقاعدة البيانات؟ لأنو في شروط مرتبطة ببيانات موجودة بجداول تانية وصعب جداً (بس مو مستحيل) تقرأ كل هالبيانات من البرنامج وتتحقق من الشروط (لأنو بتصير عملية بطيئة كتير) وبعدين تخزن الفاتورة.
مثلاً بجوز بدك تمنع المستخدم من بيع كمية أكتر من الكمية المتوفرة بالمستودع (أو بأسواء الأحوال بدك تمنع مستخدم محدد من انو يبيع مادة محددة تحت سعر محدد لزبون محدد).
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
لك والله يا سيد فؤاد غريب أنا حاسس أنه مشاريع قواعد بيانات بهالحجم ما ممكن تظبط على Pocket pc
الآن هناك عدة أسئلة مهمة لا أجد الاجابة عليها سوف أقوم بطرحها
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
هذه الأسئلة تحتاج الى اختصاصي هندسة برمجيات :
سؤال 1- :
وقت عم اشتغل القاعدة على SQL SERVER Compact عمتكون لاحقة ملف قاعدة المعطيات sdf بحيث لايوجد غير ملف وحيد لا يمكنني تحديد حجمه
هذا يدفعني الى السؤال الثاني
سؤال 2- :
حجم ذاكرة ال pocket pc يلي عمأشتغل البرنامج عليه 48 ميغا مع امكانية اضافة كرت ذاكرة ، هل ملف القاعدة يمكنأن يتمدد تلقائيا و أن يقوم باستهلاك ذاكرة من كرت الذاكرة عند امتلاء ذاكرة الجهاز ، وان كان لا هذا يقودني الى سؤال آخر
سؤال 3 -
هل يمكنني اتباع طريقة لكي أقوم بتفريغ جداول القاعدة مثل جدول الفاتورة من البيانات كل فترة محددة و تخزين هذه البيانات في ملف آخر
سؤال 4 -
من شان توفير حجم اذا كان من الممكن اكمال البرنامج مع العوائق السابقة ، هل من المنطقي أن أقوم باستخدام أنماط معطيات الحقول كالتلي :
بدلا من smallmony يللي بدها 4 بايت باستخدم nvarchar
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
كتب bayrn:
حجم ذاكرة ال pocket pc يلي عمأشتغل البرنامج عليه 48 ميغا مع امكانية اضافة كرت ذاكرة ، هل ملف القاعدة يمكنأن يتمدد تلقائيا و أن يقوم باستهلاك ذاكرة من كرت الذاكرة عند امتلاء ذاكرة الجهاز ، وان كان لا هذا يقودني الى سؤال آخر
لأ. لازم تكون حاطط الملف على كرت الذاكرة لحتى يستخدمو
كتب bayrn:
هل يمكنني اتباع طريقة لكي أقوم بتفريغ جداول القاعدة مثل جدول الفاتورة من البيانات كل فترة محددة و تخزين هذه البيانات في ملف آخر
ببرامج المحاسبة والمستودعات عادة بكون في عملية اسمها تدوير قاعدة البيانات
يعني بتاخد بس البيانات الاجمالية على قاعدة جديدة وبتترك القاعدة القديمة كأرشيف.
وبتصير بتستخدم القاعدة الجديدة
كتب bayrn:
من شان توفير حجم اذا كان من الممكن اكمال البرنامج مع العوائق السابقة ، هل من المنطقي أن أقوم باستخدام أنماط معطيات الحقول كالتلي :
بدلا من smallmony يللي بدها 4 بايت باستخدم nvarchar
لأ الحقول الرقمية أوفر من nvarchar وكمان بالنسبة للأداء أفضل.
كتب bayrn:
هذه الأسئلة تحتاج الى اختصاصي هندسة برمجيات
الأسئلة السابقة مالها علاقة بهندسة البرمجيات!
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
هل تؤمن لي ال Dot NET عن طريق ADO التعاملمع Connection String بشكل ديناميكي
فمثلا عند بناء التطبيق مع قاعدة البناء و اجراء ال Test على الEmulator يكون ال ConnectionString = "DataSource=".\\DB.sdf"
ولكن عندما أقوم بعملية Deploy للمشروع على الPocet pc ملف القاعدة عم يصير مع الملف exe بنفس المجلد و بالتالي عم يتغير ال Source
هل بامكاني أن اعمل connstr بشكل ديناميكي بدون واجهة لجلب الملف و بالتالي الحصول على المسار
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
ملف قاعدة البيانات بنفس المجلد مع الملف EXE للبرنامج
ConnectionString = "Data Source = .\\Auto.sdf
عم يعطي رسالة File not found يقصد به Auto ملف قاعدة البيانات
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2008-03-05 مشاركات: 785
الجامعة: الافتراضية الكلية: تكنولوجيا المعلومات المرحلة: السنة الرابعة الاختصاص: غير ذلك
|
كتب foaad:
It should be something like this:
SqlConnection mainConnection = new SqlConnection();
mainConnection.Open();
//Start a transaction
SqlTransaction mainTransaction = mainConnection.BeginTransaction();
SqlCommand invoiceCommand = new SqlCommand();
invoiceCommand.Connection = mainConnection;
//Pass the transaction to the command elsewise it'll fail
invoiceCommand.Transaction = mainTransaction;
//You can initilize the Command text once...
invoiceCommand.CommandText = "INSERT INTO Invoice(StoreID, CustomerID, Date, SeasonID) " +
"VALUES(@StoreID, @CustomerID, @Date, @SeasonID)";
//Add its parameters once...
invoiceCommand.Parameters.Add(new SqlParameter("@StoreID", SqlDbType.Int));
invoiceCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.Int));
invoiceCommand.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime));
invoiceCommand.Parameters.Add(new SqlParameter("@SeasonID", SqlDbType.Int));
//And then you can assign the values and execute as many times as you want
invoiceCommand.Parameters["@StoreID"].Value = cboStore.Value;
//cboStore is a ComboBox where the text is the name of the store and the value is its ID
//the user should not write the ID by hand but select the store name from the
//pre-populated ComboBox
invoiceCommand.Parameters["@CustomerID"].Value = cboCustomer.Value;
invoiceCommand.Parameters["@Date"].Value = dtbInvoiceDate.Value;
invoiceCommand.Parameters["@SeasonID"].Value = cboSeason.Value;
invoiceCommand.ExecuteNonQuery();
//Items command. same approach as above...
SqlCommand saleCommand = new SqlCommand();
saleCommand.Connection = mainConnection;
saleCommand.Transaction = mainTransaction;
saleCommand.CommandText = "INSERT INTO StoreSale(InvoiceID, ProductID, Qty, Price) " +
"VALUES(@InvoiceID, @ProductID, @Qty, @Price)";
saleCommand.Parameters.Add(new SqlParameter("@InvoiceID", SqlDbType.Int));
saleCommand.Parameters.Add(new SqlParameter("@ProductID", SqlDbType.Int));
saleCommand.Parameters.Add(new SqlParameter("@Qty", SqlDbType.Float));
saleCommand.Parameters.Add(new SqlParameter("@Price", SqlDbType.Float));
//TotalPrice is calculated (using a calculated column or using a view)
for (int rowIndex = 0; rowIndex < dgvBillItems.RowCount - 1; rowIndex++)
{
saleCommand.Parameters["@InvoiceID"].Value = invoiceID; // Where is it comming from?!
saleCommand.Parameters["@ProductID"].Value = dgvBillItems["ProductID", rowIndex].Value;
saleCommand.Parameters["@Qty"].Value = dgvBillItems["Qty", rowIndex].Value;
saleCommand.Parameters["@Price"].Value = dgvBillItems["Price", rowIndex].Value;
saleCommand.ExecuteNonQuery();
}
// It's a good idea to do the checking at this point (in the database)
// by calling a stored procedure which return 0 if everything is OK
// or an error code otherwise
//Commit or rollback the transaction (based on the previous result)
mainTransaction.Commit();
mainConnection.Close();
هلأ أنا الى الآن ما جربت الكود هذا ما فضيت و هلأ بدي جربو ، بس في عندي سؤال
شو بيتميز هالكود عن يلي حطيتوا أنا غير بتنفيذال transaction
مع العلم أيضا أنه وقت كنت عم قوم بتنفيذ كودي بدون transaction commit كان عم يتم التخزين ، أيهما الأفضل ؟؟
قرأتُ مجدَكِ في قلبي و في الكُتُـبِ شَـآمُ ، ما المجدُ؟ أنتِ المجدُ لم يَغِبِ
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3116
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
كتب bayrn:
هلأ أنا الى الآن ما جربت الكود هذا ما فضيت و هلأ بدي جربو ، بس في عندي سؤال
شو بيتميز هالكود عن يلي حطيتوا أنا غير بتنفيذال transaction
مع العلم أيضا أنه وقت كنت عم قوم بتنفيذ كودي بدون transaction commit كان عم يتم التخزين ، أيهما الأفضل ؟؟
الفائدة من الـtransaction هي انو اما بتم تنفيذها كلها سوى أو لأ يعني اذا صار أيا مشكلة وتوقف البرنامج عن التنفيذ قبل تعليمة الـ commit مارح يتنفذ شي (رح يتم التراجع عن التغييرات) وبالتالي مارح يصير عندك حالة رأس فاتورة بدون بنود أو بنود ناقصين بسبب اغلاق البرنامج اثناء عملية تخزين الفاتورة
الفرق التاني المهم هو استخدام SqlParameters بدل من بناء شريط محرفي بمثل تعليمة الـ sql وهي الطريقة أفضل بكتير
وبظن في فروقات بالتسمية وهيك شغلات بحيث يكون الكود maintainable أكتر
|
| |
دخول أو تسجيل لإرسال التعليقات |
|