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 => 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),@p3nvarchar(15),@p4 nvarchar(10),@p5 nvarchar(2),@p6 nvarchar(5),@p7 nvarchar(15)'',@p0=4,@p1=N''Kelly'',@p2=N''Smith'',@p3=N''123Fake 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''@p0varchar(7),@p1 varchar(6),@p2 varchar(15),@p3 varchar(9),@p4 varchar(2),@p5varchar(5),@p6 varchar(18)'',@p0=''John'',@p1=''Smith'',@p2=''123 FakeStreet'',@p3=''Somewhere'',@p4=''CT'',@p5=''03102'',@p6=''nobody@nowhere.com''
插入后,得到了最新插入的key值。 演示程序
demo程序是C#写的,编译与VS2008,当然,本文并不是结束,它只是一个简单的入门,期待后续的吧……
1 |