最近我的的時間顯得比較緊迫. 有一些想法一直沒有時間去驗證.上週五在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的設備上有沒有本地數據庫能夠利用? 之後會支持本地數據庫嗎? |
如上翻譯過來,更多細節請查看原文.數據庫
目前WP7已是Beta版本了. Windows Phone 7 支持訪問數據幾種方式爲: XML、Isolated 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模式代碼實際建立:
- private void btnFile_Click(object sender, RoutedEventArgs e)
- {
- //isolated storage database
- string connectionString = "connection type=FILE; initial catalog=TestDb; user=SA; password=";
- using (EfzConnection conn = new EfzConnection(connectionString))
- {
- conn.Open();
- string sql = "CREATE TABLE Test(username varchar(100), password varchar(100));";
- EfzCommand cmd = conn.CreateCommand();
- cmd.CommandText = sql;
- cmd.ExecuteNonQuery();
- //獲取輸入數據
- string getusername = this.nametxt.Text;
- string getpass = this.passtxt.Text;
- sql = "INSERT INTO Test(username , password ) VALUES('" + getusername + "','"+getpass+"');";
- cmd.CommandText = sql;
- int count=cmd.ExecuteNonQuery();
- if (count == 1) 22: {
- MessageBox.Show("數據插入成功!");
- }
- else
- {
- MessageBox.Show("數據插入失敗!");
- }
- //執行查詢操做
- sql = "SELECT * FROM TEST;";
- cmd.CommandText = sql;
- EfzDataReader reader = cmd.ExecuteReader();
- reader.Read();
- //添加結果顯示
- //MessageBox.Show(string.Format("用戶名={0} —— 登陸密碼={1}", reader.GetInt32(0), reader.GetString(1)));
- tbkText.Text = String.Format("用戶名 = {0}, 登陸密碼 = {1}, 模式=文件模式 ", reader.GetString(0), reader.GetString(1));
- }
- }
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中 添加數據代碼:
- private void AddUserInfor_Click(object sender, RoutedEventArgs e)
- {
- //用戶信息
- WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer
- {
- Username=this.username.Text,
- Password=this.passsword.Text
- };
- string dbname = @"wp7db.db3";
- string getreply = string.Empty;//回調信息
- //若是數據庫文件不存在 自動建立
- Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();
- int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);
- if (getres == Sqlite3.SQLITE_OK)
- {
- //建立表
- string sql = @"Create Table Customer
- (
- customername varchar(100),
- customerpass varchar(100)
- ) ";
- Sqlite3.exec(newsqlite, sql, 0, 0, 0);
- string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";
- int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);
- if (getinsertres == Sqlite3.SQLITE_OK)
- {
- MessageBox.Show("數據插入成功!");
- }
- else
- {
- MessageBox.Show("數據插入失敗!");
- }
- //自動查詢數據
- string querysql = @"select * from Customer";
- Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);
- int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);
- if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)
- {
- //須要一個執行Reader API?
- //this.listBox1.Items.Add(getresdd.ToString());
- }
- }
- }
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