SQLCE使用

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添加命名空间。

[csharp] view plaincopyprint?

  1. using System.Data.Linq.Mapping;
  2. using System.ComponentModel;
using System.Data.Linq.Mapping;
using System.ComponentModel;

然后在CItyInfoTable这个数据表定义主键等属性,给出完整的CityInfoTable.cs代码

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Net;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Documents;
  6. using System.Windows.Ink;
  7. using System.Windows.Input;
  8. using System.Windows.Media;
  9. using System.Windows.Media.Animation;
  10. using System.Windows.Shapes;
  11. using System.Data.Linq.Mapping;
  12. using System.ComponentModel;
  13. namespace WeatherForecast
  14. {
  15. [Table]//把CItyInfoTable定义为表
  16. public class CityInfoTable
  17. {
  18. //定义表的自增ID。设置为主键
  19. private int _cityInfoid;
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;

[csharp] view plaincopyprint?

  1. <span style="white-space: pre;">    </span>//Column这个是定义一个成员为表字段。如果没有这个,那么这个成员不是字段
	//Column这个是定义一个成员为表字段。如果没有这个,那么这个成员不是字段

[csharp] view plaincopyprint?

  1. [Column(IsPrimaryKey = true, IsDbGenerated = true,
  2. DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
  3. public int CityInfoid
  4. {
  5. get
  6. {
  7. return _cityInfoid;
  8. }
  9. set
  10. {
  11. _cityInfoid = value;
  12. }
  13. }
  14. //定义省份名称:
  15. private string _province;
  16. [Column]
  17. public string Province
  18. {
  19. get
  20. {
  21. return _province;
  22. }
  23. set
  24. {
  25. _province = value;
  26. }
  27. }
  28. //定义城市名称
  29. private string _cityName;
  30. [Column]
  31. public string CityName
  32. {
  33. get
  34. {
  35. return _cityName;
  36. }
  37. set
  38. {
  39. _cityName = value;
  40. }
  41. }
  42. //定义城市代码
  43. private string _cityCode;
  44. [Column]
  45. public string CityCode
  46. {
  47. get
  48. {
  49. return _cityCode;
  50. }
  51. set
  52. {
  53. _cityCode = value;
  54. }
  55. }
  56. }
  57. }
        [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。

添加命名空间。

[csharp] view plaincopyprint?

  1. using System.Data.Linq;
using System.Data.Linq;

然后让这个类继承于DataContext。

给出CityDataContext.cs的完整代码:

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Net;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Documents;
  6. using System.Windows.Ink;
  7. using System.Windows.Input;
  8. using System.Windows.Media;
  9. using System.Windows.Media.Animation;
  10. using System.Windows.Shapes;
  11. using System.Data.Linq;
  12. namespace WeatherForecast
  13. {
  14. /// <summary>
  15. /// 定义一个数据库
  16. /// </summary>
  17. public class CityDataContext : DataContext
  18. {
  19. //定义数据库连接字符串
  20. public static string connectionString = "Data Source=isostore:/CityInfo.sdf";
  21. //// 传递数据库连接字符串到DataContext基类
  22. public CityDataContext(string connectionString) : base(connectionString) { }
  23. //定义一个数据表,如果有多个数据表也可以继续添加为成员变量
  24. public Table<CityInfoTable> CityInfos
  25. {
  26. get
  27. {
  28. return this.GetTable<CityInfoTable>();
  29. }
  30. }
  31. }
  32. }
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事件里面实现。

可以在这个事件里添加这样的代码创建数据库:

[csharp] view plaincopyprint?

  1. using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
  2. {
  3. if (db.DatabaseExists() == false)
  4. {
  5. //创建一个数据库
  6. db.CreateDatabase();
  7. <span style="white-space: pre;">        </span>}
  8. <span style="white-space: pre;">    </span>}
 using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
            {

                if (db.DatabaseExists() == false)
                {

                    //创建一个数据库

                    db.CreateDatabase();
		}
	}

这个我们暂时不做。现在我们先添加一个城市信息的XML文件。下载:http://dl.dbank.com/c02jod17n0

复制这个文件。在工程上面右键--粘贴。就把这个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里面添加命名空间;

[csharp] view plaincopyprint?

  1. using System.Windows.Resources;
  2. using System.IO;
  3. using System.Xml.Linq;
using System.Windows.Resources;
using System.IO;
using System.Xml.Linq;

添加成员函数:

[csharp] view plaincopyprint?

  1. private void CreatDB()
  2. {
  3. using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
  4. {
  5. if (db.DatabaseExists() == false)
  6. {
  7. //创建一个数据库
  8. db.CreateDatabase();
  9. //读取资源文件。文件为XML格式。这个文件的Building属性为Resource
  10. StreamResourceInfo sri = Application.GetResourceStream(new Uri("/WeatherForecast;component/citycode.xml",
  11. UriKind.Relative));
  12. //读取所以数据保存到String类型的result中
  13. string result;
  14. using (StreamReader sr = new StreamReader(sri.Stream))
  15. {
  16. result = sr.ReadToEnd();
  17. }
  18. //用XDocument类解析数据
  19. XDocument doc = XDocument.Parse(result);
  20. //解析数据并且存入数据库
  21. foreach (XElement item in doc.Descendants("root").Nodes())
  22. {
  23. //由文件中的数据可以知道。我们需要的数据在那么两个节点。Descendants就是寻找子节点。
  24. string province = item.Attribute("data").Value;
  25. foreach (XElement itemnode in item.Descendants("city"))
  26. {
  27. string cityname = itemnode.Element("cityname").Value;
  28. string cityid = itemnode.Element("cityid").Value;
  29. //把数据存入数据库
  30. CityInfoTable cityInfo = new CityInfoTable();
  31. cityInfo.CityCode = cityid;
  32. cityInfo.Province = province;
  33. cityInfo.CityName = cityname;
  34. db.CityInfos.InsertOnSubmit(cityInfo);
  35. }
  36. }
  37. //数据库提交更新
  38. db.SubmitChanges();
  39. }
  40. }
  41. }
 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事件添加如下代码:

[csharp] view plaincopyprint?

  1. CreatDB();
CreatDB();

这样,我们就能在第一次执行程序的时候,创建数据库,并且解析XML数据,把城市信息存入数据库。

那么还是测试下吧。

在MainPage的Loaded事件中测试,查询北京的数据,弹窗显示。

在Loaded事件中添加如下代码:

[csharp] view plaincopyprint?

  1. using (CityDataContext db = new CityDataContext(CityDataContext.connectionString))
  2. {
  3. IQueryable<CityInfoTable> queries =
  4. from c in db.CityInfos where c.Province == "北京" && c.CityName == "北京" select c;
  5. MessageBox.Show(queries.First().CityName + queries.First().CityCode);
  6. }
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里面的数据就没了。但是,我的机子如果重启模拟器的话,没有个五六分钟不行。。多出错几次半小时都没了。。

提示:如果在建立数据库处出错了。记得重启模拟器再调试。

SQLCE使用,布布扣,bubuko.com

时间: 2024-12-14 12:13:26

SQLCE使用的相关文章

Wince下sqlce数据库开发(二)

上次写到使用数据绑定的方法测试本地sqlce数据库,这次使用访问SQL Server的方法访问sqlce,你会发现他们是如此的相似... 参考资料:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html 本文的最后附有本次测试的全部代码,大家可以去下载.当然,我更希望这里作为一个交流的平台,能够相互的学习,如果你们有其他的想法希望可以告诉我 注:开发环境VS2008       开发语言:C# 1.创建Wince下的Winfo

Wince下sqlce数据库开发(一)

对于Wince下的sqlce数据库虽然很多人在用,但在我查找资料时,却发现资料是多么的匮乏,在此对自己这几天的了解做个简单介绍,希望对大家能有所帮助! 本文的最后附有所使用到的sqlce在wince下的安装文件,wince截屏工具及本示例代码的下载地址. 1.创建wince项目: 注:wince项目的创建需要在VS2008或者VS2005下 图1 创建“智能设备项目” 2.制作主界面 为主界面添加两个控件,分别为:datagrid和button,分别用于数据显示和功能控制. 图2 制作主界面 3

Windows Phone本地数据库(SQLCE):1、介绍(翻译)(转)

一只大菜鸟,最近要学习windows phone数据库相关的知识,找到了一些比较简短的教程进行学习,由于是英文的,顺便给翻译了.本身英语水平就不好,估计文中有不少错误,如果有不幸读到的童鞋请保持对翻译质量的质疑,多多指教. 这是原文地址:http://windowsphonegeek.com/tips/Windows-Phone-Mango-Local-Database%28SQL-CE%29-Introduction 正文如下: 我开始了一个新的系列——Windows Phone Mango本

Windows Phone本地数据库(SQLCE):6、[Index] attribute(翻译)(转)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第六篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点. 我将谈谈在windows phone mango本地数据库时使用[Index] attribute. 首先.要说到的是,windows phone 7.1上基本的数据库功能是SQL Compact关于Mango的一个实现.你将使用linq to sql访问存储在数据库上的数据. 注释:[In

Windows Phone本地数据库(SQLCE):5、[Association]attribute(翻译)(转)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第五篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点. 我将谈谈在windows phone mango本地数据库时使用[Association] attribute. 首先.要说到的是,windows phone 7.1上的数据库功能是SQL Compact关于Mango的一个实现.你将使用linq to sql访问存储在数据库上的数据. 1.

Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第三篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点.这个时候我将谈谈有关你使用windows phone mango本地数据库时使用[table]attribute. 1.[Table]attribute是什么? 你可以使用这个属性来指定一个类作为与数据库表或视图有关的实体类.LINQ to SQL将有这个属性的类作为持久化类. 你可以使用Ta

SQLCE本地数据库

SQLCE是一个标准得关系数据库,可以使用 LINQ 和DateContext来处理本地数据库数据库. 使用SQLCE 要在代码中使用本地数据库功能,需要添加以下命名空间 : using System.Data.Linq; using System.Data.Linq.Mapping; using Microsoft.Phone.Data.Linq; using Microsoft.Phone.Data.Linq.Mapping; DateContext能将LINQ数据库操作语句转换成关系数据库

Windows Phone本地数据库(SQLCE):2、LINQ to SQL(翻译)(转)

首先.要说到的是,windows phone 7.1上基本的数据库功能是SQL Compact关于Mango的一个实现,使用linq to sql访问存储在数据库上的数据. 1.LINQ to SQL是什么 LINQ to SQL 是一个作为.NET Framework上的一部分的ORM(对象关系映射)框架.它允许你映射你的业务对象(business object)(模型类)到数据库中的表,然后可以不用写单一的SQL语句来访问或查询数据库中的数据.随着Mango的更新,LINQ to SQL现在

Windows Phone本地数据库(SQLCE):4、[Column]attribute(翻译) (转)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第四篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点.我将谈谈在windows phone mango本地数据库时使用[Column] attribute. 首先,要说到的是,windows phone 7.1上的数据库功能是SQL Compact关于Mango的一个实现.你将使用linq to sql访问存储在数据库上的数据. 1.[Colum