风舞残阳 2008-4-2 13:43
在ASP.NET中利用VWD操作数据库简介
VWD2005中包含了[wiki]SQL[/wiki]Server2005ExpressEdition,它是SQLServer2005的一个免费版本,它的目标用户是那些希望用简单的[wiki]数据库[/wiki]解决方案来建立应用[wiki]程序[/wiki]的非专业的或狂热的开发者。由于SQLServerExpress支持完整的SQLServer[wiki]编程[/wiki]模型,例如SQLCLR、T-SQL、存储过程、视图、触发器和[wiki]XML[/wiki]数据[wiki]类[/wiki]型,你可以使用SQLServerExpress来了解这些[wiki]技术[/wiki],并且确保自己的应用程序可以运行在更高层次的平台上(例如SQLServer企业版)。SQLServerExpress很容易下载和安装(它小于36MB),VisualStudio2005和VisualWebDeveloper2005也包括了它。VisualStudio包含了用于数据库[wiki]管理[/wiki]的工具,例如数据库[wiki]浏览器[/wiki](DatabaseExplorer)和查询构造器(QueryBuilder),你可以使用它们来管理SQLServerExpress数据库。VisualStudio还支持一种新的基于文件的数据库,用于建立SQLServerExpress数据库并把它作为项目的一部分。同时,VisualStudio2005和SQLServer2005Express为建立和部署数据驱动的Web应用程序提供了完整的解决方案,包括下面一些特性:◆数据库项目数据项◆本地数据库连接◆数据库浏览器管理◆相对路径连接字符串◆XCopy部署支持◆集成的调试支持本文描述VisualStudio2005中的基于文件的数据库方式和设计器如何建立和使用这些数据库。[b]VisualWebDeveloper和数据[/b]VisualWebDeveloper为Web应用程序使用数据库提供了大量的工具。你可以使用数据库浏览器轻易地连接到数据库并建立或查看数据库关系图或大纲(schema)。你还可以使用查询构造器对话框和查询结果表格来查询数据库和进行数据填充。建立新数据库(使用本地文件)也是作为项目数据项提供的。一旦在VisualWebDeveloper中连接了数据库,就可以把数据库表直接拖放到页面上,以建立数据绑定的GridView控件。VisualWebDeveloper自动地建立一个关联的数据源控件,并根据数据表来配置它的选择、更新、插入和删除操作。这种快捷操作为你节省了手动建立数据源所需的大量工作,你也可以轻易地根据需要,用适合的数据绑定控件代替GridView。[b]本地和服务器数据库[/b]你可能已经熟悉了基于服务器的数据库和连接字符串。在这种情况下,数据库服务器(例如SQLServer2005)把数据库名称与服务器所维护的数据库文件相关联。你可以通过指定服务器名称、数据库名称和凭证来连接到基于服务器的数据库,例如:"server=(local)\SQLExpress;database=Pubs;IntegratedSecurity=true"但是,VisualStudio2005还支持本地数据库的概念,它是添加到当前Web应用程序的App_Data目录中的一个文件。在App_Data目录中存储数据文件是[wiki]安全[/wiki]的,因为这个目录中的内容永远不会响应用户的请求。这个目录也是存储XML文件和其它数据存储的推荐位置。本地的SQLServerExpress数据库带有.MDF扩展名(例如"MyDatabase.MDF"),它是SQLServer支持的[wiki]标准[/wiki]文件格式。当连接到服务器的时候,数据库还有一个关联的日志文件(例如"MyDatabase_log.LDF")。数据库文件和日志文件的位置必须在一起。我们可以通过使用相对路径连接字符串把本地文件数据库自动地附加到SQLServerExpress。相对路径确保了应用程序迁移到任何其它地方的时候都不会中断数据库连接。Web应用程序中的相对路径连接字符串如下所示:"server=(local)\SQLExpress;AttachDbFileName=│DataDirectory│MyDatabase.mdf;IntegratedSecurity=true;UserInstance=true"上面的连接字符串还有两个额外的属性。AttachDbFileName属性指定连接打开的时候动态附加到服务器上的数据库文件的位置。尽管这个属性可以接受数据库的完整路径(例如使用│DataDirectory│语法),但是在运行时这个路径会被应用程序的App_Data目录所代替。这也保证了应用程序迁移到其它位置的时候连接不会中断。第二个属性是UserInstance=true,它指定SQLServerExpress附加数据库的方式。在这种情况下,SQLServerExpress为了把数据库附加到新的实例,建立一个新的进程,在打开连接的用户身份下运行。在ASP.NET应用程序中,这个用户是本地的ASPNET帐号或默认的NetworkService,这依赖于操作[wiki]系统[/wiki]。为了安全地附加非系统管理员帐号(例如ASP.NET帐号)提供的数据库文件,建立一个独立的SQLServer用户实例是必要的。请注意:由于在默认情况下,所有的ASP.NET应用程序运行在同一个进程下,因此所有的应用程序会把本地数据库附加到同一个SQLServerExpress实例。这意味着不管应用程序最初附加的数据库是哪一个,所有的应用程序对附加到这个实例的所有数据库都拥有相同的访问权限。为了隔离不同的应用程序,你必须让每个应用程序运行在不同的工作进程或应用程序池(在IIS6中)中。由于这个原因,本地SQLServer数据库主要是为了方便开发,而不是用于代替[wiki]共享[/wiki]主机[wiki]环境[/wiki]下的基于服务器的数据库。另外一个要点是,不允许两个用户同时连接到一个本地数据库。在VisualStudio中设计应用程序的时候,设计器自动地释放连接,以保证VisualStudio和ASP.NET能够共享数据库文件(例如在设计器中调试运行中的应用程序)。
[b]建立本地数据库[/b]你可以轻易地在VisualStudio的Web应用程序项目中建立本地数据库。由于VisualStudio安装了SQLServerExpress,你可以使用下面的步骤来建立一个本地数据库、添加数据表并填充数据。建立本地数据库:1.右键点击解决方案浏览器并选择"添加新项…"选项。2.选择"SQL数据库"项并指定一个文件名,例如"Database.mdf"。3.VisualStudio提示把这个文件添加到App_Data目录中。点击"是"。4.VisualStudio添加这个文件并自动地使用数据库浏览器连接到这个数据库。给本地数据库添加数据表:1.右键点击数据库浏览器中的Tables(数据表)节点并选择"添加新表"选项。2.输入数据库中列的名称和类型,可以选择在属性表格中设置其它一些列属性。为了建立示例Contacts数据库,请遵循下面的步骤。3.把第一列的名称设置为"ContactID",数据类型设置为"int"。取消"允许空"检查框的选中状态。4.右键点击ContactID列左边的灰色方块并选择"设置为主健"选项。5.在下方的"列属性"表格中,展开"标识符规范"节点并把"是否为标识符"设置为"是"。6.把第二列的名称设置为"ContactName",数据类型设置为"varchar(50)"。让"允许空"检查框保持选中状态。7.按下Ctrl-S保存表并把表名设置为"Contacts"。点击OK保存表。8.关闭表定义窗口。用数据填充表:1.右键点击数据库浏览器中的数据表节点(例如"Contacts")并选择"显示表数据"选项。2.在显示的表格中输入数据表行的数据。如果使用上面的Contacts示例,你可以在ContactName列中输入值,数据库会自动地生成相应的ContactID值。3.关闭表格窗口。绑定到本地数据库为了绑定到本地数据库,你需要使用相对路径连接来配置ASP.NET数据源控件,以连接到该文件。要把一个SQLServerExpress数据库简单地绑定到SqlDataSource和GridView控件,可以使用下面的步骤:1.双击解决方案浏览器中的一个页面(例如"Default.aspx")。VisualStudio会打开这个页面。2.选择页面窗口底部的"设计视图"标签切换到设计视图。3.双击解决方案浏览器中的数据库文件(例如"Database.mdf")。VisualStudio为连接打开数据库浏览器。4.展开Tables节点以显示数据库中的表。5.把数据库浏览器中的表拖放到设计视图中的那个打开的页面中。VisualStudio建立一个绑定到SqlDataSource控件的GridView。6.展开GridView控件的"智能事务面板",选中分页、排序和[wiki]编辑[/wiki]。7.按Ctrl-F5运行页面(没有调试)。下面的例子显示了一个连接到本地数据库的GridView和SqlDataSource控件。为了运行这个示例,ASP.NET进程帐号必须拥有"/App_Data目录中的MDF和LDF文件的读/写权限。这个权限设置过程如下:1.在Windows浏览器中选中"/App_Data/Database.MDF文件并选择"属性"。2.选择"安全"标签并点击"添加"。3.点击"位置…",选择你的[wiki]计算机[/wiki]名(在列表顶部),并点击"确定"。4.在[wiki]对象[/wiki]名称文本区,输入ASP.NET进程帐号的名称。在默认情况下,IIS6.0中的名称是"NetworkService",IIS5.x中的是"ASPNET"。5.在"允许"列中选中"读"和"写"并点击"确定"。6.如果App_Data目录中存在LDF文件,就需要重复上述步骤,设置LDF文件的属性。如果你使用VisualStudio在本地计算机上建立应用程序,那么在默认情况下,你是拥有App_Data目录的上述权限的。如果某个数据库文件在被附加之后需要变更权限,你必须在新权限生效之前首先关闭应用程序域(applicationdomain)。<asp:GridViewAllowSorting="True"AutoGenerateColumns="False"DataKeyNames="ContactID"DataSourceID="SqlDataSource1"ID="GridView1"runat="server"><Columns><asp:BoundFieldDataField="ContactID"HeaderText="ID"ReadOnly="True"SortExpression="ID"/><asp:BoundFieldDataField="ContactName"HeaderText="Name"SortExpression="Name"/></Columns></asp:GridView><asp:SqlDataSourceCID="SqlDataSource1"runat="server"SelectCommand="SELECT[ContactID],[ContactName]FROM[Contacts]"></asp:SqlDataSource>[b]部署本地数据库[/b]本地数据库文件的优势之一在于它可以伴随应用程序、作为应用程序的一部分迁移到其它位置或其它计算机(当然该计算机也必须运行SQLServerExpress)。在移动数据库的时候,该文件必须处于解除锁定(unlocked)状态。在设计器或应用程序连接到数据库的时候,文件会处于锁定状态。为了解除锁定,数据库的所有活动连接都必须被关闭。你可以使用下面的技术来关闭数据库的连接:如果ASP.NET已经打开了连接,你可以通过给Web应用程序根目录添加一个"app_offline.htm"文件来关闭应用程序域。它的作用就是关闭应用程序域(而不是进程)并把所有的应用程序请求重定向(redirect)到这个文件(返回404响应代码)。如果要重新启动应用程序,只需要删除这个文件。请注意,简单地在页面代码中的关闭连接是不会释放文件锁的,因为在默认情况下,ADO.NET连接池会保留活动的连接。VisualStudio提供了CopyWeb特性,它可以使用xcopy、[wiki]FTP[/wiki]或FrontPage服务器扩展把应用程序文件从工作目录复制到目标服务器。目标计算机可以是本地的或远程的。从VisualStudio菜单条中选择"Web站点>复制Web站点…"就可以调用CopyWeb特性了。尽管你可以使用CopyWeb或简单的xcopy或FTP操作来移动数据库,但是为了让应用程序继续工作,目标计算机必须运行SQLServerExpress(在同一个实例名下)。前面我们提到,由于ASP.NET运行的所有应用程序都连接到同一个SQL实例,所以目标计算机上的所有应用程序必须彼此信任。如果一个应用程序不能看到其它应用程序的数据库,那么我们推荐用基于服务器的方法(使用SQL认证或其它分离技术)代替本地数据库。如果你把SQLServerExpress作为开发工具,那么你需要把SQLServerExpress数据库内容作为产品部署的一部分复制给客户。