创建一个简单的Linq数据库应用程序

简介
Linq是一个新的数据库访问技术,然我们对数据库的操作变得如此简单,不过究竟性能、安全等因素是否达到我们需求?本文,带你入门的同时,分析它的这些本质的东西。

数据库
在这个简单的应用程序中,我使用了SQL Server 2005作为其数据源,当然你也可以使用XML文件。

让我们从创建AddressBook数据库开始吧


我在这个数据库里创建了一个叫Addresses的数据表。


这张表是非常常用的,唯一特殊的是你必须把id字段设为自动增长型的主键,否则它就会是只读的了。

应用程序

创建Linq类
首先,我们简单地使用VS2008创建一个简单的"LINQ to SQL Class",我把它命名为_AddressBook.dbml

当设计界面出来后,把Addresses表拖到设计面板中,然后把它重新命名为Addresses(点击顶部重命名).


到属性框,编辑_AddressBookDataContext的属性,此前,确定已经设定了正确的命名空间和web.config中定义的数据库连接字符串。


下一步编辑Address数据类,默认的属性也是可以的


封装类
创建一个叫AddressBook的类,它事实上是一个_AddressBook的封装类。这个类非常的简单,所有做的事情就是初始化对象,提供一个简单的接口。唯一确保的事情:与_AddressBook相关的命名控件,和配置文件中的数据库连接字符串。

 

using  System.Configuration;
///
///  Summary description for AddressBook
///
namespace  Clarity.Database
{
public   class  AddressBook
{
private  _AddressBookDataContext _AddressBook;
public  AddressBook()
{
string  conn  =  ConfigurationManager.ConnectionStrings[
" AddressBookConnectionString " ].ToString();
_AddressBook 
=   new  _AddressBookDataContext(conn);
}
public  System.Data.Linq.Table Addresses
{
get  {  return  _AddressBook.Addresses; }
}
}
}
应用程序

这里,我不打算谈如何编译这个应用程序,它不是我要在这篇文章中所说的。下面,我会介绍烦琐的初始化和访问数据库的步骤。

private  AddressBook thisAddressBook  =   new  AddressBook();

 

你会通过thisAddressBook对象完全控制你的数据库。通过这个对象,你可以查询、插入、更新和删除数据库中的记录。

加载数据到表格中


private   void  LoadGrid()
{
GridView1.DataSource 
=  thisAddressBook.Addresses.OrderBy(c  =>  c.LastName);
GridView1.DataBind();
}

 

输出的数据会通过LastName排序。后面的表达式(c => c.LastName),c代表你的对象,就是可以简单地这样使用你的obj(obj => obj.LastName)

过滤表格中的数据

 

private   void  LoadGrid( string  filter)
{
GridView1.DataSource 
=  thisAddressBook.Addresses.Where(
=>  c.LastName.StartsWith(filter)).OrderBy(c  =>  c.LastName);
GridView1.DataBind();
}

 

  注意,过滤是必须附带filter变量。

删除一个记录


protected   void  GridView1_RowDeleting( object  sender,
System.Web.UI.WebControls.GridViewDeleteEventArgs e)
{
int  id  =  Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
Addresses thisAddress 
=  thisAddressBook.Addresses.First(x  =>  x.id  ==  id);
thisAddressBook.Addresses.Remove(thisAddress);
thisAddressBook.Addresses.Context.SubmitChanges();
LoadGrid();
}


插入和删除一个记录


protected   void  AddressUpdated( object  sender, UserData.UpdateEvent e)
{
Addresses thisAddress;
int  id  =  e.Address.id;
//  If this value is 0 then add a record
         if  (id  !=   0 )
thisAddress 
=  thisAddressBook.Addresses.First(x  =>  x.id  ==  id);
else
thisAddress 
=   new  Addresses();
thisAddress.FirstName 
=  e.Address.FirstName;
thisAddress.LastName 
=  e.Address.LastName;
thisAddress.Address1 
=  e.Address.Address1;
thisAddress.City 
=  e.Address.City;
thisAddress.State 
=  e.Address.State;
thisAddress.Zip 
=  e.Address.Zip;
thisAddress.Email 
=  e.Address.Email;
//  If this value is 0 then add a record
         if  (id  ==   0 )
thisAddressBook.Addresses.Add(thisAddress);
thisAddressBook.Addresses.Context.SubmitChanges();
LoadGrid();
}

SQL查询
在做的过程中,我非常关心其实际在数据库中查询的语句。它究竟会不会把所有的数据都载入,然后再过滤?等等……
不过,我对它的结果是非常满意的。

LOAD语句的结果

SELECT   [ t0 ] . [ id ] [ t0 ] . [ FirstName ] ,
[ t0 ] . [ LastName ] [ t0 ] . [ Address1 ] [ t0 ] . [ City ] [ t0 ] . [ State ] [ t0 ] . [ Zip ] ,
[ t0 ] . [ Email ]   FROM   [ dbo ] . [ Addresses ]   AS   [ t0 ]   ORDER   BY   [ t0 ] . [ LastName ]

不错,和原始的没什么出入。

过滤语句

 
 
exec  sp_executesql N ' SELECT
[t0].[id], [t0].[FirstName], [t0].[LastName], [t0].[Address1], [t0].[City],
[t0].[State], [t0].[Zip], [t0].[Email] FROM [dbo].[Addresses] AS [t0] WHERE
[t0].[LastName] LIKE @p0 ORDER BY [t0].[LastName]
' ,N ' @p0 nvarchar(2) ' , @p0 = N ' H% '


居然,使用了一个存储过程来防止SQL注入,还挺周到:)

删除语句

 
 
exec  sp_executesql N ' DELETE FROM
[dbo].[Addresses] WHERE ([id] = @p0) AND ([FirstName] = @p1) AND ([LastName] =
@p2) AND ([Address1] = @p3) AND  ([City] = @p4) AND ([State] = @p5) AND ([Zip]
= @p6) AND ([Email] = @p7)
' ,N ' @p0 int,@p1 nvarchar(5),@p2 nvarchar(5),@p3
nvarchar(15),@p4  nvarchar(10),@p5 nvarchar(2),@p6 nvarchar(5),
@p7 nvarchar(15)
' , @p0 = 4 , @p1 = N ' Kelly ' , @p2 = N ' Smith ' , @p3 = N ' 123
Fake  Street
' , @p4 = N ' Manchester ' , @p5 = N ' NH ' , @p6 = N ' 03102 ' , @p7 = N ' kelly@gmail.com '


和上面的一样

插入语句

 
 
exec  sp_executesql N ' INSERT INTO
[dbo].[Addresses]([FirstName], [LastName], [Address1], [City], [State], [Zip],
[Email]) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)
SELECT [t0].[id] FROM
[dbo].[Addresses] AS [t0] WHERE [t0].[id] = (SCOPE_IDENTITY()) 
' ,N ' @p0
varchar(7),@p1 varchar(6),@p2 varchar(15),@p3 varchar(9),@p4 varchar(2),@p5
varchar(5),@p6  varchar(18)
' , @p0 = ' John ' , @p1 = ' Smith ' , @p2 = ' 123 Fake
Street
' , @p3 = ' Somewhere ' , @p4 = ' CT ' , @p5 = ' 03102 ' , @p6 = ' nobody@nowhere.com '

插入后,得到了最新插入的key值。

转载于:https://www.cnblogs.com/jueban/archive/2007/11/02/946886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值