نستطيع تكوين قاعدة بيانات للجوال وبكل سهولة بأستخدام فئة SqlCeEngine Class وهي مكتبة DLL التي تحمل مع نسخة الفجوال ستوديو وهذا class يمكنك من انشاء قاعدة بيانات من نوع sdf الخاص بالجوال وتخزين بيانات في داخله اذا كنت قد استخدمت قواعد بيانات ADO.NET فلن يكون الامر صعبا عليك ستجد انه يستعمل نفس class ولكن بأسماء جديدة منها SqlCeDataAdapter Class لتعبئة البيانات من القاعدة البيانات الى الجداول في البرنامج و SqlCeConnection Class للأتصال بقاعدة البيانات وSqlCeCommand Class لتنفيذ اوامر على قاعدة البيانات
اذن لنبد بتصميم مشروع جديد بشكل التالي بقاعدة بيانات اسماء الاشخاص واعمارهم وعناوينهم نضيف فيه textbox,label,Datagrid ونكون القوائم من خيارات القوائم
لكي تتعلم كيف تكون مشروع جديد ادخل برمجة اول برنامج لك بالاجهزة الكفية
بما اننا قلنا ان SqlCeEngine Class وبما اننا قلنا انها تحمل مع نسخة فيجوال ستوديو اي هي غير موجودة في منصة العمل .netframework لذالك يجب اضافتها للبرنامج لكي نستطيع استخدامها وتضاف من Solution explorer واختر المشروع ثم كلك يمين وختر Add Refrences ثم اختر المكتبة بشكل التالي
الكود العامة...............................
بداية نستدعي المكاتب التالية
Imports System.IO
Imports System.Text
Imports System.Data
Imports System.Data.SqlServerCe
Imports System.Collections
Imports System.Windows.Forms
Imports System.Data.Common
Imports System.Text
Imports System.Data
Imports System.Data.SqlServerCe
Imports System.Collections
Imports System.Windows.Forms
Imports System.Data.Common
في التعريفات العامة نعرف التعاريف التالية
Public DS As New DataSet
Dim conn As SqlCeConnection = Nothing
"Public SQLstr As String = "SELECT * FROM TestTbl
Dim CountDataBaseIndex As Integer = 0
DS هو dataset نخزن فيه قاعدة البيانات للتعامل معها
conn هو للأتصال بقاعدة البيانات
SQLstr هي جملة SQL للختيار من قاعدة البيانات
CountDataBaseIndex يمكننا من التنقل بين السجلات
كود فتح اتصال وتكوين قاعدة بيانات..............................
في حدث تحميل الفورم نعمل اتصال بقاعدة البيانات ونمسح الملف اذا كان موجود ونكون قاعدة بيانات بشكل الذي نريده
هنا سنكون قاعدة بيانات اسمها test.sdf وجدول اسمه TestTbl واعمدة age,name,tite وID_a
Try
If File.Exists("Test.sdf") Then
File.Delete("Test.sdf")
End If
Dim engine As New SqlCeEngine("Data Source = Test.sdf")
engine.CreateDatabase()
conn = New SqlCeConnection("Data Source = Test.sdf")
conn.Open()
Dim cmd1 As SqlCeCommand = conn.CreateCommand()
cmd1.CommandText = "CREATE TABLE TestTbl ( ID_a INT PRIMARY KEY, name NTEXT ,age INT , tite NTEXT)"
cmd1.ExecuteNonQuery()
Fliidataagrid()
addthenamein_boxs()
Catch ex As SqlCeException
MessageBox.Show("Error load")
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
End Try
في البداية تحققنا هل الملف موجود حتى يحذفه ثم كونا قاعدة بيانات جديدة اسمها test.sdf
(" Dim engine As New SqlCeEngine("Data Source = Test.sdf
()engine.CreateDatabase
ثم قمنا بالاتصال بها وتكوين جدول اسمه TestTbl واعمدة age,name,tite
("conn = New SqlCeConnection("Data Source = Test.sdf
()conn.Open
()Dim cmd1 As SqlCeCommand = conn.CreateCommand
"( cmd1.CommandText = "CREATE TABLE TestTbl ( ID_a INT PRIMARY KEY, name NTEXT ,age INT , tite NTEXT)"
()cmd1.ExecuteNonQuery
NTEXT معناه نوع بيانات الحقل هو نصي
INT معناه نوع بيانات الحقل هو integer
PRIMARY KEY هو الحقل الذي نضع عليه مفتاح الرئيسي لقاعدة البيانات
ثم استدعينا دالتين
addthenamein_boxs تقوم بوضع محتوى الصف داخل textbox لكل من الاسم والعمل والعوان
Sub addthenamein_boxs()
On Error Resume Next
Me.TextBox1.Text = DS.Tables(0).Rows(CountDataBaseIndex).Item(1)
Me.TextBox2.Text = DS.Tables(0).Rows(CountDataBaseIndex).Item(2)
Me.TextBox3.Text = DS.Tables(0).Rows(CountDataBaseIndex).Item(3)
End Sub
Fliidataagrid تقوم هذه الدالة بتحديث بيانات datagrid و dataset بعد كل اضافة وحذف وتعديل
Sub Fliidataagrid()
Dim selectCmd As SqlCeCommand = conn.CreateCommand()
selectCmd.CommandText = "SELECT * FROM TestTbl"
Dim adp As New SqlCeDataAdapter(selectCmd)
DS.Clear()
adp.Fill(DS)
DataGrid1.DataSource = DS.Tables(0)
End Sub
الان انتهينا من تكوين قاعدة بيانات والاتصال بها
ازار التنقل......................................
نحتاج لكي نتنقل بين سجلات قواعد البيانات الى الامام او الخلف او الاول او الاخير سنكتب كود ازار التنقل في الاتجاهات الاربعة للجوال
ويكون الكود التالي للتنقل الى السجل الاول والاخير والتالي والسابق
If (e.KeyCode = System.Windows.Forms.Keys.Up) Then
'Up
CountDataBaseIndex = 0
addthenamein_boxs()
End If
If (e.KeyCode = System.Windows.Forms.Keys.Down) Then
'Down
CountDataBaseIndex = DS.Tables(0).Rows.Count - 1
addthenamein_boxs()
End If
If (e.KeyCode = System.Windows.Forms.Keys.Left) Then
'Left
'if he in last item
If CountDataBaseIndex > 0 Then
CountDataBaseIndex = CountDataBaseIndex - 1
Else
CountDataBaseIndex = DS.Tables(0).Rows.Count - 1
End If
addthenamein_boxs()
End If
If (e.KeyCode = System.Windows.Forms.Keys.Right) Then
'Right
If CountDataBaseIndex < DS.Tables(0).Rows.Count - 1 Then
CountDataBaseIndex = CountDataBaseIndex + 1
Else
CountDataBaseIndex = 0
End If
addthenamein_boxs()
End If
كما ترى اننا نستدعي الدالة addthenamein_boxs لكي يضيف محتويات الصف الحالي في textbox للأسم والعمر والعنوان
كود زر الاضافة........................
Try
Dim cmd As SqlCeCommand = conn.CreateCommand()
cmd.CommandText = "INSERT INTO TestTbl (ID_a,name, age, tite) VALUES(" & (DS.Tables(0).Rows.Count) & ",'" & TextBox1.Text & "'," & TextBox2.Text & ",'" & TextBox3.Text & "')"
conn.Open()
cmd.ExecuteNonQuery()
MessageBox.Show("FileSaved")
Fliidataagrid()
Catch ex As Exception
MessageBox.Show("File Dont saved")
End Try
If conn.State = ConnectionState.Open Then
conn.Close()
End If
كود زر التعديل (التعديل هنا كوناه على حقل العمر فقط)........................
Try
Dim cmd As SqlCeCommand = conn.CreateCommand()
cmd.CommandText = "UPDATE TestTbl set age = '" & Val(TextBox2.Text) & "' WHERE ID_a=" & DS.Tables(0).Rows(CountDataBaseIndex).Item(0)
conn.Open()
cmd.ExecuteNonQuery()
MessageBox.Show("File update")
Fliidataagrid()
Catch ex As Exception
MessageBox.Show("File Dont update")
End Try
If conn.State = ConnectionState.Open Then
conn.Close()
End If
كود زر الحذف (يعتمد في الحذف على حقل ID-a).......................
Try
Dim cmd As SqlCeCommand = conn.CreateCommand()
cmd.CommandText = "DELETE FROM TestTbl WHERE ID_a =" & DS.Tables(0).Rows(CountDataBaseIndex).Item(0)
conn.Open()
cmd.ExecuteNonQuery()
MessageBox.Show("File Deleted")
Fliidataagrid()
Catch ex As Exception
MessageBox.Show("File Dont Deleted::" & ex.Message)
End Try
If conn.State = ConnectionState.Open Then
conn.Close()
End If