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

أربد معرفى حقل المفتاح الأساسى من جدول ما عن طريق Vb.net 2005

مغلق
بدأه الأخ المسلم (أسامه عبد الصادق) في 18 يناير 2008 · 14 رد · 1,428 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
 Public Function Pri() As String

Conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path + ";Persist Security Info=False")
'L1.text = إسم الجدول
Dim SQL = "Select * From " + L1.Text

Dim DT As New DataTable

Dim DA As New OleDbDataAdapter(SQL, Conn)

DA.Fill(DT)

Return DT.PrimaryKey.ToString

End Function

ولكن لا يعطينى إسم الحقل ماذا أفعل

[/وسط]

#2

السلام عليكم

Dim cn as new OleDbConnection
	   Dim dt As DataTable = cn.GetSchema("Indexes", New String() {Nothing, Nothing, "PrimaryKey", Nothing, yourTableName})

الـ object المسمى dt يحتوى على المفتاح الإساسى وتقدر تتعامل معاه

بالتوفيق

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#3

مش عارف اطبقها ممكن مثال بترجع بنفس القيمة القيدمة ( Column[]Pramaetars)

[/وسط]

#4

يا أخ أسامة انا مش فاهم كلامك وإزاى انت مش عارف تجرب الكود فسر أكتر بعد إذنك

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#5
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click



Dim dt As DataTable = Conn.GetSchema("Indexes", New String() {Nothing, Nothing, "PrimaryKey", Nothing, "INFO"})



End Sub

وأظن أنك تقصد

GetOleDbSchemaTable

وليس

GetSchema

 Conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Persist Security Info=False")

Conn.Open()

DT = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "Table"})

Conn.Close()

وعلى العموم سواء كد أو كده لا يرجع بإسم المفتاح الأساسى

[/وسط]

#6

أخ اسامة انا اقصد GetSchema وليست GetOleDbSchemaTable والحمدلله انا جربت الكودين قبل كدا وشغال عندى

ممكن أسألك أخ أسامة أيه الفرق بين الأتنين

وفي حاجة تانية بعد إذنك الـ datatable اللى هو dt انت مش بتظهره على datagridview مثلاً

ايه اللى بيظهر عندك لما تظهره في الـ datagridview

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#7

ما يظهر إلى يظهر أنا عاوز بعيد عن عرض البيانات نهائى اعرف إسم حقل المفتاح الأساسى .

[/وسط]

#8

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

VB Code

	  Dim da As New SqlDataAdapter("Select * from Customers", Cnn)
		Dim dt As New DataTable()
		da.FillSchema(dt, SchemaType.Source)

		Dim sp As New StringBuilder()
		For Each d As DataColumn In dt.PrimaryKey
			sp.AppendLine(d.ColumnName)
		Next
		MessageBox.Show(sp.ToString())

C# Code

SqlConnection Cnn = new SqlConnection("Data Source=.;Initial Catalog=NorthWind;Integrated Security=True");

			SqlDataAdapter da = new SqlDataAdapter("Select * from Customers", Cnn);
			DataTable dt = new DataTable();
			da.FillSchema(dt, SchemaType.Source);

			StringBuilder sp = new StringBuilder();
			foreach (DataColumn d in dt.PrimaryKey)
			{
				sp.AppendLine(d.ColumnName);
			}
			MessageBox.Show(sp.ToString());

تم تعديل هذه المشاركة بواسطة anti_ghosts في 21 يناير 2008 في 14:25

#9

هوه ده الكلام

جزاك الله خيراً كثيراً

[/وسط]

#10

السلام عليكم أخ أسامة

اقتباس
ما يظهر إلى يظهر أنا عاوز بعيد عن عرض البيانات نهائى اعرف إسم حقل المفتاح الأساسى

ههههههههههههههه

يا أستاذى الفاضل أنا أقصد في اللى هيظهر على الداتا جريد فيو تأكيد لكلامى يعنى مش من ضمن البيانات اللى ظهرت أسم المفتاح الأساسى طيب إزاى متقدرش تعرف تجيبه من الـ datatable (اللى عائدة من الـ GetSchema) طيب إذا كنت متقدرش تتعامل معاه دى حاجة تانية قول وانا بإذن الله أوضحلك الكود

اقتباس
وأظن أنك تقصد

GetOleDbSchemaTable

وليس

GetSchema

وفي حاجة يا باشمهندس أسامة انا سألتك فيها عايز بس اعرف الإجابة وهى الفرق بين إستخدام GetSchema و GetOleDbSchemaTable

ياريت ياباشا تقولنا على الكام براميتير اللى بنضع فيهم nothing نقدر نضع بدل nothing ايه بالظبط في كل واحدة

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#11

ياريت تعلمنا إياها يا حضرت العالم المتهكم فى كلامة _ وإن كان العلم لا يؤخذ من الساخرين .

كمان انا لست مهندس _ منين عرفت انى باشمهندس .

والله الواحد بيحتار من مثل هذه الردود فى المنتدى .

[/وسط]

#12

يا أخ أسامة والله ما اقصد الإهانة خالص معرفش ليه انت فهمتنى غلط وكمان كلامك شديد قوى عليا

كل الموضوع إنى لما بعتلك على طريقة معرفة المفتاح الأساسى قلتلك عن طريق GetSchema

رحت انت بعت وقلتلى

اقتباس
وأظن أنك تقصد

GetOleDbSchemaTable

وليس

GetSchema

أنا بصراحة عرفت إنك بتستخدم GetOleDbSchemaTable فقلت ايه المشكلة دلوقتى مدام دى أو دى هتحل الموضوع لكن اللى انا معرفتش أوضحه إن لازم الواحد يكون فاهم الكود اللى بيستخدمه علشان يقدر يستفاد منه أكبر قدر من الإستفادة وأستغربت جداً من الجملة دى (أظن أنك تقصد GetOleDbSchemaTable وليس GetSchema) مع العلم إن إجابتى كانت واضحة جداً GetSchema بس دا الموضوع ومتزعلش منى

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#13

غفر الله لنا جميعا ً

طاب لو تكرمت توضحلى الفرق بينهما وماذا اكتب فى البراميتر بدلاً من Nothing او Null عشان أستفيد .

[/وسط]

#14

السلام عليكم أخ أسامة

بعد الصلاة والسلام على أشرف المرسلين

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

إليك الشرح بس للأسف مش هقدر أشرح بالتفصيل (مش بخل معاذ الله ولكن لضيق الوقت ) على العموم أحنا مع بعض

أولاً هنبدأ بالميثود GetSchema

الميثود دا طبعاً هو تابع للكلاس Connection سواء كان سيكول أو أكسس وهو معاد تعريفه ثلاث مرات أى معموله Overloading يعنى أيه معرف مرة بدون براميتير ومرة تانية ببراميتير من نوع String ومرة تالته أتنين براميتير الأول من نوع String والثانى مصفوفة من نوع String

هنا هنجرب التعريف الأول (بدون براميتير)

 cn.Open()
			Dim dt As DataTable = cn.GetSchema()
			Me.DataGridView1.DataSource = dt
			cn.Close()

بمجرد كتابة الكود دا في الداتا جريد فيو هيظهر تلات أعمدة العمود الأول هو المهم اللى عليه العين البيانات المكتوبة في العمود دا عبارة عن مجموعات ودى أهم المجموعات فيهم

Tables
Columns
Procedures
Views
Indexes

بترجعلنا بيانات عن الداتا بيز نفسها وتركيبتها على سيبل المثال لا الحصر المجموعة ReservedWords المجموعة دى واضحة من أسمها بترجع جميع الكلمات المجحوزة داخل الأكسس (اللى انت بتستخدمه طبعاً بيختلف من إصدار لآخر)

السؤال هنا أنا أزاى أستفيد من المجموعات دى سهلة جداً إن شاء الله (تستخدم في التعريف الثانى للـ GetSchema )

التعريف الثانى

بيقبل براميتير من نوع String يكتب بداخله أى مجموعه من المجموعات اللى ظهرت من الكود الأولانى

نجرب الكود دا

 cn.Open()
			Dim dt As DataTable = cn.GetSchema("Indexes")
			Me.DataGridView1.DataSource = dt
			cn.Close()

الناتج من الكود دا 25 عمود في الداتا جريد فيو اللى يهمنا في دى كله الخمس أو الأربع أعمدة اللى في الأول انا ليه بقول الخمسة أو الأربعة (دا في التعريف الثالث اللى هما بنتكتب مكنهم Nothing أو null) الخمسة والعشرين عمود دول جميع البيانات عن Indexes الموجودة داخل الداتا بيز وطبعاً من ضمنهم المفاتيح الأساسية لكل الجداول الموجودة داخل الداتا بيز من الكود دا نقدر نطلع الحقل الأساسى لأى جدول في الداتا بيز (ملحوظة القاعدة اللى انا شغال عليها تتكون من جدول واحد أسمه Table1)

العمود رقم 2 أسمه TABLE_NAME والعمود رقم 5 أسمه INDEX_NAME والعمود رقم 17 اسمه COLUMN_NAME (طبعاً الترقيم في معظم الحالات في البرمجة بيبدأ من الصفر) هما دول الثلاث أعمدة المهمين في المجموعة Indexes مع التعريف الثانى للميثود GetSchema

نشوف الكود اللى يقدر يرجع أسم الحقل الأساسى في الجدول اللى انا عايزه

			cn.Open()
			Dim dt As DataTable = cn.GetSchema("Indexes")
			cn.Close()
			Me.DataGridView1.DataSource = dt

			Dim str As String = Nothing
			For i As Integer = 0 To dt.Rows.Count - 1
				If dt.Rows(i)("INDEX_NAME") = "PrimaryKey" And dt.Rows(i)("TABLE_NAME") = "Table1" Then					 
					str = dt.Rows(i)("COLUMN_NAME").ToString
					MsgBox(str)
				End If
			Next

الناتج رسالة فيها أسم الحقل الأساسى طبعاً الكود عايز يتظبط أكتر من كدا ليه لأن ممكن الجدول يكون في أكتر من حقل أساسى لاحظ الكلمة PrimaryKey في الكود السابق الموجودة داخل العمود INDEX_NAME دى قيمة ثابتة بمعنى أن الحقل الأساسى في الجدول دائماً أسمه Primarykey في العمود INDEX_NAME والعمود COLUMN_NAME دا في أسم الحقل الأساسى داخل الجدول (ومقابله للخانة المكتوب فيها Primarykey في العمود INDEX_NAME) وباقى الطريقة الثالثة والأخيرة

الطريقة الثالثة

وطريقة دى أسهل من الطريقة التانية بخصوص تحديد الحقل الأساسى مرة واحدة الطريقة دى بتقل أتنين براميتير الأول String (وهو أسم المجموعة وهنا أحنا شغالين على مجموعة Indexes ) والثانى هو مصفوفة String (وتسمى بالـ Restriction وترجمتها بالعربية التقييد ) والتقييد دا مع مجموعة الـ Indexes خمس عناصر داخل المصفوفة (اللى هى البراميتير الثانى ) وعلى فكرة هى مش شرط تكون خمسة ممكن مع مجموعة تانية مثلاً زى مجموعة Tables تكون أربع عناصر (أحنا هنا بنجرب المجموعة Indexes فقط ) نشوف بقى الخمس عناصر دول ايه أو بنكتب فيهم أيه بدل Nothing أو null وهم بالترتيب TABLE_CATALOG و TABLE_SCHEMA و INDEX_NAME و TYPE و TABLE_NAME

الكود

   cn.Open()
			'Dim dt As DataTable = cn.GetSchema("Indexes", New String() {"TABLE_CATALOG", "TABLE_SCHEMA", "INDEX_NAME", "TYPE", "TABLE_NAME"})
			Dim dt As DataTable = cn.GetSchema("Indexes", New String() {Nothing, Nothing, "PrimaryKey", Nothing, "Table1"})
			cn.Close()
			Me.DataGridView1.DataSource = dt
			Dim str As String = Nothing
			If dt.Rows.Count <= 1 And dt.Rows.Count > 0 Then				
				str = dt.Rows(0)("COLUMN_NAME")
			End If
			MsgBox(str)

طبعاً الكود دا أسهل من الكود التانى في إرجاع الحقل الأساسى للجدول والخمس عناصر بتوع المصفوفة طبعاً هما أسماء خمس الأعمدة الموجودين في الحقول الناتجة من الكود (الموجود في الداتا جريد فيو) الأولانى بتاع الطريقة الأولى وبكدا بفضل الله فسرنا طريقة GetSchema وطبعاً لا يخلو بشر من خطئ

وإن شاء الله المرة الجاية (لضيق الوقت ) نفسر GetOleDbSchemaTable

متى يصـــل البُنيان تمامــه *** إذا كنت تبنيه وغـيرك يهدمه

لـو كان سهماً واحــداً لتقيته *** ولكنه ســهم وثانيـــة وثالثه

#15

جزاك الله خيرا كثيراً على هذا الشرح.

ومستنى الباقى ::: ومكن تشرح كمية أقل ولكن بتفصيل أكثر لكى تعم الفائدة .

وجعله الله فى ميزان حسناتك .

[/وسط]

هذا الموضوع مغلق.

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