منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : ما هو الخطا في الكود التالي ( نسخ البيانات من داتا قرايد فيو الى قاعدة البيانات )
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
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.
القيمة الموجودة في العمود num يجب أن لا تتكرر
إذا كان العمود num هو ترقيم تلقائي لا تضعه في الاستعلام
العمود num ليس ترقيم تلقائي وليس مفتاح رئيسي
وفي قاعده البيانات خزنت فيه بيانات بنفس الرقم وقبلها البرنامج بدون مشكلة
اتضح أن المشكلة في عملية إضافة 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(0i).Value.ToString
                
.Parameters.AddWithValue("@q1"SqlDbType.Decimal).Value DataGridView1(2i).Value.ToString
                
.Parameters.AddWithValue("@q2"SqlDbType.Decimal).Value DataGridView1(3i).Value.ToString
                
.Parameters.AddWithValue("@price"SqlDbType.Decimal).Value DataGridView1(6i).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(4i).Value.ToString
                
.ExecuteNonQuery()
 
           Next
        End With
    End Using
    MsgBox
("تم إضافة السجل بنجاح"MsgBoxStyle.Information"حفظ")
Catch 
ex As Exception
    MsgBox
(Err.DescriptionMsgBoxStyle.Information)
Finally
 
   Con.Close()
End Try 
اشكرك جزيلا اخي الفاضل على التفاعل والرد على سؤالي ولكن جربت ما كتبت وخرجت هذ الرساله
يوجد بالفعل DataReader مفتوح مقترن بـ Command ويجب أن يتم إغلاقه أولاً
في نفس الكود السابق مش لاقي اشي فيه غلط يا ريت تساعدني
وشكرا مقدما
هذا الكود بعد التعديل :
ملاحظة أخي الكريم
الـ 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 : أمر واحد يجلب الكل
تم حل المشكلة بفضل الله واشتغل الكود

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")