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

مشكلة في انسرت جدول وهمي

بدأه السيد الهاشمي في 18 نوفمبر 2011 · 11 رد · 548 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف الحال اخواني اعضاء ومشرفين المنتدى ..

عندي هذه الانسرت عملت جدول وهمي .. واريد ان اعرض البيانات الي اضيفها في الجدول والهمي في قرد فيو . ولكن يقولي تعذر العثور على العمود (0) موش عارف ليش يطلع لي هذه الخطاء ياليت تقولو لي ايش الخطاء في الكود وشكراْ

   Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        xx()
    End Sub
    Sub xx()
        Dim tab1 As New DataTable
        tab1.PrimaryKey = New DataColumn() {tab1.Columns(0)}
        Dim tabIDclom As New DataColumn("ID", GetType(Integer))
        tabIDclom.Caption = "id"
        tabIDclom.AllowDBNull = False
        tabIDclom.Unique = True
        Dim tabname As New DataColumn("name ", GetType(String))
        tabname.Caption = "name"
        Dim tabsal As New DataColumn("sal", GetType(Integer))
        tabsal.Caption = "sal"
        Dim tabage As New DataColumn("age", GetType(Integer))
        tabsal.Caption = "age"
        tab1.Columns.AddRange(New DataColumn() {tabIDclom, tabname, tabsal, tabage})
        Dim row As DataRow = tab1.NewRow()
        row("name") = "taha"
        row("sal") = 1000
        row("age") = 20
        ds = New DataSet
        ds.Tables.Add(tab1)
        GridView1.DataSource = ds.Tables(0)
        GridView1.DataBind()

    End Sub
#2

السلام عليكم ..

  1. المشكلة الأولى أنك تقول له ان يجعل العمود الأول كمفتاح للجدول في حين أن الجدول ليس فيه أعمدة بعد و الحل هو باضافة الأعمدة للجدول ثم إضافة المفتاح .
  2. المشكلة الثانية هي وجود فراغ بعد اسم العمود name و يجب إزالته أو استخدام اسمه مع الفراغ .
  3. الكود يعمل :
    Dim tab1 As New DataTable
        	Dim tabIDclom As New DataColumn("ID", GetType(Integer))
        	tabIDclom.Caption = "id"
        	tabIDclom.AllowDBNull = False
        	tabIDclom.Unique = True
        	Dim tabname As New DataColumn("name", GetType(String))
        	tabname.Caption = "name"
        	Dim tabsal As New DataColumn("sal", GetType(Integer))
        	tabsal.Caption = "sal"
        	Dim tabage As New DataColumn("age", GetType(Integer))
        	tabsal.Caption = "age"
        	tab1.Columns.AddRange(New DataColumn() {tabIDclom, tabname, tabsal, tabage})
        	tab1.PrimaryKey = New DataColumn() {tab1.Columns(0)}
        	Dim row As DataRow = tab1.NewRow()
        	row("name") = "taha"
        	row("sal") = 1000
        	row("age") = 20
        	ds = New DataSet
        	ds.Tables.Add(tab1)
        	DataGridView1.DataSource = ds.Tables(0)
        	DataGridView1.DataBind()

2

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

مششكور اخي على الرد

بس لازالت هناك مشكله: الان مايطلع لي خطاء بس مايعرض البيانات في الغرد فيو ؟ ليش مايعرضها ؟ المفروض اني عند مااضغط البوتون اقوم باستدعاء الداله وتتخزن البيانات لي التيبل وبعدها تنعرض في الغرد فيو طيب ليش ماتنعرض ؟

#4

السلام عليكم ..

معك حق ..

لدينا مشكلتان :

  1. العمود id هو مفتاح و بالتالي لا يمكن أن يقبل القيم null لذلك نضع الكود :
    row("id") = 1

  2. يجب إضافة السطر الجديد إلى أسطر الجدول :
    tab1.Rows.Add(row)

الكود كاملا :

Dim tab1 As New DataTable
    	Dim tabIDclom As New DataColumn("ID", GetType(Integer))
    	tabIDclom.Caption = "id"
    	tabIDclom.AllowDBNull = False
    	tabIDclom.Unique = True
    	Dim tabname As New DataColumn("name", GetType(String))
    	tabname.Caption = "name"
    	Dim tabsal As New DataColumn("sal", GetType(Integer))
    	tabsal.Caption = "sal"
    	Dim tabage As New DataColumn("age", GetType(Integer))
    	tabsal.Caption = "age"
    	tab1.Columns.AddRange(New DataColumn() {tabIDclom, tabname, tabsal, tabage})
    	tab1.PrimaryKey = New DataColumn() {tab1.Columns(0)}
    	Dim row As DataRow = tab1.NewRow()
    	row("id") = 1
    	row("name") = "taha"
    	row("sal") = 1000
    	row("age") = 20
    	tab1.Rows.Add(row)
    	ds = New DataSet
    	ds.Tables.Add(tab1)
    	DataGridView1.DataSource = ds.Tables(0)
    	DataGridView1.DataBind()
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

ششششكراُ اخي العزيز ضبط الاستعلام مشاء الله عليك

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

  sql = "select id,name,sal,age from a "
        da = New SqlDataAdapter(sql, con)
        ds = New DataSet
        da.Fill(ds)
        xx(ds)

وكان ناتج الاستعلام هذه اكثر من صف نفرض مثلاُ كان صفين .. كيف رح اعبي هذه الاستعلام في التيبل الوهمي الي موجود معي في الدالة XX ?

ادري اني مثقل عليك اخي بس حاب اطبق هذه الفكرة في مشروعي :blush:

#6

السلام عليكم ..

  1. أولا لا شئ اسمه جدول وهمي بل هو dataTable و تقصد انه موجود بالذاكرة و ليس في قاعدة البيانات ..
  2. لا داعي لإنشاء الــ dataTable يدويا بهذة الطريقة إذا كان موجود نفس البنية في قاعدة البيانات .
  3. الــ DataApapter يقوم بإنشاء الــ DataTable بشكل تلقائي داخل الــ DataSet و له نفس أعمدة و بنية الجدول في قاعدة البيانات ثم يمكنك إضافة الأسطر التي تريدها له باستخدام الــ NewRow و الــ Rows.Add الموجودة في المثال السابق
  4. مع ذلك يمكنك ملء جدول موجود مسبقا بمحتويات من قاعدة البيانات بشرط أن يكون للجدولين نفس أسماء الأعمدة و نوع بياناتها و أن يكون للجدول DataTable اسم عن طريق :
        	Dim tab1 As New DataTable("tab1")

  5. المثال :
        	Dim ds As DataSet
        	Dim tab1 As New DataTable("tab1")
        	Dim tabIDclom As New DataColumn("ID", GetType(Integer))
        	tabIDclom.Caption = "id"
        	tabIDclom.AllowDBNull = False
        	tabIDclom.Unique = True
        	Dim tabname As New DataColumn("name", GetType(String))
        	tabname.Caption = "name"
        	Dim tabsal As New DataColumn("sal", GetType(Integer))
        	tabsal.Caption = "sal"
        	Dim tabage As New DataColumn("age", GetType(Integer))
        	tabsal.Caption = "age"
        	tab1.Columns.AddRange(New DataColumn() {tabIDclom, tabname, tabsal, tabage})
        	tab1.PrimaryKey = New DataColumn() {tab1.Columns(0)}
        	Dim row As DataRow = tab1.NewRow()
        	row("id") = 1
        	row("name") = "taha"
        	row("sal") = 1000
        	row("age") = 20
        	tab1.Rows.Add(row)
        	ds = New DataSet
        	ds.Tables.Add(tab1)
    
        	Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\students.mdf;Integrated Security=True;User Instance=True")
        	con.Open()
        	Dim com As New SqlCommand()
        	com.Connection = con
        	com.CommandType = Data.CommandType.Text
        	com.CommandText = "SELECT ID, name , sal , age FROM tab1;"
        	Dim adpater As SqlDataAdapter = New SqlDataAdapter
        	adpater.SelectCommand = com
        	adpater.Fill(ds, "tab1")
    
    
        	DataGridView1.DataSource = ds.Tables(0)
        	DataGridView1.DataBind()

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

السلام عليكم

اولاُ مشكور اخي على ردك وتفاعلك معي والله يرضى عليك

ثانياُ اخي انا جربت الكود بس مايضيف لي الا بس هذه السطر

row("id") = 1
    	row("name") = "taha"
    	row("sal") = 1000
    	row("age") = 20
    	tab1.Rows.Add(row)

ثالثاُ : انا اريد ان اقوم بادخال السجلات عبر ناتج االاستعلام يعني السجلات الي بترجع لي من الاستعلام اريد ان اعبيها الجدول المخزن في الذاكرة الذي قمنا بانشائه ..

ولا اريد ان ادخل السجل بهذه الطريقة

row("id") = 1
    	row("name") = "taha"
    	row("sal") = 1000
    	row("age") = 20
    	tab1.Rows.Add(row)

والله يعطيك العافيه على تعبك معي

#8

السلام عليكم ..

اقتباس
انا اريد ان اقوم بادخال السجلات عبر ناتج االاستعلام يعني السجلات الي بترجع لي من الاستعلام اريد ان اعبيها الجدول المخزن في الذاكرة الذي قمنا بانشائه ..

نعم أخي .. و الكود يقوم بذلك .. لكي تضع ناتج الاستعلام في الجدول في الذاكرة يجب أن نضع جدول الذاكرة datatable داخل الــ dataSet ثم نستخدم الأمر Fill لملئ الجدول بناتج الاستعلام ..و و إذا كنت لا تريد إدخال السجل يدويا .. فاحذف الكود الذي يقوم بذلك ..

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#9
houssam11350_11350 كتب:

السلام عليكم ..

نعم أخي .. و الكود يقوم بذلك .. لكي تضع ناتج الاستعلام في الجدول في الذاكرة يجب أن نضع جدول الذاكرة datatable داخل الــ dataSet ثم نستخدم الأمر Fill لملئ الجدول بناتج الاستعلام ..و و إذا كنت لا تريد إدخال السجل يدويا .. فاحذف الكود الذي يقوم بذلك ..

-------------------------------

مشكور اخي الكود اشتغل الله يخليك ويرضى عليك وعلى والديك ياغالي يا استاذي العزيز

#10

استاذي حسام .. اسف اني مثقل عليك .. بس حاولت اطبق الفكرة نفسها بدتا لست . سويت دتا لست وقلت له .. اضيف لي السجلات الي موشر عليها تشك .. ؟ لكن المشكلة انه بس يضيف لي سجل واحد بس ولا يضيف لي كل السجلات الي موشر عليهم تشك بوكس .. وخليته عندما يختار تشك بوكس ويضغط على البوتون .. خليته ينتقل لصفحة ثانية ويعبي البيانات المخزنه في التيبل في قرد فيو .. في صفحة ثانية ..

لكن عندما ارجع مرة ثانية عشان اختر سجل .. لا يضيف السجل الجديد مع القديم ... يختار لي بس السجل الجديد اما الي قمت باضافته مسبقاُ يطير .. ليش ؟

انا اريدة يكون . مثلاُ لو اخترت سجلين وضغط على البوتون ينتقل لصفحة الثانية ويعرض لي السجلين .. لو ضغط على ختيار سجل جديد يرجعني اختار سجل جديد وقمة باختيار سجل جديد وضغط بوتون المفروض يروح لصفحة العرض ويعرض لي السجل الجديد + السجلين القديمات الي اخترتهم مسبقاُ . بس مايسوي كذا ليش يا استاذي القدير ؟ :sad: :sad:

---------------

هذه الكود الي كتبته في البتون حق اخيتار السجل عن طريق التشك بوكس

 Try

            For i As Integer = 0 To DataList1.Items.Count - 1
                Dim row As DataListItem = DataList1.Items(i)
                Dim rdd1 As Boolean = CType(row.FindControl("CheckBox1"), CheckBox).Checked
                Dim g_id As String = CType(row.FindControl("Label1"), Label).Text

                If rdd1 = True Then
                    '-------------------------------------------

                    Dim ds As DataSet
                    Dim s As New DataTable("s")
                    Dim tabIDclom As New DataColumn("ID", GetType(Integer))
                    tabIDclom.Caption = "id"
                    tabIDclom.AllowDBNull = False
                    tabIDclom.Unique = True
                    Dim tabname As New DataColumn("name", GetType(String))
                    tabname.Caption = "name"
                    Dim tabsal As New DataColumn("sal", GetType(Integer))
                    tabsal.Caption = "sal"
                    Dim tabage As New DataColumn("age", GetType(Integer))
                    tabsal.Caption = "age"
                    s.Columns.AddRange(New DataColumn() {tabIDclom, tabname, tabsal, tabage})
                    s.PrimaryKey = New DataColumn() {s.Columns(0)}
                    Dim row1 As DataRow = s.NewRow()
                    ds = New DataSet
                    ds.Tables.Add(s)

                    Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
                    con.Open()
                    Dim com As New SqlCommand()
                    com.Connection = con
                    com.CommandType = Data.CommandType.Text
                    com.CommandText = "SELECT ID, name , sal , age FROM a where id =" & g_id & ""
                    Dim adpater As SqlDataAdapter = New SqlDataAdapter
                    adpater.SelectCommand = com

                    adpater.Fill(ds, "s")

                    Session("mo") = ds.Tables("s")
                    '------------------------------------------------
                End If
            Next
            Response.Redirect("Default2.aspx")
        Catch ex As Exception

        End Try

وفي الصفحة الثانية اقوم بقراتهم بهذه الكود

   ds = CType(Session("mo"), DataTable)
        GridView1.DataSource = ds
        GridView1.DataBind()

سوف اقوم بارفاق المثال لكي تطلع عليه اذا عندك وقت يا استاذي . واذا مشغول ماحب اشغلك .. ياغالي وسئل الله ان يضع كل عمل تقوم به في ميزان حسناتك

WebSite17.rar

#11

السلام عليكم ..

  1. اقتباس
    لكن المشكلة انه بس يضيف لي سجل واحد بس ولا يضيف لي كل السجلات الي موشر عليهم تشك بوكس
    ببساطة لأنك تعمل new DataTable في كل مرة .. و الحل هو تخزين الجدول في الــ Session فلو كان موجود فلا داعي لعمل New ..
  2. كما قلنا .. إذا كان الجدول موجود في قاعدةالبيانات فلا داعي لبنائه يدويا .. و يمكن بعد جلبه .. أن نعدل عليه كما نشاء ..
  3. عدل كود الــ LinkButton إلى مايلي :
     Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
    
        	Try
            	For i As Integer = 0 To DataList1.Items.Count - 1
                	Dim row As DataListItem = DataList1.Items(i)
                	Dim rdd1 As Boolean = CType(row.FindControl("CheckBox1"), CheckBox).Checked
                	Dim g_id As String = CType(row.FindControl("Label1"), Label).Text
    
                	If rdd1 = True Then
                    	'-------------------------------------------
    
                    	Dim ds As DataSet
                    	ds = New DataSet
                    	If Not Session("mo") Is Nothing Then
    
                        	Dim myTable As DataTable
                        	myTable = TryCast(Session("mo"), DataTable)
                        	myTable.TableName = "s"
                        	ds = myTable.DataSet
    
                    	End If
    
                    	Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
                    	con.Open()
                    	Dim com As New SqlCommand()
                    	com.Connection = con
                    	com.CommandType = Data.CommandType.Text
                    	com.CommandText = "SELECT ID, name , sal , age FROM a where id =" & g_id & ""
                    	Dim adpater As SqlDataAdapter = New SqlDataAdapter
                    	adpater.SelectCommand = com
    
                    	adpater.Fill(ds, "s")
                    	ds.Tables("s").PrimaryKey = New DataColumn() {ds.Tables("s").Columns(0)}
                    	Session("mo") = ds.Tables("s")
    
                	End If
            	Next
            	Response.Redirect("Default2.aspx")
        	Catch ex As Exception
            	Response.Write(ex.Message)
            	Response.Write(ex.StackTrace)
    
        	End Try
    	End Sub

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#12
houssam11350_11350 كتب:

السلام عليكم ..

  1. ببساطة لأنك تعمل new DataTable في كل مرة .. و الحل هو تخزين الجدول في الــ Session فلو كان موجود فلا داعي لعمل New ..
  2. كما قلنا .. إذا كان الجدول موجود في قاعدةالبيانات فلا داعي لبنائه يدويا .. و يمكن بعد جلبه .. أن نعدل عليه كما نشاء ..
  3. عدل كود الــ LinkButton إلى مايلي :
     Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
    
        	Try
            	For i As Integer = 0 To DataList1.Items.Count - 1
                	Dim row As DataListItem = DataList1.Items(i)
                	Dim rdd1 As Boolean = CType(row.FindControl("CheckBox1"), CheckBox).Checked
                	Dim g_id As String = CType(row.FindControl("Label1"), Label).Text
    
                	If rdd1 = True Then
                    	'-------------------------------------------
    
                    	Dim ds As DataSet
                    	ds = New DataSet
                    	If Not Session("mo") Is Nothing Then
    
                        	Dim myTable As DataTable
                        	myTable = TryCast(Session("mo"), DataTable)
                        	myTable.TableName = "s"
                        	ds = myTable.DataSet
    
                    	End If
    
                    	Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
                    	con.Open()
                    	Dim com As New SqlCommand()
                    	com.Connection = con
                    	com.CommandType = Data.CommandType.Text
                    	com.CommandText = "SELECT ID, name , sal , age FROM a where id =" & g_id & ""
                    	Dim adpater As SqlDataAdapter = New SqlDataAdapter
                    	adpater.SelectCommand = com
    
                    	adpater.Fill(ds, "s")
                    	ds.Tables("s").PrimaryKey = New DataColumn() {ds.Tables("s").Columns(0)}
                    	Session("mo") = ds.Tables("s")
    
                	End If
            	Next
            	Response.Redirect("Default2.aspx")
        	Catch ex As Exception
            	Response.Write(ex.Message)
            	Response.Write(ex.StackTrace)
    
        	End Try
    	End Sub

------------------------

مشكور استاذي الغالي جاري التجربة الله يجزيك كل الخير

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