الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في حفظ حقل من نوع Bit

بدأه محمد فؤاد تركي في 7 أغسطس 2012 · 6 رد · 717 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الزملاء

السلام عليكم ورحمة الله وبركاتة

كل عام وأنتم بخير

أحاول حفظ بيانات الي قاعدة البيانات ونوع الحقل Bit

هذا هو الــ Stored procedure المستخدم لحفظ البيانات وهو يعمل بشكل سليم من داخل قاعدة البيانات

ALTER proc [dbo].[ItemsSavedata]

(
@ItemNumber int 
,@ItemName bit 
,@Unit bit 
,@UnitPrice bit 
)

As
Begin

if not exists (Select ItemNumber,ItemName,Unit,UnitPrice
 from Items where ItemNumber = @ItemNumber
and ItemName = @ItemName and Unit = @Unit and UnitPrice = UnitPrice)

Begin
Insert Into Items (ItemNumber,ItemName,Unit,UnitPrice)
Values (@ItemNumber,@ItemName,@Unit,@UnitPrice)

end
end

وهذا هو الكود المستخدم عند تحميل الفورم

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dt.Columns.Add(New DataColumn("ItemNumber", System.Type.GetType("System.String")))
        dt.Columns.Add(New DataColumn("ItemName", System.Type.GetType("System.String")))
        dt.Columns.Add(New DataColumn("Unit", System.Type.GetType("System.String")))
        dt.Columns.Add(New DataColumn("UnitPrice", System.Type.GetType("System.String")))

        DataGridView1.DataSource = dt

        DataGridView1.Columns(0).HeaderText = "كود الصنف"
        DataGridView1.Columns(1).HeaderText = "العمود الثاني"
        DataGridView1.Columns(2).HeaderText = "العمود الثالث"
        DataGridView1.Columns(3).HeaderText = "العمود الرابع"

    End Sub

وهذا هو الكود المستخدم في حفظ البيانات الموجودة داخل DataGridView

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Sqlcon.Open()

            Dim insercommand As SqlCommand
            insercommand = New SqlCommand("ItemsSavedata", Sqlcon)
            insercommand.CommandType = CommandType.StoredProcedure

            insercommand.Parameters.Add("@ItemNumber", SqlDbType.Int, 4, "ItemNumber")
            insercommand.Parameters.Add("@ItemName", SqlDbType.Bit).Value = "ItemName"
            insercommand.Parameters.Add("@Unit", SqlDbType.Bit).Value = "Unit"
            insercommand.Parameters.Add("@UnitPrice", SqlDbType.Bit).Value = "UnitPrice"

            da.InsertCommand = insercommand
            da.Update(dt)

            Sqlcon.Close()

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

وعند الحفظ يحدث الخطأ وتظهر الرسالة التالية

post-46243-001526500 1344319593_thumb.jp

مرفق ملف يحتوي علي المثال

حفظ البيانات داخل داتا جريد فيو.rar

المرفقات
1.jpg

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#2

لقد قمت بتعديل الكود الخاص بالــ Form load ليقوم باظهار الخلايا الخاصة CheckBox علي داتا جريد فيو

ليصبح كالتالي

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dt.Columns.Add(New DataColumn("ItemNumber", System.Type.GetType("System.String")))
        dt.Columns.Add(New DataColumn("ItemName", GetType(Boolean)))
        dt.Columns.Add(New DataColumn("Unit", GetType(Boolean)))
        dt.Columns.Add(New DataColumn("UnitPrice", GetType(Boolean)))

        DataGridView1.DataSource = dt

        DataGridView1.Columns(0).HeaderText = "كود الصنف"
        DataGridView1.Columns(1).HeaderText = "العمود الثاني"
        DataGridView1.Columns(2).HeaderText = "العمود الثالث"
        DataGridView1.Columns(3).HeaderText = "العمود الرابع"

    End Sub

أيضا قمت بتعديل جملة الحفظ وقمت باضافة String.IsNullOrEmpty وبالفعل تم الحفظ لكن الحقول التي هي من نوع CheckBox تحفظ البيانات داخل قاعدة البيانات بــ False سواء قمت بالتأشير علي CheckBox أو لا

 Try


            Dim insercommand As SqlCommand
            insercommand = New SqlCommand("ItemsSavedata", Sqlcon)
            insercommand.CommandType = CommandType.StoredProcedure

            insercommand.Parameters.Add("@ItemNumber", SqlDbType.Int, 4, "ItemNumber")
            insercommand.Parameters.Add("@ItemName", SqlDbType.Bit).Value = String.IsNullOrEmpty("ItemName")
            insercommand.Parameters.Add("@Unit", SqlDbType.Bit).Value = String.IsNullOrEmpty("Unit")
            insercommand.Parameters.Add("@UnitPrice", SqlDbType.Bit).Value = String.IsNullOrEmpty("UnitPrice")

            Sqlcon.Open()
            da.InsertCommand = insercommand
            da.Update(dt)

            Sqlcon.Close()

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#3

مرفق المثال بعد عمل آخر تعديل فكما تلاحظون في الصورة أدناه ان جميع البيانات المحفوظة داخل قاعدة البيانات تكون False فقط ولا يتأثر CheckBox سواء تم التأشير علي بنعم أو لا

post-46243-043174200 1344327419_thumb.jp

حفظ البيانات داخل داتا جريد فيو.rar

المرفقات
1.jpg

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#4
//insercommand.Parameters.Add("@ItemNumber", SqlDbType.Int, 4, "ItemNumber")
insercommand.Parameters.Add("@ItemNumber", SqlDbType.Int, 4).Value = "ItemNumber"
insercommand.Parameters.Add("@ItemName", SqlDbType.Bit).Value = String.IsNullOrEmpty("ItemName")
insercommand.Parameters.Add("@Unit", SqlDbType.Bit).Value = String.IsNullOrEmpty("Unit")
insercommand.Parameters.Add("@UnitPrice", SqlDbType.Bit).Value = String.IsNullOrEmpty("UnitPrice")

السطر الأول يحوي خطأ .. لكن بكل الأحوال هذا ليس سبب مشكلتك

النمط Bit قيمته Boolean

عندما تنفذ String.IsNullOrEmpty("ItemName") فأنت ببساطة تقول له هل السلسلة النصية "ItemName" فارغة؟ :mellow:

طبيعي أن السلسلة النصية ليست فارغة فطبيعي أن تكون النتيجة false

ولذلك يظهر لديك false على كل شئ تقريباً.

إن كنت تريد تخزين القيمة "ItemName" فعليك اختيار نمط آخر .. مثلاً SqlDbType.VarChar مع تحديد الطول أو اختيار نمط NVarChar (لا أذكر إن كان موجود)

طبعاً السطر الأول غير صحيح لأنك تخزن قيمة String في حقل Int.. استبدل "ItemNumber" بـ 1 مثلاً وجرّب.

* أستخدم C# ولا أكتب بـ VB.NET لذا آمل ألا يكون الأمر مختلف وأنا أجيب عن عبط :lol:

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

أخي الفاضل Xacker

شكرا علي ردك

أنا لا أواجة أي مشاكل بخصوص السطر الاول وليس السطر الاول محل المشكلة

أما بخصوص تغيير نمط الحقل ItemNumber أو تغيير أنماط الحقول التي هي نمطها Bit الي Varchar أو Nvarchar

فتغيير النمط لم يفي بالغرض والفرق

انه تم تخزين القيمة بــ 0 بدلا من False

لذلك المطلوب عندما اقوم بالتأشير علي CheckBox تخزن القيمة داخل الجدول بـــ True واذا لم أقوم بالتأشير تخزن القيمة بــ False

أتمني ان تكون مشكلتي قد تكون واضحة

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#6

إذاً الموضوع يختلف عن C#

لذا أعتذر عن التدخل وأفسح المجال لغيري :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

تم حل المشكلة

شكرا للجميع

certifiedj.jpg

 

 

Image Hosted by ImageShack.us

مواضيع مشابهة