Windows Phone 7本地數據庫的多樣化訪問,Windows Phone連接數據庫

webphp 12年前發布 | 30K 次閱讀 Windows Phone開發 移動開發 Windows Phone

在Windows Phone 7 Series的設備上有沒有本地數據庫可以利用?
沒有,在最初的Windows Phone 7 Series上沒有本地數據庫API可以利用
我應該如何為我的應用程序存儲信息? 
你可以將信息存儲在自己的存儲空間里。如果你需要大型的數據庫這里有一些選擇:Windows Phone 7 Seires 已經支持WebServices,它可以讓你容易的訪問存儲在Internet上的信息。使用一個可以被WebServices訪問的數據庫,你的應用程序就可以在連接Internet的情況下實時的獲取數據.
以后會支持本地數據庫嗎? 
當前我們沒有宣告這樣的計劃來增加這一功能;但是我們會密切關注開發人員和用戶的需求并識別哪些特性會給每個人帶來好處
如上翻譯過來,更多細節請查看原文.
目前WP7已經是Beta版本了. Windows Phone 7 支持訪問數據幾種方式為: XML、Isolated Storage[SL獨立存儲]、Cloud[云存儲].    官方意思很明確 暫不支持本地數據庫訪問. 難道我們真的沒有其他選擇嗎?未必如此.
Effiproz For Windows Phone 7
在上一篇中由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模式代碼實際創建:建:
</span>

  • 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 = @&quot;wp7db.db3&quot;;
  • 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 = @&quot;Create Table Customer
  •                       (
  •                    customername varchar(100),
  •                              customerpass varchar(100)
  •                      )  &quot;;
  • Sqlite3.exec(newsqlite, sql, 0, 0, 0);
  • string insertsql = @&quot;insert into Customer Values('&quot;+newcustomer.Username+&quot;','&quot;+newcustomer.Password+&quot;')&quot;;

  • int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);

  • if (getinsertres == Sqlite3.SQLITE_OK)
  •      {
  •             MessageBox.Show(&quot;數據插入成功!&quot;);
  •       }

  • else
  •     {
  •         MessageBox.Show(&quot;數據插入失敗!&quot;);
  •        }

  • //自動查詢數據   

  • string querysql = @&quot;select * from Customer&quot;;
  • 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());   
  •        }
  •         }
  •   }
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本篇源碼下載:
/Files/chenkai/EffProzeInWp7Codechenkai.rar
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 = @&quot;wp7db.db3&quot;;

  • 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 = @&quot;Create Table Customer
  •         (
  •           customername varchar(100),
  •     customerpass varchar(100)
  •                            )  &quot;;
  •          Sqlite3.exec(newsqlite, sql, 0, 0, 0);
  • string insertsql = @&quot;insert into Customer Values('&quot;+newcustomer.Username+&quot;','&quot;+newcustomer.Password+&quot;')&quot;;

  • int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);

  • if (getinsertres == Sqlite3.SQLITE_OK)
  •           {
  •    MessageBox.Show(&quot;數據插入成功!&quot;);
  •    }

  • else
  •           {
  •       MessageBox.Show(&quot;數據插入失敗!&quot;);
  •       }

  • //自動查詢數據   

  • string querysql = @&quot;select * from Customer&quot;;
  • 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 如有哪位同志KX上網成功 請備份這份API貢獻出來吧.

SQlite 3支持了WP7的本地數據訪問. 但是SQlite 3與EffProze最大特點是Sqlite 3沒有數據庫鏈接模式之分[內存/文件模式], 我在做完這個實例后 測試發現. 硬盤上不存在wp7db.db3這個文件. 因此我懷疑修改后SQlite 3版本對數據存儲模式應該放到內存中的

 本文由用戶 webphp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!