Windows Phone的本機資料庫SQL Server CE是7.1版本即芒果更新的新特性,所以你要在應用程式中使用SQL Server CE資料庫必須使用Windows Phone 7.1的API才行 。這個資料庫是用Linq來執行查詢等操作。
我們現在用資料庫來儲存城市的資料,包括所屬省份,城市名稱,城市代碼。在程式中我們只做了簡單的插入和查詢,需要詳細的資料庫操作可以參考
http://windowsphonegeek.com/tips/Windows-Phone-Mango-Local-Database(SQL-CE)-Introduction或者MSDN。
現在回到工程上,先建立一個資料表,CityInfoTable.
在工程上右鍵---添加--類。命名為CityInfoTable.cs ,接著添加引用。工程----右鍵---添加引用。
找到System.Data.Linq.點擊確定。
接著在CityInfoTable.cs添加命名空間。
代碼如下 |
複製代碼 |
using System.Data.Linq.Mapping; using System.ComponentModel;
|
然後在CItyInfoTable這個資料表定義主鍵等屬性,給出完整的CityInfoTable.cs代碼
代碼如下 |
複製代碼 |
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Data.Linq.Mapping; using System.ComponentModel; namespace WeatherForecast { [Table]//把CItyInfoTable定義為表 public class CityInfoTable { //定義表的自增ID。設定為主鍵 private int _cityInfoid;
//Column這個是定義一個成員為表欄位。如果沒有這個,那麼這個成員不是欄位 [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] public int CityInfoid { get { return _cityInfoid; } set { _cityInfoid = value; } } //定義省份名稱: private string _province; [Column] public string Province { get { return _province; } set { _province = value; } }
//定義城市名稱 private string _cityName; [Column] public string CityName { get { return _cityName; } set { _cityName = value; } } //定義城市代碼 private string _cityCode; [Column] public string CityCode { get { return _cityCode; } set { _cityCode = value; } } } } |
現在再定義一個資料庫。工程---右鍵---建立類,命名為CityDataContext.cs。
添加命名空間。
using System.Data.Linq;
然後讓這個類繼承於DataContext。
給出CityDataContext.cs的完整代碼:
代碼如下 |
複製代碼 |
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Data.Linq; namespace WeatherForecast { /// <summary> /// 定義一個資料庫 /// </summary> public class CityDataContext : DataContext { //定義資料庫連接字串 public static string connectionString = "Data Source=isostore:/CityInfo.sdf";
//// 傳遞資料庫連接字串到DataContext基類 public CityDataContext(string connectionString) : base(connectionString) { } //定義一個資料表,如果有多個資料表也可以繼續添加為成員變數 public Table<CityInfoTable> CityInfos { get { return this.GetTable<CityInfoTable>(); } } } }
|
到這裡,資料庫算是寫好了。新手肯定會有疑問,沒有看到什麼資料庫。也沒在工程裡面看到什麼SDF檔案。
因為,我們要在程式構建的時候用代碼建立資料庫,由上面的連接字串可以知道,資料庫建立後放在Isolatedstorage裡面,建立這個在App.xaml裡面的Launching事件裡面實現。
可以在這個事件裡添加這樣的代碼建立資料庫:
代碼如下 |
複製代碼 |
using (CityDataContext db = new CityDataContext(CityDataContext.connectionString)) { if (db.DatabaseExists() == false) { //建立一個資料庫 db.CreateDatabase(); } } |
這個我們暫時不做。現在我們先添加一個城市資訊的XML檔案。下載:http://115.com/file/anme1scg#citycode.xml
複製這個檔案。在工程上面右鍵--粘貼。就把這個citycode.xml檔案加入到了工程上。
下來就做XML解析。用的XDocument類。這裡只是簡單應用了下。
我們要在App.xaml裡面的Launching 事件添加代碼。因為我們要在初次運行程式的時候要建立資料庫,並且解析citycode.xml的資料添加到資料庫裡面。
要讀取工程裡面的檔案。要用到的是Application.GetResourceStream.這個函數只能讀取資源檔。那麼我們要將citycode.xml檔案的Building屬性改為Resource。
操作方法:選擇citycode.xml-----點擊屬性---產生操作(Building)改為Resource。
要使用XDocument類,需要添加引用。添加System.Xml.Linq。已經添加很多次引用了,那麼這次就不詳細說怎麼操作了。
在App.xaml.cs裡面添加命名空間;
代碼如下 |
複製代碼 |
using System.Windows.Resources; using System.IO; using System.Xml.Linq; |
新增成員函數:
代碼如下 |
複製代碼 |
private void CreatDB() { using (CityDataContext db = new CityDataContext(CityDataContext.connectionString)) { if (db.DatabaseExists() == false) { //建立一個資料庫 db.CreateDatabase(); //讀取資源檔。檔案為XML格式。這個檔案的Building屬性為Resource StreamResourceInfo sri = Application.GetResourceStream(new Uri("/WeatherForecast;component/citycode.xml", UriKind.Relative)); //讀取所以資料儲存到String類型的result中 string result; using (StreamReader sr = new StreamReader(sri.Stream)) { result = sr.ReadToEnd(); } //用XDocument類解析資料 XDocument doc = XDocument.Parse(result); //解析資料並且存入資料庫 foreach (XElement item in doc.Descendants("root").Nodes()) { //由檔案中的資料可以知道。我們需要的資料在那麼兩個節點。Descendants就是尋找子節點。 string province = item.Attribute("data").Value; foreach (XElement itemnode in item.Descendants("city")) { string cityname = itemnode.Element("cityname").Value; string cityid = itemnode.Element("cityid").Value; //把資料存入資料庫 CityInfoTable cityInfo = new CityInfoTable(); cityInfo.CityCode = cityid; cityInfo.Province = province; cityInfo.CityName = cityname; db.CityInfos.InsertOnSubmit(cityInfo); } } //資料庫提交更新 db.SubmitChanges(); } } } |
在Launching事件添加如下代碼:
CreatDB();
這樣,我們就能在第一次執行程式的時候,建立資料庫,並且解析XML資料,把城市資訊存入資料庫。
那麼還是測試下吧。
在MainPage的Loaded事件中測試,查詢北京的資料,彈窗顯示。
在Loaded事件中添加如下代碼:
代碼如下 |
複製代碼 |
using (CityDataContext db = new CityDataContext(CityDataContext.connectionString)) { IQueryable<CityInfoTable> queries = from c in db.CityInfos where c.Province == "北京" && c.CityName == "北京" select c; MessageBox.Show(queries.First().CityName + queries.First().CityCode); } |
成功!那麼就把剛才添加的測試代碼注釋掉吧。。。
PS:調試資料庫,XML解析的時候我可是相當糾結了。都是心理默念不要出錯,不要出錯。。。
因為出錯的話,資料庫是建立了。但是資料八成沒有加入進去。要刪除資料庫,就要重啟模擬器了。因為重啟模擬器IsolatedStorage裡面的資料就沒了。但是,我的機子如果重啟模擬器的話,沒有個五六分鐘不行。。多出錯幾次半小時都沒了