المشاركات : 108
المواضيع 40
الإنتساب : Oct 2013
السمعة :
1
الشكر: 0
تم شكره 28 مرات في 20 مشاركات
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.
المشاركات : 400
المواضيع 0
الإنتساب : Dec 2017
السمعة :
69
الشكر: 45
تم شكره 518 مرات في 326 مشاركات
القيمة الموجودة في العمود num يجب أن لا تتكرر
إذا كان العمود num هو ترقيم تلقائي لا تضعه في الاستعلام
المشاركات : 108
المواضيع 40
الإنتساب : Oct 2013
السمعة :
1
الشكر: 0
تم شكره 28 مرات في 20 مشاركات
العمود num ليس ترقيم تلقائي وليس مفتاح رئيسي
وفي قاعده البيانات خزنت فيه بيانات بنفس الرقم وقبلها البرنامج بدون مشكلة
المشاركات : 400
المواضيع 0
الإنتساب : Dec 2017
السمعة :
69
الشكر: 45
تم شكره 518 مرات في 326 مشاركات
21-12-17, 03:32 PM
(آخر تعديل لهذه المشاركة : 21-12-17, 03:35 PM {2} بواسطة طالب برمجة.)
اتضح أن المشكلة في عملية إضافة Parameters
فكان يجب إدخال Parameters.Clear في الحلقة For وتكون أول سطر وتنفيذ الاستعلام ExecuteNonQuery يكون قبل Next مباشرة
هذا تعديل الكود
PHP كود :
Try If Con.State <> 1 Then Con.Open() Using 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)" For i As Integer = 0 To (DataGridView1.Rows.Count - 1) .Parameters.Clear() .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 .ExecuteNonQuery() Next End With End Using MsgBox("تم إضافة السجل بنجاح", MsgBoxStyle.Information, "حفظ") Catch ex As Exception MsgBox(Err.Description, MsgBoxStyle.Information) Finally Con.Close() End Try
المشاركات : 108
المواضيع 40
الإنتساب : Oct 2013
السمعة :
1
الشكر: 0
تم شكره 28 مرات في 20 مشاركات
اشكرك جزيلا اخي الفاضل على التفاعل والرد على سؤالي ولكن جربت ما كتبت وخرجت هذ الرساله
يوجد بالفعل DataReader مفتوح مقترن بـ Command ويجب أن يتم إغلاقه أولاً
في نفس الكود السابق مش لاقي اشي فيه غلط يا ريت تساعدني
وشكرا مقدما
المشاركات : 813
المواضيع 24
الإنتساب : Oct 2012
السمعة :
230
الشكر: 1133
تم شكره 2180 مرات في 815 مشاركات
23-12-17, 12:03 AM
(آخر تعديل لهذه المشاركة : 23-12-17, 12:06 AM {2} بواسطة عبدالله الدوسري.)
هذا الكود بعد التعديل :
ملاحظة أخي الكريم
الـ 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 : أمر واحد يجلب الكل
المشاركات : 108
المواضيع 40
الإنتساب : Oct 2013
السمعة :
1
الشكر: 0
تم شكره 28 مرات في 20 مشاركات
تم حل المشكلة بفضل الله واشتغل الكود
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")
|