![]() |
|
ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183) +--- الموضوع : ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) (/showthread.php?tid=23010) |
ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - nooralcown - 21-12-17 Dim CmdInsert As New SqlCommand With CmdInsert .Connection = Con .CommandType = CommandType.Text .CommandText = "Insert Into store_id (num , date , mowared , senfnum , q1 , q2 , price , currencey , currenceyrate , stornum)values( @num , @date , @mowared , @senfnum , @q1 , @q2 , @price , @currencey , @currenceyrate , @stornum)" .Parameters.Clear() For i As Integer = 0 To (DataGridView1.Rows.Count - 1) .Parameters.AddWithValue("@num", SqlDbType.Int).Value = Val(TextBox1.Text) .Parameters.AddWithValue("@date", SqlDbType.Date).Value = Dtpdate.Value .Parameters.AddWithValue("@mowared", SqlDbType.Int).Value = Val(TextBox2.Text) .Parameters.AddWithValue("@senfnum", SqlDbType.Int).Value = DataGridView1(0, i).Value.ToString .Parameters.AddWithValue("@q1", SqlDbType.Decimal).Value = DataGridView1(2, i).Value.ToString .Parameters.AddWithValue("@q2", SqlDbType.Decimal).Value = DataGridView1(3, i).Value.ToString .Parameters.AddWithValue("@price", SqlDbType.Decimal).Value = DataGridView1(6, i).Value.ToString .Parameters.AddWithValue("@currencey", SqlDbType.Int).Value = Val(TextBox9.Text) .Parameters.AddWithValue("@currenceyrate", SqlDbType.Decimal).Value = Val(TextBox10.Text) .Parameters.AddWithValue("@stornum", SqlDbType.Int).Value = DataGridView1(4, i).Value.ToString Next ' Try If Con.State = 1 Then Con.Close() Con.Open() CmdInsert.ExecuteNonQuery() Con.Close() MsgBox("تم إضافة السجل بنجاح", MsgBoxStyle.Information, "حفظ") CmdInsert = Nothing ' Catch ex As Exception ' 'Con.Close() ' MsgBox(Err.Description, MsgBoxStyle.Information) ' Finally If Con.State = ConnectionState.Open Then Con.Close() End With ' End Try الخطا الذي يخرج يقول The variable name '@num' has already been declared. Variable names must be unique within a query batch or stored procedure. RE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - طالب برمجة - 21-12-17 القيمة الموجودة في العمود num يجب أن لا تتكرر إذا كان العمود num هو ترقيم تلقائي لا تضعه في الاستعلام RE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - nooralcown - 21-12-17 العمود num ليس ترقيم تلقائي وليس مفتاح رئيسي وفي قاعده البيانات خزنت فيه بيانات بنفس الرقم وقبلها البرنامج بدون مشكلة RE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - طالب برمجة - 21-12-17 اتضح أن المشكلة في عملية إضافة Parameters فكان يجب إدخال Parameters.Clear في الحلقة For وتكون أول سطر وتنفيذ الاستعلام ExecuteNonQuery يكون قبل Next مباشرة هذا تعديل الكود PHP كود : TryRE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - nooralcown - 22-12-17 اشكرك جزيلا اخي الفاضل على التفاعل والرد على سؤالي ولكن جربت ما كتبت وخرجت هذ الرساله يوجد بالفعل DataReader مفتوح مقترن بـ Command ويجب أن يتم إغلاقه أولاً في نفس الكود السابق مش لاقي اشي فيه غلط يا ريت تساعدني وشكرا مقدما RE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - عبدالله الدوسري - 23-12-17 هذا الكود بعد التعديل : ملاحظة أخي الكريم الـ SqlCommand من صفاتة أنه يقوم بالتنفيذ على مستوى السجل الواحد فقط وركز على كلمة فقط إذا كان الأمر (INSERT أو UPDATE أو DELETE), ولا يقوم بتنفيذ أمر إدخال لجميع السجلات دفعة واحدة المشكلة انك تقوم بعمل اللإتفاف (Loop) على داتا قريد فيو موجودة لديك وفي كل لفة أنت تعيد إضافة نفس البراميترات في أمر SqlCommand في نهاية كل لفة يجب تنفيذ الأمر CmdInsert.ExecuteNonQuery لإرسال القيم في هذة اللفة (Loop) وعند دخولك على اللفة (Loop) الثانية تقوم بعمل Parameters.Clear ثم ترجع وتضيف البراميترات مرة أخرى بقيم أخرة وفي نهاية اللفة تنفذ CmdInsert.ExecuteNonQuery أرجوا تكون وصلت الفكرة هذة القاعدة تسري على INSERT و UPDATE و DELETE : كلهم يتم تنفيذهم على مستوى السجل الواحد بمعنى لو عندك 100 سجل لإضافتهم لقاعدة البيانات : يجب أن تنفذ 100 أمر INSERT بمعنى لو عندك 100 سجل لتحديثهم لقاعدة البيانات : يجب أن تنفذ 100 أمر UPDATE بمعنى لو عندك 100 سجل لحذفهم لقاعدة البيانات : يجب أن تنفذ 100 أمر DELETE ما عدى SELECT : أمر واحد يجلب الكل RE: ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات ) - nooralcown - 23-12-17 تم حل المشكلة بفضل الله واشتغل الكود Con.Close() Dim cmd As New SqlCommand Dim sql As String For i As Integer = 0 To (DataGridView1.Rows.Count - 1) sql = "Insert Into storedetail (num , datea , mowared , itemnum , q1 , q2 , price , currencey , currenceyrate , stornum)values( @num , @datea , @mowared , @itemnum , @q1 , @q2 , @price , @currencey , @currenceyrate , @stornum)" cmd = New SqlCommand(sql, Con) With cmd .Connection = Con .CommandType = CommandType.Text .CommandText = "Insert Into storedetail (num , datea , mowared , itemnum , q1 , q2 , price , currencey , currenceyrate , stornum)values( @num , @datea , @mowared , @itemnum , @q1 , @q2 , @price , @currencey , @currenceyrate , @stornum )" Con.Open() .Parameters.Clear() .Parameters.AddWithValue("@num", SqlDbType.Int).Value = Val(TextBox1.Text) .Parameters.AddWithValue("@datea", SqlDbType.Date).Value = Dtpdate.Value .Parameters.AddWithValue("@mowared", SqlDbType.Int).Value = Val(TextBox2.Text) .Parameters.AddWithValue("@itemnum", SqlDbType.Int).Value = DataGridView1(0, i).Value.ToString Try .Parameters.AddWithValue("@q1", SqlDbType.Decimal).Value = DataGridView1(2, i).Value.ToString .Parameters.AddWithValue("@q2", SqlDbType.Decimal).Value = DataGridView1(3, i).Value.ToString .Parameters.AddWithValue("@price", SqlDbType.Decimal).Value = DataGridView1(6, i).Value.ToString Catch ex As Exception End Try .Parameters.AddWithValue("@currencey", SqlDbType.Int).Value = Val(TextBox9.Text) .Parameters.AddWithValue("@currenceyrate", SqlDbType.Decimal).Value = Val(TextBox10.Text) .Parameters.AddWithValue("@stornum", SqlDbType.Int).Value = DataGridView1(4, i).Value.ToString End With cmd.ExecuteNonQuery() Con.Close() Next MessageBox.Show("ok") |