الثلاثاء، 27 سبتمبر 2011

تكوين قواعد بيانات للجوال بكل بساطة



نستطيع تكوين قاعدة بيانات للجوال وبكل سهولة بأستخدام فئة 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
في التعريفات العامة نعرف التعاريف التالية
 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

إرسال تعليق