多样化实现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

相关文章
相关标签/搜索