澳门美高梅手机网站SQL Server 2012 Express LocalDB

微软流行推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express
的运作格局,特别契合用在付出环境使用,也内置在 Visual Studio 2012 之中。

3种多少绑定形式  One提姆e(三遍绑定) OneWay(单项绑定) TwoWay(双向绑定)

关于 SQL Server 2012 Express LocalDB 的运作情势

One提姆(Tim)e:仅在数额绑定创设时拔取数据源更新目的。

在安装 LocalDB 时会复制一个 SQL Server Express
实例所需的起码文件,基本上 LocalDB 几乎同一完整的 SQL Server Express
数据库引擎,且 LocalDB 情势启动的 SQL Server Database Engine 实例与 SQL
Server Express 具有同样的限量 (因为跟 SQL Server Express
共享相同的文本),但 LocalDB 由于简化了管住,所以比 SQL Server Express
还多了一些限量,不过这一个限制普通不影响开发。相对旧版的 SQL Server 2008
Express 来说,两者有些差距性,相比如下:

列子:

  • SQL Server 2008 Express
  • 安装 SQL Server 2008 Express 的过程时间花得相比久
  • 经过 SQL Server 2008 Express 安装程序五次只好设置一个 SQL 实例
    (Instance),若要安装更多实例则必须在运行五次 SQL Server 2008 Express
    安装程序
    注:默认实例名称为 SQLEXPRESS
  • 需通过 SQL Server 布局管理器Windows 劳务管理器
    启动该实例
  • SQL Server 2012 Express LocalDB
  • 安装 SQL Server 2012 Express
    LocalDB

    的历程相当快 (安装时间至极短)
  • 设置 SQL Server 2012 Express LocalDB 完后,默认会有个电动实例
    v11.0,但此后若要建立其他实例不再需要周转安装程序,只需通过
    SqlLocalDB.exe
    工具程序即可自由建立新的实例,建立一个实例的年月不领先 3 秒!
  • 可通过破例的连日字符串机动启动该实例,或可经过
    SqlLocalDB.exe
    工具程序启动,应用程序不需复杂或耗时的机件工作即可初始采取数据库!
  • 在同样台主机里,每个用户都足以建立自己的 LocalDB
    实例,每个实例是以不同使用者身分运行不同进程,所以不等使用者可有同名的实例

首先步,创制数据源对象让Person类实现INotifyPropertyChanged接口,该接口具有PropertyChanged事件,PropertyChanged事件在数据源暴发变化时候通知绑定

SQL Server 2012 Express LocalDB 区分二种实例类型,分别为:

.cs

  • LocalDB 活动实例 ( Automatic Instances )
namespace SilverlightApplication2
{
    public class Person:INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        private String _Name;
        public String Name
        {
            get { return this._Name; }
            set
            {
                this._Name = value;
                NotifyPropertyChanged("Name");
            }
        }

        private int _Age;
        public  int Age
        {
            get { return this._Age; }
            set
            {
                this._Age = value;
                NotifyPropertyChanged("Age");

            }
        }

        private String _Address;
        public String Address
        {
            get { return this._Address; }
            set
            {
                this._Address = value;
                NotifyPropertyChanged("Address");
            }
        }

        public void NotifyPropertyChanged(String propertyName)
        {
            if(PropertyChanged!=null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

}

LocalDB 自动实例是公用的。

关于INotifyPropertyChanged
 参见http://www.cnblogs.com/beginor/archive/2012/08/13/2636418.html

  • 安装完 LocalDB 后的 v11.0
    就是机动实例,即便感到唯有一个实例,可是由于在平等台主机里,每个用户都足以成立和谐的
    LocalDB 实例,所有使用者尽管都有同名的 v11.0
    的实例,但相互都是独立分开的进程(Process)。这多少个实例会自动为使用者建立及保管,并且可供其他应用程序使用。
  • 用户电脑上设置的每一个 LocalDB 版本各设有一个 LocalDB
    自动实例。将来假如还有下一版 SQL Server 2012 Express LocalDB
    出现,就会再有新的实例名称可用,默认自动实例名称是一个 v
    字符后边跟着 xx.x 格式的 LocalDB 发行版号码。 例如,v11.0 代表 SQL
    Server 2012。
  • LocalDB 签字实例 ( Named Instances )
  • LocalDB 具名实例是私用的。
  • 这些实例是由该承担建立及管制该实例的使用者或特定单一应用程序所拥有。
  • 不同使用者默认不可能存取自定义的 LocalDB
    具名实例,除非你手动建立具名实例的分享效率,开启享受功效后就可以让此外使用者存取该具名实例的数据库。

INotifyPropertyChanged

了解 SQL Server 2012 Express LocalDB
实例的数据库文件所在路径

它的效能:向客户端发出某一属性值已更改的通报。

在设置好 SQL Server 2012 Express LocalDB 之后,默认会有个实例名为
v11.0,该实例的连带文件所在目录通常位于以下目录 ( 请将 <user>
替换成你的登陆账号 )

当属性改变时,它可以通报客户端,并举行界面数据更新.而大家决不写过多错综复杂的代码来更新界面数据,这样可以形成方法简单而清丽,松耦合和让艺术变得更通用.可用的地方太多了:例如上传进度,实时后台数据变动等地点.最近本身意识winform和silverlight都扶助,确实是一个强硬的接口.

C:\Users\<user>\AppData\Local\Microsoft\Microsoft SQL Server
Local DB\Instances

在构造函数中先绑定

或用 %LOCALAPPDATA% 环境变量进入该目录比较方便:

public Class_Name()   

%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances

{   

以下是显示该目录的图标,这里会列出富有 LocalDB 的实例:

    User user = new User();    

澳门美高梅手机网站 1

    user.Name = “your name”;    

在此目录 ( v11.0 )
下所观望的文件都是实例的相干文书,系统数据库文件、错误纪录、纪录追踪、加密密钥、…等等,可是若您在
LocalDB
实例中确立用户数据库时,必须要彰着指定其数据文件与记录文件的路线,否则默认所有建立的数据库都会放在
%USERPROFILE% 目录下 ( C:\Users\<username> )

    user.Address = “your address”;    

建立 SQL Server 2012 Express LocalDB 签约实例

  

你可以设想一下,一个 SQL 数据库实例就犹如一台完整的 SQL Server
数据库服务器,在一个实例之中会有友好的序列数据库 (master, msdb, model,
temp),就跟大家一般在应用 SQL Server 没有什么两样,当你建立额外的
LocalDB
实例的话,那些连串数据库就会跟另一个签名实例完全独立开来,互相完全互不影响。

    textBox1.Text = user.Name;   

就支出的角度来说,你居然足以在付出测试的环境里建立一套跟客户端正式主机完全相同的数据库环境,光是那点就与往常的
SQL Server Express 区别巨大,也是新版 LocalDB 真正决定的地点!

    textBox2.Text = user.Address;   

在创造新的 LocalDB 实例在此之前,必须先通晓
SqlLocalDB.exe
工具程序的路线,请参考以下途径:

}  

C:\Program Files\Microsoft SQL
Server\110\Tools\Binn\SqlLocalDB.exe

编辑一个粗略的业务类

澳门美高梅手机网站 2

 

以下是确立 LocalDB 实例的一声令下,其中 “LocalDbTest
是您可以自动命名的实例名称:

public class User : INotifyPropertyChanged   

SqlLocalDB.exe create LocalDbTest

{   

澳门美高梅手机网站 3

    public event PropertyChangedEventHandler PropertyChanged;
   

接着我们由此命令列出所有 LocalDB
已经创造的享有实例,并查看特定实例的相关信息:

  

SqlLocalDB.exe info
SqlLocalDB.exe info Projects

    private string _name;
   

澳门美高梅手机网站 4

    public string Name
   

随着我们在探望作品在此之前介绍过的实业文件路径,你将会发现多了一个索引,我们用
%LOCALAPPDATA% 环境变量进入该目录看看:

    {   

%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances

        get { return _name; }   

澳门美高梅手机网站 5

        set    

进入该目录就会看出如同 SQL Server
完整版一样有这一个系列数据库文件、错误纪录、纪录追踪、加密密钥、…等等,如下图示:

        {   

澳门美高梅手机网站 6

            _name = value;   

SQL Server 2012 Express LocalDB 与其他 SQL Server
本子的可比

           if(PropertyChanged != null)   

在 SQL Server 2012 问世以前,SQL Server
遵照不同的运转环境各有推出不同的本子,在运作上也有例外的限量,例如:

            {   

  • SQL Server Enterprise ( 公司版,适合大量数据或高可用性环境 )
  • SQL Server Standard ( 标准版,适合用在一般数据库处理环境 )
  • SQL Server
    Express
    (
    轻量版,适合用在单机或小量数据库的环境 )
  • SQL Server
    Compact
    (
    精简版,又称 SQL CE,适用于行动化或嵌入式系统环境 )

                PropertyChanged(this, new PropertyChangedEventArgs(“Name”));   

而 SQL Server 2012 Express LocalDB
又是甚么样的一个稳住呢?从数据库系统复杂度加以重新排序过如下:

            }   

  • SQL Server Enterprise > Standard > Express >
    LocalDB > Compact

        }   

鉴于 SQL Server 2012 Express LocalDB 跟前版的 SQL Server 2008 R2 Express
很像,其中的限定有:

    }   

  • LocalDB 的实例排序规则默认为
    SQL_Latin1_General_CP1_CI_AS,不可以改观。

  

但支持数据库层级数量行层级表明式层级定序。

    private string _address;   

也就是说,你只要在建立数据库时点名其排序规则即可,或是挂载其他数据库系统移过来的数据库文件,或还原自其他数据库的备份文件也都不会有题目。

    public string Address
  

独立数据库遵从自主数据库定序所定义的元数据和 tempdb 定序规则。

    {   

  • LocalDB 不得为合并式复写订阅者。
  • LocalDB 不支援 FILESTREAM。
  • LocalDB 针对 瑟维斯(Service)(Service) Broker 只允许本机队列。

        get { return _address; }   

连锁链接

        set    

        {   

            _address = value;   

            if (PropertyChanged != null)   

            {   

                PropertyChanged(this, new PropertyChangedEventArgs(“Address”));   

            }   

        }   

    }   

}  

 

 

ObservableCollection

绑定到聚集

多少绑定的数据源对象足以是一个带有数据的十足对象,也足以是一个对象的聚集。此前,平素在研究哪边将对象对象与一个纯粹对象绑定。Silverlight中的数据绑定仍能将对象对象与聚集对象相绑定,这也是很常用的。比如展现随笔的问题列表、彰显一多级图片等。

如若要绑定到一个凑合类型的数据源对象,绑定目的可以使用ItemsControl,如ListBox或DataGrid等。其余,通过定制ItemsControl的多寡模板(DataTemplate),仍可以操纵集合对象中每一项的展示。

 使用ObservableCollection

数据源集合对象必须连续IEnumerable接口,为了让对象属性与数据源集合的翻新(不但包括元素的修改,还包括元素的加码和删除)保持同步,数据源集合还非得贯彻INotifyPropertyChanged接口和INotifyCollectionChanged接口。

在Silverlight中开创数据源集合可以应用内建的ObservableCollection类,因为ObservableCollection类既实现了INotifyPropertyChanged接口,又实现了INotifyCollectionChanged接口。使用ObservableCollection类不但可以兑现Add、Remove、Clear和Insert操作,还足以触发PropertyChanged事件。

 

关于 谈谈INotifyPropertyChanged
的实现

参见http://www.cnblogs.com/beginor/archive/2012/08/13/2636418.html

INotifyPropertyChanged 接口是 WPF/Silverlight 开发中非常重大的接口,
它整合了 ViewModel 的功底, 数据绑定基本上都亟需那些接口。 所以,
对它的贯彻也出示煞是关键, 下边接贴出自我了然的三种实现格局,
希望能起到抛砖引玉的功效。

相似的实现格局

这是一种再常见不过的落实形式, 代码如下:

1
2
3
4
5
6
7
8
9
10
public class NotifyPropertyChanged : INotifyPropertyChanged {
    
   public event PropertyChangedEventHandler PropertyChanged;
 
   virtual internal protected void OnPropertyChanged(string propertyName) {
      if (this.PropertyChanged != null) {
         this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
   }
}

这种模式叫做一般的落实形式, 因为它实在是太普通但是了,
而且使用起来也令人备感厌烦, 因为必须指定手工指定属性名称:

1
2
3
4
5
6
7
8
9
10
11
12
public class MyViewModel : NotifyPropertyChanged {
 
   private int _myField;
 
   public int MyProperty {
      get { return _myField; }
      set {
         _myField = value;
         OnPropertyChanged("MyProperty");
      }
   }
}

lambda 表明式实现情势

对 lambda 表明式相比较熟习的同室可以设想用 lambda 表明式实现属性名称传递,
在 NotifyPropertyChanged 类添加一个如此的主意:

1
2
3
4
5
6
7
8
9
10
11
12
13
protected void SetProperty<T>(ref T propField, T value, Expression<Func<T>> expr) {
   var bodyExpr = expr.Body as System.Linq.Expressions.MemberExpression;
   if (bodyExpr == null) {
      throw new ArgumentException("Expression must be a MemberExpression!", "expr");
   }
   var propInfo = bodyExpr.Member as PropertyInfo;
   if (propInfo == null) {
      throw new ArgumentException("Expression must be a PropertyExpression!", "expr");
   }
   var propName = propInfo.Name;
   propField = value;
   this.OnPropertyChanged(propName);
}

有了这多少个法子, NotifyPropertyChanged 基类使用起来就令人清爽了成千上万:

1
2
3
4
5
6
7
8
9
10
11
public class MyViewModel : NotifyPropertyChanged {
 
   private int _myField;
 
   public int MyProperty {
      get { return _myField; }
      set {
         base.SetProperty(ref _myField, value, () => this.MyProperty);
          }
   }
}

这样一来, 把性能名称用字符串传递改成了用 lambda 表明式传递,
缩短了硬编码, 确实方便了许多, 可是仍然感觉略微麻烦了一部分,
还是要写一个 lambda 表明式来传递属性名称。

阻止模式贯彻

一旦对 Castal.DynamicProxy 有映像的话, 可以设想使用 DynamicProxy
举办阻挠实现, 我的贯彻如下:

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
// 1. 先定义一个拦截器, 重写 PostProcess 方法, 当发现是调用以 set_ 开头的方法时,
//    一般就是设置属性了, 可以在这里触发相应的事件。
internal class NotifyPropertyChangedInterceptor : StandardInterceptor {
 
   protected override void PostProceed(IInvocation invocation) {
      base.PostProceed(invocation);
      var methodName = invocation.Method.Name;
      if (methodName.StartsWith("set_")) {
         var propertyName = methodName.Substring(4);
         var target = invocation.Proxy as NotifyPropertyChanged;
         if (target != null) {
            target.OnPropertyChanged(propertyName);
         }
      }
   }
}
 
// 2. 再定义一个帮助类, 提供一个工厂方法创建代理类。
public static class ViewModelHelper {
 
   private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator();
   private static readonly NotifyPropertyChangedInterceptor Interceptor
         = new NotifyPropertyChangedInterceptor();
 
   public static T CreateProxy<T>(T obj) where T : class, INotifyPropertyChanged {
      return ProxyGenerator.CreateClassProxyWithTarget(obj, Interceptor);
   }
}

运用起来也是很有益的, 只是创制 ViewModel 对象时必须用匡助类来创立实例,
代码如下:

1
2
3
4
5
6
7
8
9
10
public class MyViewModel : NotifyPropertyChanged {
 
   // 定义属性时不需要任何基类方法, 和普通属性没有什么两样。
   public int MyProperty {
      get; set;
   }
}
// 使用时需要这样创建实例:
var viewModel = ViewModelHelper.CreateProxy<MyViewModel>();
viewModel.MyProperty = 100;

只是这种实现的瑕疵就是具有的性质都会触发 PropertyChanged 事件,
而且只好触发一个事件, 而在实际上付出中, 偶尔需要设置一个属性, 触发两个PropertyChanged 事件。

前途 .Net 4.5 的兑现模式

在将要宣布的 .Net 4.5 中,
提供了 CallerMemberNameAttribute.aspx) 标记,
利用那个特性, 可以将下面提供的 SetProperty 方法举办改建,
这样的兑现才是最完美的:

1
2
3
4
5
6
protected void SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) {
   if (object.Equals(storage, value)) return;
 
   storage = value;
   this.OnPropertyChanged(propertyName);
}

由于有了 CallerMemberName 标记助阵, 可以说选择起来是非凡有利了:

1
2
3
4
5
6
7
8
9
10
11
public class MyViewModel : NotifyPropertyChanged {
 
   private int _myField;
 
   public int MyProperty {
      get { return _myField; }
      set {
         base.SetProperty(ref _myField, value);
      }
   }
}

这种措施虽然好,不过却只有在 .Net 4.5 中才有, 而且也许永远不会添加到
Silverlight 中。

 

其次步:用户界面绑定数据对象,指定绑定情势

.xaml

<Grid x:Name="LayoutRoot" Background="Wheat" Loaded="LayoutRoot_Loaded">
        <StackPanel>
            <TextBox  Grid.Row="0"  Grid.Column="0" Width="150" Height="30"  HorizontalAlignment="Left" Text="{Binding Name,Mode=OneTime}"/>
            <TextBox  Grid.Row="1"  Grid.Column="0" Width="150" Height="30" HorizontalAlignment="Left" Text="{Binding Age,Mode=OneTime}"/>
            <TextBox  Grid.Row="2"  Grid.Column="0" Width="150" Height="30" HorizontalAlignment="Left" Text="{Binding Address,Mode=OneTime}"/>
            <Button x:Name="btnUpdata" Width="150" Height="30" Content="更新" Click="btnUpdata_Click"/>
        </StackPanel>
    </Grid>

其三步:数据绑定

.xaml.cs

 Person person;
        void LayoutRoot_Loaded(object sender,RoutedEventArgs e)
        {
            person = new Person()
            {
              Name="Terry",
              Age=20,
              Address="Beijing"
            };
            this.LayoutRoot.DataContext = person;
        }

        private void btnUpdata_Click(object sender, RoutedEventArgs e)
        {
            person.Name = "小哥";
            person.Age = 23;
            person.Address = "上海";

        }

 

出于是One提姆(Tim)e数据绑定形式,可以见见在单机更新按钮时,尽管改变了多少对象的属性值,可是用户界面的数据值依旧是在绑定成立时候的数据值。

发表评论

电子邮件地址不会被公开。 必填项已用*标注