因為個人原因,好久沒寫blog。對於移動開發方面的變化只能用日新月異來形容阿。WM7也很快就要推出了,Sql Server CE 都到3.5了,真是跟不上步伐阿。
這篇文章就從如何開始用WM5.0開發基於Sql Server CE 的應用程式吧。
下面先簡單介紹下Sql Server CE 的基礎吧:
SQL Server 2005 Compact Edition(縮寫為SQL Server CE)是微軟推出的一個適用於嵌入到行動裝置 App裝置的精簡資料庫產品,Windows Mobile開發人員能夠使用SQL Server CE開發出將資料管理能力延展到Window Mobile行動裝置上的應用程式。SQL Server CE不但提供了完整的SQL文法,包括內部聯結、外部聯結和子查詢,還內建了資料同步技術的支援。有一點要注意的是,SQL Server 2005 Compact Edition除了可以作為移動資料庫在Windows Mobile裝置上運行外,它也支援在PC上存放資料,為案頭的應用程式提供資料支援。但可惜貌似不支援視圖、預存程序等。
在資料中查到SQL Server CE資料庫引擎還提供了兩個非常重要的技術,那就是遠端資料存取和合併式複寫。這兩種方法都是用來實現與遠端資料庫進行資料同步的,使得我們可以很容易將遠端資料庫中的資訊載入到裝置端的SQL Server CE資料庫中,此外我們還可以在離線狀態下對SQL Server CE資料庫進行插入、刪除、更新等修改操作,最後就可以將修改後的資料回傳到遠端資料庫中,確保了裝置端和伺服器端的資料同步。(在後續文章中會做進一步的講述)
基礎的概述了一番,那從Demo入手,體驗一下究竟Sql Server CE吧。
開發環境:VS2008
開發語言:C#
資料庫:Sql Server CE3.5
這裡使用 VS2008作為開發環境,偷懶了一次。以後文章將使用VS2005的開發環境。
開啟VS2008,選擇Smart Device,然後在右上方選擇.net Framework 2.0,建立一個基於.net Framework2.0的應用程式。
選擇平台類型(PPC/Smartphone),這裡我選擇了PPC。注意下面選項中還能選擇使用CF2.0還是CF3.5,這裡選擇2.0。
工程建立完畢後,你建立一個Form程式時,就會出現相應的模擬器裝置。
接著添加一個資料庫,在項目工程介面,添加一個資料庫。
這時候,會探索資料庫檔案的尾碼名怎麼變成.sdf了。然後,再建立一個對應的DataSet,用來快速開發。(本篇文章主要描述某些功能,實際項目中開發不做參考)
建立好表後,將表拖動到DataSet中,VS會自動產生對應的Adapt和強型別的DataSet。
然後在Form中,拖入一個DataGrid,將DataGrid的Dock設為Fill。大家開發WM時,最好設定Dock,因為這樣控制項會隨著裝置的變化而自動調整,WM可以側過來使用的。
有了資料容器後,自然要綁定資料。
首先,對DataGrid進行設定,這裡的DataGrid因為是CF版本,很多屬性和方法都比WinForm上的要少很多。
先添加一個TabStyle,用於設定綁定一個DataTable。這裡要將GenerateMember設為False,並指定好MappingName(表名)。
添加列,在GridColumnStyles中添加,我添加2列dataGridTextColumn,並將GenerateMember設為False,並同樣指定好MappingName(列名)。
在Form_Load事件中,用Adapt填充一個table,然後對DataGrid綁定。
如果,在前面沒有設定好TableStyle和ColumnStyle的MappingName,這裡綁定時,會多出一些列。
這就是不想要的效果。
這就是想要的效果。
DataGrid無法設定某個列的Visible,沒有該屬性。所以只能通過該方法來屏蔽掉一些列。
DataGrid無法直接進行編輯,那我們如何進行編輯呢,我的處理方式如下:
建立一個Form,將選中的某行資訊,作為參數傳入到編輯Form,該Form上編輯完後,再回傳取得資料即可。
簡單的資料庫訪問的應用程式就算做完了。代碼如下:
Code
1using System;
2
3using System.Collections.Generic;
4using System.ComponentModel;
5using System.Data;
6using System.Drawing;
7using System.Text;
8using System.Windows.Forms;
9
10namespace SmartDeviceProject1
11{
12 public partial class Form1 : Form
13 {
14 private AppDatabase1DataSet.Sys_UserDataTable table;
15 AppDatabase1DataSetTableAdapters.Sys_UserTableAdapter adapt;
16
17 public Form1()
18 {
19 InitializeComponent();
20 }
21
22 private void menuItem4_Click(object sender, EventArgs e)
23 {
24 Application.Exit();
25 }
26
27 private void menuItem3_Click(object sender, EventArgs e)
28 {
29 adapt = new SmartDeviceProject1.AppDatabase1DataSetTableAdapters.Sys_UserTableAdapter();
30 adapt.Fill(table);
31 this.dataGrid1.DataSource = table;
32 }
33
34 private void Form1_Load(object sender, EventArgs e)
35 {
36 table = new AppDatabase1DataSet.Sys_UserDataTable();
37 }
38
39 private void menuItem5_Click(object sender, EventArgs e)
40 {
41 if (adapt == null)
42 adapt = new SmartDeviceProject1.AppDatabase1DataSetTableAdapters.Sys_UserTableAdapter();
43
44 MessageBox.Show("Effect rows are " + adapt.Update(table).ToString());
45 }
46
47 private void menuItem6_Click(object sender, EventArgs e)
48 {
49 //Form2是編輯Form,通過傳入值後,在該Form中修改,然後再去取得資料,寫入DataTable中。
50 Form2 form = new Form2();
51 form.User_ID = table[this.dataGrid1.CurrentCell.RowNumber].User_Id;
52 form.User_Name = table[this.dataGrid1.CurrentCell.RowNumber].User_Name;
53 form.Mail = table[this.dataGrid1.CurrentCell.RowNumber].Mail;
54 form.ShowDialog();
55
56 if (form.IsSave)
57 {
58 table[this.dataGrid1.CurrentCell.RowNumber].User_Id = form.User_ID;
59 table[this.dataGrid1.CurrentCell.RowNumber].User_Name = form.User_Name;
60 table[this.dataGrid1.CurrentCell.RowNumber].Mail = form.Mail;
61 }
62 }
63 }
64}