多樣化實現Windows Phone 7本地數據庫訪問<1>

最近我的的時間顯得比較緊迫. 有一些想法一直沒有時間去驗證.上週五在MSDN上公佈的活動Silverlight Events:與John Papa面對面學習Silverlight 4中由於一時疏忽趕到MSDN會客廳是活動已經結束了. 不過我順便看看活動中對JohnPapa提出問題: 其中有人明確提出Silverlight 下一版本會把本地數據庫訪問支持是否會在下一個Silverlight版本加入?[惋惜我沒有看到John Papa本人的回覆]. 這忽然讓我聯想到最近一直在看官方公佈開源項目中Windows Phone 7對本地數據數據庫操做方式. 剛好上週我作了一個SQlite相關測試. 有意無心間讓我把Windows Phone 7 對本地數據庫Local DataBase訪問與開源數據庫聯繫在一塊兒.以下是我我的對WP7本地數據庫訪問方式的驗證. 若有疑問請及時提出html

Windows Phone 7在CTP 版本時微軟官方就對開發者提出問題作了兩次集體迴應. 一次是在3月19日 另一次是5月19日.回覆內容詳見Windows Phone 7 Series Developer General FAQ (Updated 5/19/2010), 內容中包含了WP7開發中多個細節和下一步須要改善的方向等作了明確回覆. 固然其中也包含了你們很關心的數據訪問. 具體迴應內容以下:node

在Windows Phone 7 Series的設備上有沒有本地數據庫能夠利用?
沒有,在最初的Windows Phone 7 Series上沒有本地數據庫API能夠利用
我應該如何爲個人應用程序存儲信息?
你能夠將信息存儲在本身的存儲空間裏。若是你須要大型的數據庫這裏有一些選擇:Windows Phone 7 Seires 已經支持WebServices,它可讓你容易的訪問存儲在Internet上的信息。使用一個能夠被WebServices訪問的數據庫,你的應用程序就能夠在鏈接Internet的狀況下實時的獲取數據.程序員

之後會支持本地數據庫嗎?
當前咱們沒有宣告這樣的計劃來增長這一功能;可是咱們會密切關注開發人員和用戶的需求並識別哪些特性會給每一個人帶來好處sql

如上翻譯過來,更多細節請查看原文.數據庫

目前WP7已是Beta版本了. Windows Phone 7 支持訪問數據幾種方式爲: XMLIsolated Storage[SL獨立存儲]、Cloud[雲存儲].    官方意思很明確 暫不支持本地數據庫訪問. 難道咱們真的沒有其餘選擇嗎?未必如此.windows

<1>Effiproz For Windows Phone 7ide

在上一篇中由Effiproz DataBase來看.NET開源數據庫發展我提到Effiproz開源數據庫.NET多方面支持,其中就包含WP7.這爲咱們把Effiproz本地數據庫提供訪問WP7數據提供了可能.首先說明Effiproz運用在WP7條件:  Windows Phone Developer Tools Beta[最新版本]/VS2010[工具].工具

首先建立一個WP7程序 引入Effiproz數據庫DLL[詳見×××]到項目中:佈局

建立一個界面用戶輸入用戶名和密碼並 保存到Effiproz數據庫中:學習

數據插入成功後自動查詢並實現出來:

也許有人會注意到兩個FileDB和MemoryDB 按鈕. 其實對應後臺中Effproze數據兩種存儲數據模式:文件和內存模式. 上篇中我就曾講到第一個純.NET版本開源數據庫出現問題矛盾就是這兩種模式. 內存模式中數據提取直接 速度較快. 免去File模式讀取硬盤IO和每次建立Connection的時間. 可是缺點也很致命. 速度雖然有了必定提高 但最終代價是咱們數據沒法再內存消失後存儲. 也就是數據最終沒法持久化存儲文件中.  EffProze就是從HSQL繼承而來. 因此保存這兩種模式 供用戶更多場景下選擇. 先看一下FileDB模式代碼實際建立:

  
  
  
  
  1. private void btnFile_Click(object sender, RoutedEventArgs e)     
  2.       {     
  3.         //isolated storage database    
  4.        string connectionString = "connection type=FILE; initial catalog=TestDb; user=SA; password=";     
  5.       using (EfzConnection conn = new EfzConnection(connectionString))     
  6.        {    
  7.        conn.Open();    
  8.           string sql = "CREATE TABLE Test(username varchar(100), password varchar(100));";     
  9.                EfzCommand cmd = conn.CreateCommand();    
  10.               cmd.CommandText = sql;    
  11.               cmd.ExecuteNonQuery();     
  12.              //獲取輸入數據    
  13.         string getusername = this.nametxt.Text;    
  14.                string getpass = this.passtxt.Text;    
  15.                sql = "INSERT INTO Test(username , password ) VALUES('" + getusername + "','"+getpass+"');";    
  16.           cmd.CommandText = sql;    
  17.           int count=cmd.ExecuteNonQuery();     
  18.           if (count == 1)  22:                  {    
  19.               MessageBox.Show("數據插入成功!");    
  20.         }    
  21.              else    
  22.               {    
  23.                   MessageBox.Show("數據插入失敗!");    
  24.           }    
  25.             //執行查詢操做    
  26.            sql = "SELECT * FROM TEST;";    
  27.         cmd.CommandText = sql;    
  28.        EfzDataReader reader = cmd.ExecuteReader();     
  29.        reader.Read();    
  30.            //添加結果顯示    
  31.            //MessageBox.Show(string.Format("用戶名={0} —— 登陸密碼={1}", reader.GetInt32(0), reader.GetString(1)));    
  32.             tbkText.Text = String.Format("用戶名 = {0}, 登陸密碼 = {1}, 模式=文件模式 ", reader.GetString(0), reader.GetString(1));    
  33.         }    
  34.    } 

EffProze數據庫基本上引入T-SQL大部分關鍵字支持,基本上合ADO.NET鏈接數據庫方式雷同. 這也讓.NET程序員不用再看EffProze新的API痛苦,而經過ADO.NET方式對比便可輕鬆編碼.在代碼中鏈接字符串中connection type=FILE/Memory 每次鏈接都須要指定採用數據庫模式. 這是必須的. Memory模式大同小異不在贅述.

當有了EffProze數據庫在WP7中做一些複雜數據操做. 是否考慮咱們咱們這樣在代碼方式太過粗糙原始. 咱們須要一個查詢工具.

固然EffPoze官方也爲咱們考慮到這點. 特地推出一款QueryTool. 固然有多個版本的,你想快速體驗能夠訪問QueryTool in Silverlight 4 liveDemo 把QueryTool利用Silverlight 版本 4來實現. 另一個版本須要到官方下載 QueryTool 1.2 Version[點擊下載]:  提示目前工具支持.NET版本是3.5以上 本地運行:

如上提示咱們須要打開數據庫文件,Effproze數據庫文件格式爲: [.properties]  編寫的SQL腳本對應格式爲:[.Script]和SQl那一套徹底不一樣.  下載文件中有實例數據庫SamplyDB. 打開:

很簡單佈局,相似SQLSErver. 對T-SQl標準中關鍵字全面進行高亮支持. 這比SQlite工具要友好. 但我我的使用整體以爲很難受.  用戶體驗不太好. 其中涉及幾個方面:

A:對T-Sql標準的有些關鍵字語法檢查太過於嚴密. 大小寫敏感. 寫T-Sql出錯概率大大增長.

B:工具功能過於簡單. 左邊菜單中除了展出和隱藏沒有任何對DataBase和表 以及View /Proc的直接操做 只能用T-sql, 這樣一來 咱們隊數據庫操做所有靠T-sql 工做量劇增.

C:最令我不舒服的是 每次出現錯誤提示太過於簡單. 特別大批量T-SQl 沒法準肯定位錯誤大概位置 那就更讓人望而生畏了.

D:沒有批量數據導入導出. 對於數據插入 沒有這樣的功能 工做量 真是太使人後怕了.

因此這個對使用這個工具原則是: 能避免使用就儘可能避免使用. 基本上我昨天調試一個對數據庫全部存儲過程加密 調到最後看到下面始終不變錯誤提示我先崩潰掉了.真是很杯具啊. 各位也能夠適當使用.

如上是EffProze數據庫對WP7數據訪問支持一個簡單示例以及基本工具使用. 若有疑問請在留言中提出.我會及時回覆 ,提供EffProze use In WP7

×××見附件。

<2>SQlite For Windows  Phone 7

在本地數據庫訪問其實我最早嘗試SQlite,做爲移動平臺Android默認數據庫大量運用,沒有其餘緣由—只是由於我我的對Sqlite操做很熟. 雖然沒有了WP7官方的支持. 可是開源社區力量無線的. 國外有人改寫開源Sqlite 3版本使其支持WP7本地數據訪問. 咱們須要添加一個DLL: Community.CsharpSqlite.WP.dll [源碼中]引用.

建立一個簡單頁面測試 添加數據後自動查詢數據並顯示ListBox中:

插入數據成功 把插入數據經過自動查詢方式顯示在ListBox中 添加數據代碼:

  
  
  
  
  1. private void AddUserInfor_Click(object sender, RoutedEventArgs e)     
  2.    {     
  3.           //用戶信息     
  4.         WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer     
  5.           {     
  6.       Username=this.username.Text,     
  7.             Password=this.passsword.Text     
  8.         };    
  9.           string dbname = @"wp7db.db3";    
  10.         string getreply = string.Empty;//回調信息     
  11.          //若是數據庫文件不存在 自動建立    
  12.         Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();   
  13.      int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);   
  14.         if (getres == Sqlite3.SQLITE_OK)    
  15.       {    
  16.             //建立表   
  17.         string sql = @"Create Table Customer    
  18.                              (    
  19.                                    customername varchar(100),    
  20.                                customerpass varchar(100)    
  21.                             )  ";   
  22.               Sqlite3.exec(newsqlite, sql, 0, 0, 0);    
  23.         string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";  
  24.           int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);    
  25.           if (getinsertres == Sqlite3.SQLITE_OK)    
  26.             {    
  27.              MessageBox.Show("數據插入成功!");    
  28.        }    
  29.         else    
  30.            {   
  31.               MessageBox.Show("數據插入失敗!");    
  32.            }     
  33.             //自動查詢數據     
  34.           string querysql = @"select * from Customer";    
  35.           Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);   
  36.  
  37.            int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);    
  38.          if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)   
  39.          {   
  40.               //須要一個執行Reader API?    
  41.               //this.listBox1.Items.Add(getresdd.ToString());    
  42.           }    
  43.     }     
  44.    } 

SQlite 3修改後可以支持對WP7數據訪問 .大概方式基本同EffProze有些雷同.  可是在實際編碼中.Effproze封裝API的基本同ADO.NET類似. 這樣廣大的.NET程序員無需再熟悉EffProze數據庫本身API, 而修改SQlite 3支持WP7 不一樣的是. 這裏SQlite 3徹底創造本身的一套API. 和原來支持.NET 訪問的ADO.NET For SQlite 3  DataProvders徹底不一樣. 沒有任何關聯.

那就痛苦了.因此咱們須要一個SQlite 3訪問WP7 的詳細API.  可是很遺憾.若是訪問到這份API 須要***.具體地址:Sqlite 3 For Windows Phoen Created API訪問地址:  Sqlite 3 For Wp7 API 若有哪位同志***成功 請備份這份API貢獻出來吧.

SQlite 3支持了WP7的本地數據訪問. 可是SQlite 3與EffProze最大特色是Sqlite 3沒有數據庫連接模式之分[內存/文件模式], 我在作完這個實例後 測試發現. 硬盤上不存在wp7db.db3這個文件. 所以我懷疑修改後SQlite 3版本對數據存儲模式應該放到內存中的. 固然這是我我的猜想. 沒有獲得做者本人的證明.

如上寫了一個建的Sqlite For Wp7 DEmo. ×××見附件。

<3>結語

本篇主要驗證EffProze和修改Sqlite 數據庫對Windows Phone 7 本地數據訪問支持.  測試結果是可行的.這是第一篇 下一篇我會詳細介紹其餘方式來作WP7本地數據訪問.  固然如上也是我我的測試. 不免會有紕漏的地方. 若是喲疑問請及時留言. 我會及時回覆.

參考資料:

Sqlite 3 For Windows Phoen Created

Sqlite 3 For Wp7 API

LocalDAtaBase  For Windows  Phone 7

DotaSys Windows  Phone 7  Demo

相關文章
相關標籤/搜索