SilverLight中使用数据服务对数据库CRUD
1. 建立一个数据模型
注意:模型对应的表一定要有主键,否则,建立时将不会成功。
2.建立一个数据服务
public class WebDataService1 : DataService<myDBEntities>
{
// 仅调用此方法一次以初始化涉及服务范围的策略。
public static void InitializeService(IDataServiceConfiguration config)
{
// TODO: 设置规则以指明哪些实体集和服务操作是可见的、可更新的,等等。
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}
[WebGet]
public IQueryable<tabA> getTabA(string a)
{
var v = CurrentDataSource.tabA.Where(p => p.a == a);
return v;
}
[WebInvoke]
public IQueryable<tabX> getTabX(string x)
{
var v = CurrentDataSource.tabX.Where(p => p.x == x);
return v;
}
[QueryInterceptor("tabX")]
public System.Linq.Expressions.Expression<Func<tabX, bool>> query_tabX()
{
return p => p.z != "wwxxdd"; //为真表示允许查询
}
[ChangeInterceptor("tabX")]
public void change_tabX(tabX en, UpdateOperations operation)
{
//-
if (operation == UpdateOperations.Add)
{
if (string.IsNullOrEmpty(en.y))
{
//如果[y]为空的处理代码
}
}
//-
if (operation == UpdateOperations.Change)
{
}
//-
if (operation == UpdateOperations.Delete)
{
}
}
}
3.设置xaml页面
<StackPanel x:Name="spTool" >
<data:DataGrid x:Name="dg"></data:DataGrid>
<Button x:Name="btnRetrivebyWeb" Content="WebClient方式加载数据" Width="200" />
<Button x:Name="btnRetriveByService" Content="DataServiceContext方式加载数据" Width="200" />
<Button x:Name="btnCreate" Content="添加" Width="200" />
<Button x:Name="btnUpdate" Content="修改" Width="200" />
<Button x:Name="btnDelete" Content="删除" Width="200" />
</StackPanel>
4.在xaml页面对应的cs文件中添加代码
public MainPage()
{
InitializeComponent();
this.spTool.Loaded += new RoutedEventHandler(spTool_Loaded);
this.btnRetrivebyWeb.Click += new RoutedEventHandler(btnRetrivebyWeb_Click);
this.btnRetriveByService.Click += new RoutedEventHandler(btnRetriveByService_Click);
this.btnCreate.Click += new RoutedEventHandler(btnCreate_Click);
this.btnUpdate.Click += new RoutedEventHandler(btnUpdate_Click);
this.btnDelete.Click += new RoutedEventHandler(btnDelete_Click);
}
#region WebClient方式加载数据
private void btnRetrivebyWeb_Click(object sender, RoutedEventArgs e)
{
Uri uri = new Uri("http://localhost:8081/WebDataService1.svc/tabA");
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_completed);
client.OpenReadAsync(uri);
}
void client_completed(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
XmlReader reader = XmlReader.Create(e.Result);
XDocument ls = XDocument.Load(reader);
XNamespace xmlns = "http://www.w3.org/2005/Atom";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
var list = from x in ls.Descendants(xmlns + "entry")
select new myService.tabA
{
a = x.Descendants(d + "a").First().Value,
b = x.Descendants(d + "b").First().Value,
c = x.Descendants(d + "c").First().Value
};
dg.ItemsSource = list;
}
}
#endregion
//--------------------------------------------------------------------------------------
myService.myDBEntities server;
private void spTool_Loaded(object sender, RoutedEventArgs e)
{
Uri url = new Uri("http://localhost:8081/WebDataService1.svc");
server = new myService.myDBEntities(url);
}
#region DataServiceContext方式加载数据
private void btnRetriveByService_Click(object sender, RoutedEventArgs e)
{
Uri urlE = new Uri("http://localhost:8081/WebDataService1.svc/tabX");
server.BeginExecute<myService.tabX>(urlE, new AsyncCallback(load_completed), null);
}
void load_completed(IAsyncResult obj)
{
var tp = server.EndExecute<myService.tabX>(obj);
this.dg.ItemsSource = tp.ToList();
}
#endregion
void saveChanges_completed(IAsyncResult obj)
{
if (obj.IsCompleted)
{
//新增后,立即调用btnRetriveByService_Click时,会出错。
btnRetriveByService_Click(null, new RoutedEventArgs());
}
}
#region 添加数据并保存
private void btnCreate_Click(object sender, RoutedEventArgs e)
{
server.AddTotabX(new myService.tabX() { x = "007", z = "sss", y = "sss" });
server.BeginSaveChanges(new AsyncCallback(saveChanges_completed), null);
}
#endregion
#region 修改数据并保存
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
Uri urlE = new Uri("http://localhost:8081/WebDataService1.svc/tabX");
server.BeginExecute<myService.tabX>(urlE, new AsyncCallback(begin_edit), null);
}
void begin_edit(IAsyncResult obj)
{
var tp = server.EndExecute<myService.tabX>(obj).Where(p => p.x == "007").First();
tp.y = "hello";
server.UpdateObject(tp);
server.BeginSaveChanges(new AsyncCallback(saveChanges_completed), null);
}
#endregion
#region 删除数据并保存
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
Uri urlE = new Uri("http://localhost:8081/WebDataService1.svc/tabX");
server.BeginExecute<myService.tabX>(urlE, new AsyncCallback(begin_del), null);
}
void begin_del(IAsyncResult obj)
{
var tp = server.EndExecute<myService.tabX>(obj).Where(p => p.x == "007").First();
server.DeleteObject(tp);
server.BeginSaveChanges(new AsyncCallback(saveChanges_completed), null);
}
#endregion