Windows Phone 7 本地数据库SQL Server CE(芒果更新)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

Windows Phone的第一个版本7.0版本里面是没有本地数据库支持的,要使用数据库只能够使用第三方的数据库组件。Windows Phone的本地数据库SQL Server CE7.1版本即芒果更新的新特性,所以你要在应用程序中使用SQL Server CE数据库必须使用Windows Phone 7.1API才行。

下面用一个实例演示如何使用SQL Server CE数据库。
(1)创建数据表以及数据库的数据上下文DateContent
先创建一个员工信息表,用于保存员工的名字和简介,员工表有一个自增的ID。
EmployeeTable.cs

 
 
  1. using System.Data.Linq.Mapping;  
  2. using System.ComponentModel;  
  3.  
  4. namespace SQLServerDemo  
  5. {  
  6.     [Table]  
  7.     public class EmployeeTable : INotifyPropertyChanged, INotifyPropertyChanging  
  8.     {  
  9.         // 定义员工表独立增长ID,设置为主键  
  10.         private int _employeeId;  
  11.  
  12.         [Column(IsPrimaryKey = trueIsDbGenerated = trueDbType = "INT NOT NULL Identity"CanBeNull = falseAutoSyncAutoSync = AutoSync.OnInsert)]  
  13.         public int EmployeeID  
  14.         {  
  15.             get  
  16.             {  
  17.                 return _employeeId;  
  18.             }  
  19.             set  
  20.             {  
  21.                 if (_employeeId != value)  
  22.                 {  
  23.                     NotifyPropertyChanging("EmployeeID");  
  24.                     _employeeId = value;  
  25.                     NotifyPropertyChanged("EmployeeID");  
  26.                 }  
  27.             }  
  28.         }  
  29.  
  30.         // 定义员工名字字段  
  31.         private string _employeeName;  
  32.  
  33.         [Column]  
  34.         public string EmployeeName  
  35.         {  
  36.             get  
  37.             {  
  38.                 return _employeeName;  
  39.             }  
  40.             set  
  41.             {  
  42.                 if (_employeeName != value)  
  43.                 {  
  44.                     NotifyPropertyChanging("EmployeeName");  
  45.                     _employeeName = value;  
  46.                     NotifyPropertyChanged("EmployeeName");  
  47.                 }  
  48.             }  
  49.         }  
  50.  
  51.         //定义员工简介字段  
  52.         private string _employeeDesc;  
  53.  
  54.         [Column]  
  55.         public string EmployeeDesc  
  56.         {  
  57.             get  
  58.             {  
  59.                 return _employeeDesc;  
  60.             }  
  61.             set  
  62.             {  
  63.                 if (_employeeDesc != value)  
  64.                 {  
  65.                     NotifyPropertyChanging("EmployeeDesc");  
  66.                     _employeeDesc = value;  
  67.                     NotifyPropertyChanged("EmployeeDesc");  
  68.                 }  
  69.             }  
  70.         }  
  71.  
  72.         #region INotifyPropertyChanged Members  
  73.  
  74.         public event PropertyChangedEventHandler PropertyChanged;  
  75.  
  76.         //用来通知页面表的字段数据产生了改变  
  77.         private void NotifyPropertyChanged(string propertyName)  
  78.         {  
  79.             if (PropertyChanged != null)  
  80.             {  
  81.                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
  82.             }  
  83.         }  
  84.  
  85.         #endregion  
  86.  
  87.         #region INotifyPropertyChanging Members  
  88.  
  89.         public event PropertyChangingEventHandler PropertyChanging;  
  90.  
  91.         // 用来通知数据上下文表的字段数据将要产生改变  
  92.         private void NotifyPropertyChanging(string propertyName)  
  93.         {  
  94.             if (PropertyChanging != null)  
  95.             {  
  96.                 PropertyChanging(this, new PropertyChangingEventArgs(propertyName));  
  97.             }  
  98.         }  
  99.  
  100.         #endregion  
  101.  
  102.     }  

 

创建数据库的DataContent, 定义一个 EmployeeDataContext 类来继承 DataContext ,在 EmployeeDataContext 中定义数据库连接字符串,以及员工信息表。
EmployeeDataContext.cs

 


 
 
  1. using System.Data.Linq;  
  2.  
  3. namespace SQLServerDemo  
  4. {  
  5.     public class EmployeeDataContext : DataContext  
  6.     {  
  7.         // 数据库链接字符串  
  8.         public static string DBConnectionString = "Data Source=isostore:/Employee.sdf";  
  9.  
  10.         // 传递数据库连接字符串到DataContext基类  
  11.         public EmployeeDataContext(string connectionString)  
  12.             : base(connectionString)  
  13.         { }  
  14.  
  15.         // 定义一个员工信息表  
  16.         public Table<EmployeeTable> Employees;  
  17.     }  
(2) 创建页面数据绑定的集合
EmployeeCollection.cs

 


 
 
  1. using System.ComponentModel;  
  2. using System.Collections.ObjectModel;  
  3.  
  4. namespace SQLServerDemo  
  5. {  
  6.     //EmployeeCollection用于跟页面的数据绑定  
  7.     public class EmployeeCollection : INotifyPropertyChanged  
  8.     {  
  9.         //定义ObservableCollection来绑定页面的数据  
  10.         private ObservableCollection<EmployeeTable> _employeeTables;  
  11.         public ObservableCollection<EmployeeTable> EmployeeTables  
  12.         {  
  13.             get  
  14.             {  
  15.                 return _employeeTables;  
  16.             }  
  17.             set  
  18.             {  
  19.                 if (_employeeTables != value)  
  20.                 {  
  21.                     _employeeTables = value;  
  22.                     NotifyPropertyChanged("EmployeeTables");  
  23.                 }  
  24.             }  
  25.         }  
  26.  
  27.         #region INotifyPropertyChanged Members  
  28.  
  29.         public event PropertyChangedEventHandler PropertyChanged;  
  30.  
  31.         //用于通知属性的改变  
  32.         private void NotifyPropertyChanged(string propertyName)  
  33.         {  
  34.             if (PropertyChanged != null)  
  35.             {  
  36.                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
  37.             }  
  38.         }  
  39.         #endregion  
  40.     }  
(3)创建数据库,绑定数据,实现员工信息表的增删改查操作。
在App.xaml.cs中的程序加载事件中进行创建数据库

 


 
 
  1. private void Application_Launching(object sender, LaunchingEventArgs e)  
  2.         {  
  3.             //如果数据库不存在则创建一个数据库  
  4.             using (EmployeeDataContext db = new EmployeeDataContext(EmployeeDataContext.DBConnectionString))  
  5.             {  
  6.                 if (db.DatabaseExists() == false)  
  7.                 {  
  8.                     //创建一个数据库  
  9.                     db.CreateDatabase();  
  10.                 }  
  11.             }  
  12.         } 

MainPage.xaml文件代码

 


 
 
  1. <phone:PhoneApplicationPage   
  2.     x:Class="SQLServerDemo.MainPage" 
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  5.     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
  6.     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
  7.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  8.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  9.     mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
  10.     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
  11.     FontSize="{StaticResource PhoneFontSizeNormal}" 
  12.     Foreground="{StaticResource PhoneForegroundBrush}" 
  13.     SupportedOrientations="Portrait" Orientation="Portrait" 
  14.     shell:SystemTray.IsVisible="True"> 
  15.  
  16.     <Grid x:Name="LayoutRoot" Background="Transparent"> 
  17.         <Grid.RowDefinitions> 
  18.             <RowDefinition Height="Auto"/> 
  19.             <RowDefinition Height="*"/> 
  20.         </Grid.RowDefinitions> 
  21.  
  22.         <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
  23.             <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 
  24.             <TextBlock x:Name="PageTitle" Text="SQL Server" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
  25.         </StackPanel> 
  26.  
  27.         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
  28.             <Grid Margin="0,0,0,385"> 
  29.                 <Grid.ColumnDefinitions> 
  30.                     <ColumnDefinition Width="*" /> 
  31.                     <ColumnDefinition Width="Auto" /> 
  32.                 </Grid.ColumnDefinitions> 
  33.                 <TextBlock FontSize="30" Height="37" HorizontalAlignment="Left" Margin="12,18,0,0" Name="textBlock1" Text="员工名字:" VerticalAlignment="Top" /> 
  34.                 <TextBox Name="name" Text=""  Margin="145,0,6,144" /> 
  35.                   
  36.                 <TextBlock FontSize="30" Height="52" HorizontalAlignment="Left" Margin="18,74,0,0" Name="textBlock2" Text="简介:" VerticalAlignment="Top" /> 
  37.                 <TextBox Height="79" HorizontalAlignment="Left" Margin="93,65,0,0" Name="desc" Text="" VerticalAlignment="Top" Width="357" /> 
  38.  
  39.                 <Button   
  40.                     Content="保存" x:Name="addButton" 
  41.                     Click="addButton_Click" Margin="219,132,6,6" /> 
  42.  
  43.             </Grid> 
  44.  
  45.             <ListBox x:Name="toDoItemsListBox" ItemsSource="{Binding EmployeeTables}" Margin="12,241,12,0" Width="440"> 
  46.                <ListBox.ItemTemplate> 
  47.                     <DataTemplate> 
  48.                         <Grid HorizontalAlignment="Stretch" Width="440"> 
  49.                             <Grid.ColumnDefinitions> 
  50.                                 <ColumnDefinition Width="50" /> 
  51.                                 <ColumnDefinition Width="*" /> 
  52.                                 <ColumnDefinition Width="100" /> 
  53.                             </Grid.ColumnDefinitions> 
  54.                           
  55.                             <TextBlock 
  56.                                 Text="{Binding EmployeeName}" 
  57.                                 FontSize="{StaticResource PhoneFontSizeLarge}" 
  58.                                 Grid.Column="1" 
  59.                                 VerticalAlignment="Center"/> 
  60.                             <Button 
  61.                                 Grid.Column="2" 
  62.                                 x:Name="deleteButton" 
  63.                                 BorderThickness="0"                                  
  64.                                 Margin="0" 
  65.                                 Click="deleteButton_Click" 
  66.                                 Content="删除"> 
  67.                             </Button> 
  68.                             <Button 
  69.                                 Grid.Column="1" 
  70.                                 x:Name="editButton" 
  71.                                 BorderThickness="0"                                  
  72.                                 Margin="209,0,81,0" 
  73.                                 Click="editButton_Click" 
  74.                                 Content="编辑" Grid.ColumnSpan="2"> 
  75.                             </Button> 
  76.                         </Grid> 
  77.                    </DataTemplate> 
  78.                 </ListBox.ItemTemplate>   
  79.             </ListBox>     
  80.         </Grid> 
  81.     </Grid> 
  82.  
  83. </phone:PhoneApplicationPage> 

MainPage.xaml.cs文件代码

 


 
 
  1. using System.Linq;  
  2. using System.Windows;  
  3. using System.Windows.Controls;  
  4. using Microsoft.Phone.Controls;  
  5. using System.Collections.ObjectModel;  
  6.  
  7. namespace SQLServerDemo  
  8. {  
  9.     public partial class MainPage : PhoneApplicationPage  
  10.     {  
  11.         // 创建DataContext实例用于用于操作本地的数据库  
  12.         private EmployeeDataContext employeeDB;  
  13.         private EmployeeCollection employeeCol = new EmployeeCollection();  
  14.  
  15.         public MainPage()  
  16.         {  
  17.             InitializeComponent();  
  18.  
  19.             //连接数据库并初始化DataContext实例  
  20.             employeeDB = new EmployeeDataContext(EmployeeDataContext.DBConnectionString);  
  21.  
  22.             // 使用Linq查询语句查询EmployeeTable表的所有数据  
  23.             var employeesInDB = from EmployeeTable employee in employeeDB.Employees  
  24.                                 select employee;  
  25.  
  26.             // 将查询的结果返回到页面数据绑定的集合里面  
  27.             employeeCol.EmployeeTables = new ObservableCollection<EmployeeTable>(employeesInDB);  
  28.  
  29.             //赋值给当前页面的DataContext用于数据绑定  
  30.             this.DataContext = employeeCol;  
  31.         }  
  32.  
  33.         /// <summary> 
  34.         /// 删除操作  
  35.         /// </summary> 
  36.         /// <param name="sender"></param> 
  37.         /// <param name="e"></param> 
  38.         private void deleteButton_Click(object sender, RoutedEventArgs e)  
  39.         {  
  40.             // 获取单击的按钮实例  
  41.             var button = sender as Button;  
  42.  
  43.             if (button != null)  
  44.             {  
  45.                 //获取当前按钮绑定的DataContext,即当前的删除的EmployeeTable实例  
  46.                 EmployeeTable employeeForDelete = button.DataContext as EmployeeTable;  
  47.                 //移除绑定集合里面要删除的EmployeeTable记录  
  48.                 employeeCol.EmployeeTables.Remove(employeeForDelete);  
  49.                 // 移除数据库里面要删除的EmployeeTable记录  
  50.                 employeeDB.Employees.DeleteOnSubmit(employeeForDelete);  
  51.                 //保存数据库的改变  
  52.                 employeeDB.SubmitChanges();  
  53.             }  
  54.         }  
  55.  
  56.         /// <summary> 
  57.         /// 保存操作,处理新增和编辑员工信息  
  58.         /// </summary> 
  59.         /// <param name="sender"></param> 
  60.         /// <param name="e"></param> 
  61.         private void addButton_Click(object sender, RoutedEventArgs e)  
  62.         {  
  63.             //控制员工名字和简介不能为空  
  64.             if (name.Text != "" && desc.Text != "")  
  65.             {  
  66.                 if (State.Count>0 && State["employee"] != null )//编辑状态  
  67.                 {  
  68.                     //获取编辑的EmployeeTable对象  
  69.                     EmployeeTable employee = (EmployeeTable)State["employee"];  
  70.                     employee.EmployeeName = name.Text;  
  71.                     employee.EmployeeDesc = desc.Text;  
  72.                     //保存数据库的改变  
  73.                     employeeDB.SubmitChanges();  
  74.                     //添加绑定集合的数据,因为在单击编辑的时候移除了  
  75.                     employeeCol.EmployeeTables.Add(employee);  
  76.                     State["employee"] = null;  
  77.                 }  
  78.                 else//新增状态  
  79.                 {  
  80.                     //创建一条表的数据  
  81.                     EmployeeTable newnewEmployee = new EmployeeTable { EmployeeName = name.Text, EmployeeDesc = desc.Text };  
  82.                     //添加绑定集合的数据  
  83.                     employeeCol.EmployeeTables.Add(newEmployee);  
  84.                     //插入数据库  
  85.                     employeeDB.Employees.InsertOnSubmit(newEmployee);  
  86.                     //保存数据库的改变  
  87.                     employeeDB.SubmitChanges();  
  88.                 }  
  89.                   
  90.                 name.Text = "";  
  91.                 desc.Text = "";  
  92.             }  
  93.             else  
  94.             {  
  95.                 MessageBox.Show("姓名和简介不能为空!");  
  96.             }  
  97.         }  
  98.  
  99.         /// <summary> 
  100.         /// 编辑操作  
  101.         /// </summary> 
  102.         /// <param name="sender"></param> 
  103.         /// <param name="e"></param> 
  104.         private void editButton_Click(object sender, RoutedEventArgs e)  
  105.         {  
  106.             // 获取单击的按钮实例  
  107.             var button = sender as Button;  
  108.  
  109.             if (button != null)  
  110.             {  
  111.                 //获取当前按钮绑定的DataContext,即当前的编辑的EmployeeTable实例  
  112.                 EmployeeTable employeeForEdit = button.DataContext as EmployeeTable;  
  113.                 name.Text = employeeForEdit.EmployeeName;  
  114.                 desc.Text = employeeForEdit.EmployeeDesc;  
  115.                 //将需要编辑的表实例存储在State里面  
  116.                 State["employee"] = employeeForEdit;  
  117.                 employeeCol.EmployeeTables.Remove(employeeForEdit);  
  118.             }  
  119.         }  
  120.     }  

运行效果如下:

 

 


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078591


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
20天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
26天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
26天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
6月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
5月前
|
SQL 关系型数据库 MySQL
Windows服务器的最佳数据库是什么?
【7月更文挑战第20天】Windows服务器的最佳数据库是什么?
104 5
|
5月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
6月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
5月前
|
数据库 数据安全/隐私保护
Failed to load resource: the server responded with a status of 404 ()出错的原因是,因为自己调试的时候,设置了与宝塔不一样的数据库
Failed to load resource: the server responded with a status of 404 ()出错的原因是,因为自己调试的时候,设置了与宝塔不一样的数据库
|
5月前
|
关系型数据库 MySQL Go
mysql,数据库Server returns invalid timezone. Go to ‘Advanced‘ tab 数据库的行和列没有出现怎么办p
mysql,数据库Server returns invalid timezone. Go to ‘Advanced‘ tab 数据库的行和列没有出现怎么办p