在WindowsPhone中有时候我们会一些数据的存储,这个时候我们有两种选择,一种是选择存在的独立存储文件中,一种是存储在数据库中。存储在独立存储文件中,这个相信很多用都会使用,这里不作为重点,本文主要讲一下在WindowsPhone中使用数据库SQL CE。
下面开始一步一步的带领大家实现在WindowsPhone 中使用SQL CE数据库。(该示例引自WindowsPhone 7应用开发)
一、首先,我们需要创建一个EmployeeTable类,映射为数据库中的Employee表
如下:
在创建之前需要添加引用:System.Data.Linq;
同时引入命名空间:using System.Data.Linq.Mapping;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | [Table] //特性标识该类为映射为数库中的表 //该类实现了INotifyPropertyChanged和INotifyPropertyChanging接口 public class EmployeeTable:INotifyPropertyChanged,INotifyPropertyChanging { private int _employeeId; //将EmployeeID映射为表的主键,特性Column里的含义分别为:主键,自增,int型不为空,不为空等 [Column(IsPrimaryKey = true , IsDbGenerated = true ,DbType = "INT NOT NULL Identity" , CanBeNull = false , AutoSync = AutoSync.OnInsert)] public int EmployeeID { get { return _employeeId; } set { if (_employeeId != value) { NotifyPropertyChanging( "EmployeeID" ); _employeeId = value; NotifyPropertyChanged( "EmployeeID" ); } } } private string _employeeName; [Column] //EmployeeName属性为表中EmployeeName字段 public string EmployeeName { get { return _employeeName; } set { if (_employeeName != value) { NotifyPropertyChanging( "EmployeeName" ); _employeeName = value; NotifyPropertyChanged( "EmployeeName" ); } } } private string _employeeDesc; [Column] //将EmployeeDesc属性映射为表中EmployeeDesc字段 public string EmployeeDesc { get { return _employeeDesc; } set { if (_employeeDesc != value) { NotifyPropertyChanging( "EmployeeDesc" ); _employeeDesc = value; NotifyPropertyChanged( "EmployeeDesc" ); } } } //定义PropertyChanged事件用来通知页面,表字段数据发生了改变 public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged( string propertyName) { if (PropertyChanged != null ) { PropertyChanged( this , new PropertyChangedEventArgs(propertyName)); } } //定义PropertyChanging事件通知数据上下文表的字段数据将要发生改变 public event PropertyChangingEventHandler PropertyChanging; private void NotifyPropertyChanging( string propertyname) { if (PropertyChanging != null ) { PropertyChanging( this , new PropertyChangingEventArgs(propertyname)); } } } |
通过以上的这些操作,我们已经基本上完成了Employee表的创建,映射为数据库中的EmployeeTable表
二、下面我们来新建一个EmployeeDataContext.cs类文件,创建数据库的DataContent,该类继承自DataContent,在该类中定义连接字符串,如下:
首先需要引入命名空间:using system.data.Linq;
public class EmployeeDataContext:DataContext { //数据库连接字符串 public static string DBConnectionString = "Data Source=isostore:/Employee.sdf" ; //传递数据库连接字符串到DataContext基类 public EmployeeDataContext( string connectionString): base (connectionString) { } //定义员工信息表 public Table<EmployeeTable> Employees; } |
三、创建EmployeeCollection类,该类的主要作用为页面数据绑定的集合。如下:
//绑定页面,进行显示用
public class EmployeeCollection:INotifyPropertyChanged { //用于通知属性的改变 public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged( string propertyName) { if (PropertyChanged != null ) { PropertyChanged( this , new PropertyChangedEventArgs (propertyName)); } } private ObservableCollection<EmployeeTable> _employeeTables; |
//创建EmployeeTables属性用来绑定页面数据
public ObservableCollection<EmployeeTable> EmployeeTables { get { return _employeeTables; } set { if (_employeeTables != value) { _employeeTables = value; NotifyPropertyChanged( "EmployeeTables" ); } } } } |
四、这样一个完整的数据库就创建完毕了,那么我们该如何使用呢?一般的情况下我们都是在程序启动的时候加载数据库,为此我们可以在App.xaml文件的Launching事件中做如下处理:
using (EmployeeDataContext db= new EmployeeDataContext(EmployeeDataContext.DBConnectionString)) { if (db.DatabaseExists() == false ) { db.CreateDatabase(); } } |
五、下面做一个实例进行演示:
页面布局如下:
<phone:PhoneApplicationPage.Resources> <DataTemplate x:Key= "listitem" > <Grid HorizontalAlignment= "Stretch" Width= "440" > <Grid.ColumnDefinitions> <ColumnDefinition Width= "50" /> <ColumnDefinition Width= "*" /> <ColumnDefinition Width= "100" /> </Grid.ColumnDefinitions> <TextBlock Text= "{Binding EmployeeName}" FontSize= "{StaticResource PhoneFontSizeLarge}" Grid.Column= "1" <br>VerticalAlignment= "Center" /> <Button Grid.Column= "2" Click= "deleteButton_Click" x:Name= "deleteButton" BorderThickness= "0" Margin= "0" Content= "删除" ></Button> <Button Grid.Column= "1" x:Name= "editButton" Click= "editButton_Click" BorderThickness= "0" Margin= "209,0,81,0" Content= "编辑" <br>Grid.ColumnSpan= "2" ></Button> </Grid> </DataTemplate> </phone:PhoneApplicationPage.Resources> <!--LayoutRoot 是包含所有页面内容的根网格--> <Grid x:Name= "LayoutRoot" Background= "Transparent" > <Grid.RowDefinitions> <RowDefinition Height= "Auto" /> <RowDefinition Height= "*" /> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel x:Name= "TitlePanel" Grid.Row= "0" Margin= "12,17,0,28" > <TextBlock x:Name= "ApplicationTitle" Text= "我的应用程序" Style= "{StaticResource PhoneTextNormalStyle}" /> <TextBlock x:Name= "PageTitle" Text= "EmployeeShow" Margin= "9,-7,0,0" Style= "{StaticResource PhoneTextTitle1Style}" /> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name= "ContentPanel" Grid.Row= "1" Margin= "12,0,12,0" > <TextBlock FontSize= "24" Name= "textBlock1" Text="员工名字: " Margin=" 12,22,330,544" /> <TextBlock FontSize= "24" Margin= "12,93,330,473" Name= "textBlock2" Text= "简介:" /> <TextBox Height= "72" HorizontalAlignment= "Left" Margin= "132,6,0,0" Name= "txtname" Text= "" VerticalAlignment= "Top" Width= "281" /> <TextBox Height= "72" HorizontalAlignment= "Left" Margin= "132,78,0,0" Name= "txtdesc" Text= "" VerticalAlignment= "Top" Width= "281" /> <Button Content= "保存" Height= "72" HorizontalAlignment= "Left" Margin= "243,150,0,0" Name= "button2" VerticalAlignment= "Top" Width= "160" Click= "button2_Click" /> <ListBox Height= "293" HorizontalAlignment= "Left" Margin= "-12,228,0,0" Name= "listBox1" VerticalAlignment= "Top" Width= "460" ItemTemplate= "{StaticResource listitem}" /> </Grid> </Grid> </phone:PhoneApplicationPage> |
.cs页的处理代码如下:
public partial class EmployeeShow : PhoneApplicationPage { //创建DataContext用于操作独立的数据库 private EmployeeDataContext employeeDB; private EmployeeCollection employeeCol = new EmployeeCollection(); |
public EmployeeShow() { InitializeComponent(); //创建EmployeeDataContext实例 employeeDB = new EmployeeDataContext(EmployeeDataContext.DBConnectionString); var employeeInDB = from EmployeeTable employee in employeeDB.Employees select employee; //为页面创建数据绑定源 employeeCol.EmployeeTables = new System.Collections.ObjectModel.ObservableCollection<EmployeeTable>(employeeInDB); listBox1.ItemsSource = employeeCol.EmployeeTables; } |
//删除信息
private void deleteButton_Click( object sender, RoutedEventArgs e) { var button = sender as Button; if (button != null ) { EmployeeTable edelete = button.DataContext as EmployeeTable; // employeeCol.EmployeeTables.Remove(edelete); employeeDB.Employees.DeleteOnSubmit(edelete); employeeDB.SubmitChanges(); } } |
//保存信息
private void button2_Click( object sender, RoutedEventArgs e) { if (txtname.Text != "" && txtdesc.Text != "" ) { //编辑状态 if (State.Count > 0 && State[ "employee" ] != null ) { EmployeeTable employee = (EmployeeTable)State[ "employee" ]; employee.EmployeeName = txtname.Text; employee.EmployeeDesc = txtdesc.Text; employeeDB.SubmitChanges(); employeeCol.EmployeeTables.Add(employee); State[ "employee" ] = null ; } Else //添加新的信息 { EmployeeTable newEmployee = new EmployeeTable { EmployeeName = txtname.Text, EmployeeDesc = txtdesc.Text }; employeeCol.EmployeeTables.Add(newEmployee); employeeDB.Employees.InsertOnSubmit(newEmployee); employeeDB.SubmitChanges(); txtname.Text = "" ; txtdesc.Text = "" ; } listBox1.ItemsSource = employeeCol.EmployeeTables; } else { MessageBox.Show( "姓名和简介不能为空!" ); } } |
//编辑信息
private void editButton_Click( object sender, RoutedEventArgs e) { var button = sender as Button; if (button != null ) { EmployeeTable eedit = button.DataContext as EmployeeTable; txtname.Text = eedit.EmployeeName; txtdesc.Text = eedit.EmployeeDesc; State[ "employee" ] = eedit; employeeCol.EmployeeTables.Remove(eedit); } } } |
效果如图:
好了,到这里我们已经基本上实现了在WindowsPhone手机中使用SQLCE数据库了,希望可以对朋友们有所帮助。
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器