【原文地址】Update of SQL Server Database Publishing Toolkit for Web Hosting
【原文发表日期】 Thursday, April 19, 2007 8:24 AM
几个月前,我在博客里写过由SQL服务器团队开发的新SQL 服务器数据库发布主机工具包 (SQL Server Database Publishing Hosting Toolkit)。你可以在我以前的2个博客贴子里读到关于它提供的功能和如何使用它的教程:
SQL服务器主机工具包是个可下载的免费工具,通过它来创建一个能重建你数据库(包括数据定义,存储过程,以及实际的数据内容)的.SQL脚本文件可真是容易之极。安装该工具完毕之后,你可以在 Visual Studio 或 Visual Web Developer 中右击你的数据库,然后使用相关的向导经过几个步骤来生成脚本:
然后你可以将该脚本通过FTP上传到你的远程主机环境中来执行(我上面第二个贴子示范了一个即使你在远程主机上没有管理员访问权限也可使用的技术)。或者,你也可以使用数据库发布向导提供的内置web服务支持,来直接导出和拷贝你的数据库到你的远程主机提供商那里。
SQL 服务器数据库发布工具包 V1.1 更新版
这个月早些时候,SQL团队推出了工具包的V1.1 更新版。你可以在这里了解相关细节以及下载更新版本。
V1.1 更新版包括了下列改进:
- 添加了在向导里发布时选择单个对象/数据表的能力(而不用每次都生成/重新生成数据库里的一切)
- 提高了生成脚本和发布时的性能 30-40%
- 做了在Internet上发布到主机提供商时可用性方面的改进
- 它修复了CodePlex论坛上提交的几个缺陷
我绝对建议你去看一下,如果你现在使用远程主机运行你的应用的话,这个免费工具是可以添置到工具箱去的绝对有用之物。
谢谢,
Scott
【原文地址】New "Orcas" Language Feature: Extension Methods
【原文发表日期】 Tuesday, March 13, 2007 2:27 AM
上个星期,我发表了我准备写的讨论一些新的VB和C#语言特性的系列博客贴子的第一篇,这些新语言特性是将于今年晚些时候发布的Visual Studio和.NET框架Orcas版的一部分。
我的上一个博客贴子讨论了自动属性,对象初始化器和集合初始化器等新特性。如果你还没有读过这个帖子的话,请在这里阅读。今天的贴子讨论一个VB和C#中都具有的,重要得多的新特性:扩展方法 (Extension Methods)。
什么是扩展方法 (Extension Methods)?
扩展方法允许开发人员往一个现有的CLR类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对duck typing的支持之灵活性,与强类型语言之性能和编译时验证融合起来。
扩展方法促成了好多有用的使用场景,并使在作为Orcas一部分发布的.NET版本中引进的非常强大的LINQ查询框架成为可能。
简单的扩展方法例子:
有没有想过要检查一个字符串变量是否是个合法的电子邮件地址? 在今天,你大概需要通过调用一个单独的类(或许通过一个静态方法)来实现检查该字符串变量是否合法。譬如,象这样:
string email = Request.QueryString["email"];
if ( EmailValidator.IsValid(email) ) {
}
而使用C#和VB中的新“扩展方法”语言特性的话,我则可以添加一个有用的“IsValidEmailAddress()”方法到string类本身中去,该方法返回当前字符串实例是否是个合法的字符串。然后我可以把我的代码重写一下,使之更加干净,而且更具描述性,象这样:
string email = Request.QueryString["email"];
if ( email.IsValidEmailAddress() ) {
}
我们是怎么把这个新的IsValidEmailAddress()方法添加到现有的string类里去的呢?我们是通过定义一个静态的类型,带有我们的“IsValidEmailAddress”这个静态的方法来实现的,象下面这样:
public static class ScottGuExtensions
{
public static bool IsValidEmailAddress(this string s)
{
Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
return regex.IsMatch(s);
}
}
注意,上面的静态方法在第一个类型是string的参数变量前有个“this”关键词,这告诉编译器,这个特定的扩展方法应该添加到类型为“string”的对象中去。然后在IsValidEmailAddress()方法实现里,我可以访问调用该方法的实际string实例的所有公开属性/方法/事件,取决于它是否是合法电子邮件地址来返回true/false。
在我的代码里把这个特定的扩展方法的实现添加到string实例,我只要使用标准的“using”语句来引入含有该扩展方法的实现的命名空间:
using ScottGuExtensions;
然后编译器就会在任何string上正确地定位IsValidEmailAddress()方法。在公开发行的Orcas三月份的CTP中的C#和VB在Visual Studio代码编辑器里对扩展方法提供了完整的intellisense支持。所以,当我在一个字符串变量上点击“.”关键词时,我的扩展方法现在就会出现在intellisense的下拉框里:
VB和C#编译器也会很自然地给与你对所有扩展方法用法的编译时的检查,这意味着你会得到一个编译时错误,假如你键错或者错用一个扩展方法的话。
[感谢David Hayden,是他在去年的一个老帖子 里第一个示范了我在上面使用的这个IsValidEmailAddress使用场景。]
扩展方法使用场景续...
利用扩展方法这个新特性来给个别类型添加方法给开发人员开辟了许多有用的扩展性使用场景。但使得扩展方法非常强有力的是,它们不仅能够应用到个别类型上,也能应用到.NET框架中任何基类或接口上。这允许开发人员建立种种可用于整个.NET框架的丰富的可组合的框架层扩展。
譬如,考虑这样一个场景,我想要一个既容易,描述性又强的方式来检查一个对象是否已经包含在一个对象集合或数组里。我可以定义一个简单的.In(集合)扩展方法,我想把它添加到.NET框架中的所有对象上,我可以在C#里这么来实现这个“In()”扩展方法:
注意上面我是如何声明扩展方法的第一个参数的:“this object o”。这表明,这个扩展方法应该适用于继承于基类System.Object的所有类型,这意味著我可以在.NET中的每个对象上使用它。
上面这个“In”方法的实现允许我检查一个指定的对象是否包含在作为方法参数传入的一个IEnumerable序列中。因为所有的.NET集合和数组都实现了IEnumerable接口,现在我拥有了一个有用的,描述性强的方法来检查一个任意的对象是否属于任何.NET集合或数组。
然后我就可以使用这个“In()”方法来看一个特定的字符串是否在一个字符串数组中:
我也可以用它来检查一个特定的ASP.NET控件是否在一个容器控件集合里:
我甚至可以将其用在象整数这样的标量数据类型上:
注意上面,你甚至可以在象整数值42这样的基本数据类型值上使用扩展方法。因为CLR支持数值类型的自动boxing/unboxing,扩展方法可以直接使用在数值和其他标量数据类型上。
你大概可以开始从上面的例子中看出,扩展方法可以促成一些非常丰富和描述性强的扩展性使用场景。当使用于.NET中常见的基类和接口上时,他们可以促成一些非常好的特定于某个领域(domain specific)的框架和组合使用场景。
内置的System.Linq扩展方法
一个在Orcas时段随.NET发布的内置的扩展方法库是一套允许开发人员对任何数据进行查询的非常强有力的查询扩展方法。这些扩展方法实现位于新的 System.Linq 命名空间之下,定义了标准的查询操作符扩展方法,可以为.NET开发人员用来轻松地查询XML,关系数据库,.NET 对象, 和任何其他数据结构类型。
下面是使用这些查询扩展方法的扩展性模型的几个好处:
1) 它允许一个可用于所有数据类型(数据库,XML文件,内存中的对象,以及web-services等)的共同的查询编程模型和语法。
2) 它是可以组合的,允许开发人员轻松地往查询语法中添加新的方法/操作符。譬如,我们可以将我们自定义的“In()”方法与为LINQ所定义的标准的“Where()”方法作为一个单独查询的一部分一起使用。我们自定义的In()方法看上去就跟由System.Linq命名空间提供的标准方法一样。
3) 它是可扩展的,允许与任何数据提供器类型一起使用。譬如,任何一个象NHibernate或LLBLGen这样现有的ORM引擎可以实现LINQ的标准查询操作符来允许对他们现有的ORM实现和映射引擎实现LINQ查询。这允许开发人员学会一个查询数据的共同方式,然后对种类繁多的丰富数据存储实现使用同样的技能。
我将在下几个星期里对LINQ作更多的示范,但想留给你几个例子,这些例子展示了如何对不同类型的数据使用几个内置的LINQ查询扩展方法:
使用场景一:对内存中的.NET对象使用LINQ扩展方法
假定我们象这样定义了代表“Person”的类:
然后我可以使用新的对象初始化器和集合初始化器特性创建和填充一个“people”集合,象这样:
然后我可以使用由System.Linq提供的标准的“Where()”扩展方法来获取这个集合中FirstName的首字符是"S"的那些“Person”对象,象这样:
上面这个新的 p => 语法是“Lambda表达式”的一个例子,是对C# 2.0匿名方法支持的更简明的发展,允许我们通过一个实参来轻松地表达查询过滤(在这个情形下,我们表示我们只想要返回一串firstname属性的首字符是“S”字母的Person对象) 。上面这个查询然后就会返回包含2个对象的序列,Scott 和 Susanne。
我也可以利用由System.Linq提供的新的“Average” 和“Max”扩展方法编写代码来决定我的集合里的人的平均年龄,以及年龄最大的人,象这样:
使用场景二:对XML文件使用LINQ扩展方法
你手工在内存里创建一个硬写(hard-coded)的数据集合大概是很少见的。更有可能的是,你会从一个XM文件,数据库,或web服务里获取数据。
假定我们在硬盘上有一个XML文件,包含下面这样的数据:
很明显地,我可以使用现有的 System.Xml APIs 来装载这个XML文件进一个DOM,然后访问它,或者使用一个层次较低的XmlReader API ,自己对之手工分析。或者,在 Orcas中,我现在也可以使用支持标准的LINQ扩展方法的System.Xml.Linq 实现(即 XLINQ),更优雅地分析和处理XML。
下面的代码例子展示了如何使用LINQ来获取所有包含一个子节点的值的首字母为“S”的<person> XML元素:
注意,它使用了跟内存中对象例子中一模一样的 Where() 扩展方法。现在它返回一个“XElement”元素序列,XElemen是没有类型的XML节点元素。或者我也可以重写查询表达式,通过LINQ的 Select() 扩展方法来构造数据形状,提供一个使用了新的对象初始化器句法的Lambda 表达式来填充同样的“Person”类,跟我们第一个内存中的集合的例子一样:
上面的代码会做需要打开,分析,和过滤XML,然后返回一个强类型的Person对象序列所有的工作,不需要什么映射或持久的文件来映射数值,我只是在上面的LINQ查询式里直接指明了从XML到对象的构形而已。
我也可以和前面一样使用同样的Average() 和 Max() LINQ扩展方法来计算XML文件中<person>元素的平均年龄,以及最大年龄,象这样:
我不用手工分析XML文件,XLINQ 不仅可以为我处理分析,它在估算LINQ表达式时,也可以使用低层的XMLReader,而不是使用DOM来分析文件。这意味着它是迅速之极,而且不分配很多内存。
使用场景三:对数据库使用LINQ扩展方法
假定我们拥有一个SQL数据库,内含一个叫“People”的表,具有下列数据定义:
我可以使用Visual Studio中新的LINQ到SQL的所见即所得(WYSIWYG) ORM设计器,快速地创建一个映射到数据库的“Person”类:
然后我可以使用我先前用于对象和XML文件同样的LINQ Where() 扩展方法,从数据库中获取firstname的首字符为“S”的强类型“Person”对象序列:
注意,查询句法与对象和XML场景中的一模一样。
然后我也可以使用与前面一样的 LINQ Average() 和Max() 扩展方法来从数据库里获取平均和最大值,象这样:
要使上面代码例子工作,你自己不需编写任何SQL代码。Orcas中提供的LINQ到SQL对象关系映射器会处理获取,跟踪,和更新映射到你的数据库数据定义和存储过程的对象。你只要使用任何LINQ扩展方法对结果进行过滤和构形即可,LINQ到SQL会执行获取数据所需的SQL代码(注意,上面的 Average和Max 扩展方法很明显地不会从数据表中返回所有的数据行,它们会使用TSQL的聚合函数来计算数据库中的值,然后只返回一个标量值)。
请观看我一月份制作的一个录像,演示了LINQ到SQL如何显著地改进了Orcas中的数据生产力。录像中,你也可以看到新的LINQ到SQL的所见即所得ORM设计器的实战示范,以及对数据模型编写LINQ代码时代码编辑器提供的完整的 intellisense。
结语
希望上面的帖子给了你一个对扩展方法工作原理的基本理解,以及你能够利用它们来实现的一些酷扩展性方式。跟任何扩展性机制一样,我要告诫你别一开始就滥建新的扩展方法。不能因为你有一个闪亮的新榔头,就意味着世界上所有的东西突然都变成钉子了!
想着手开始尝试扩展方法的话,我建议你先探究一下Orcas中System.Linq命名空间中提供的标准查询操作符。这些操作符提供了对任何数组,集合,XML流,或关系数据库做丰富的查询的支持,可以极大地改进你操作数据时的生产力。我认为你会发现它们极大地减小了你要在你应用中编写的代码量,允许你编写非常干净和描述性强的语句。它们也允许你在你编码中得到查询逻辑自动的intellisense 和编译时检查。
在下几个星期里,我将继续这个关于Orcas中新语言特性的系列,探讨匿名类和类的推断(Type Inference),还会讨论Lambda的细节和其他酷特性。很明显地,我还会地更多地讨论LINQ。
希望本文对你有所帮助,
Scott
【原文地址】Free SQL Server Training Videos (and other good data tutorial pointers)
【原文发表日期】 Thursday, March 01, 2007 9:54 PM
今天在 www.asp.net 网站上,我们发布了一个注重于SQL Server 2005 Express 的新的精彩的《“我怎么做?”》录像系列,你可以下载和使用,是完全免费的。
系列中包括了13个专业录像,从最基本的开始,然后探讨数据表/数据定义(schema) 的设计,使用数据类型,创建存储过程,使用报表服务和商业智能引擎,对你的数据启用全文搜索等等。我猜,即使是大多数富有经验的开发人员也许也能从报表服务和全文搜索录像中学到一些新东西呢:
你可以在这里免费下载或在线观看这些SQL培训录像。
万一你错过了我写的关于把 SQL Express 或 SQL Server数据库上传到远程主机环境中的帖子的话,我强烈建议你回去读一下这2个贴子:
去年夏天早先时候,我曾贴出过一个很受欢迎的贴子,里面提供了你可以下载,在你应用中使用的100多个数据库数据定义的例子:
最后,也许是最重要的,一定要去看一下Scott Mitchell 这里的极棒的ASP.NET 数据教程系列 ,内含超过50个无比精彩的ASP.NET中常见的数据场景的教程(同时提供了VB 和C# 编码):
希望本文对你有所帮助,
Scott
【原文地址】 Tip/Trick: How to upload a .SQL file to a Hoster and Execute it to Deploy a SQL Database
【原文发表日期】 Thursday, January 11, 2007 12:20 AM
上个月 (英文),我讨论了新的(免费的)数据库发布向导,它是设计来充分简化在web主机环境中上传和部署 SQL Express 和 SQL Server数据库的。
在 第一个关于数据库发布的贴子 (英文)里 ,我示范了你如何可以使用数据库发布向导自动生成 .SQL 安装文件,该文件中将包含重建你的数据库数据定义(表,视图,存储过程,触发器,全文索引目录等等)以及以你原来数据库中同样的数据填充新数据库所需的脚本。这提供了一个极其容易的方法来构造在另外一个服务器上完全复制你的数据库的 .SQL 脚本:
在我以前的帖子里,我提到主机供应商经常提供在线SQL管理工具,你可以用它来打开/运行你新生成的 .SQL 文件,或者会提供SQL查询工具允许你拷贝/粘贴 .SQL 文件的内容到一个查询执行窗口来运行这些SQL语句。但不幸的是,并不是所有的主机供应商支持类似的工具。即使在那些支持类似工具的主机供应商那里,你也会遇上一些情形,譬如你生成的 .SQL 文件是如此之大,把它拷贝/粘贴进一个文本框是行不通的(提交一个 200M 字节内容的表单一般都会造成超时)。
这个帖子示范了把 .SQL 文件部署到远程主机环境中去的另外一个方法,这个方法不要求你的主机供应商在后端为你配置和安装任何东西。
不通过使用管理工具把SQL数据库部署到远程SQL服务器的步骤
下面是把一个本地数据库不通过使用任何管理工具就部署到远程主机上去的步骤:
第一步:生成一个包含数据定义和数据的 .SQL文件
远程部署数据库到主机环境的第一步是生成一个 .SQL 文件,内含你数据库的数据定义和数据。按我的 第一个关于数据库发布的博客帖子 (英文)里的步骤,来了解如何为 SQL Express 或 SQL Server数据库生成一个 .SQL 文件。
第二步: 把 .SQL 文件FTP到你的远程主机上去
生成 .SQL 文件之后,使用FTP或者其他文件传输机制将它上传到你的远程主机上去。最好是把这个文件拷贝到一个远程用户不易访问的受保护的场所。一个建议,给这个文件一个随机的名字,然后将它上传到 /app_data 文件夹,因为在默认情形下,该文件里的内容是受保护的。
用FTP来上传这个文件的好处是,它不会强迫你限制 .SQL 文件的大小。有必要的话,该文件的大小可达几百个M字节之多。
第三步: 下载 RunSQL.aspx 辅助页面
访问这个页面,下载其上连接的 RunSQL.aspx 文件。
RunSQL.aspx文件是个ASP.NET页面,是SQL Server产品组编写的,支持2个参数: 1) .SQL 文件的名字, 以及 2) 数据库的连接字符串。运行RunSQL.aspx页面,它会打开指定的 .SQL 文件,在通过连接字符串指定的数据库中迭代执行文件中的每一句SQL语句。这就会把 .SQL 文件中定义的数据库配备到远程的目标数据库中去。
第四步: 编辑 RunSQL.aspx 辅助页面
在本地打开/编辑RunSQL.aspx文件,设置好你的 .SQL 文件名字,以及提供与你的主机供应商给予你的SQL数据库对应的连接字符串:
把 <<YOUR_SCRIPTFILE>> 标记以及相关的连接字符串标记替换成你主机环境中的正确配置值。注意,除非你知道你的 .SQL 文件的完整路径,你大概需要使用ASP.NET中的Server.MapPath(fileName)方法来推算出你应用中与 .SQL 文件的相对路径相对应的绝对路径。譬如:
// Filename of the T-SQL file you want to run
string fileName = Server.MapPath("personal.SQL");
// Connection string to the server you want to execute against
string connectionString = @"Server=server123;User ID=user123;Password=password123;Initial Catalog=MyDBName123";
// Timeout of batches (in seconds)
int timeout = 600;
第五步: 把 RunSQL.aspx 辅助页面上传到你的远程主机
完成更改文件名和连接字符串值之后,把RunSQL.aspx文件上传到你的远程主机上去(譬如,使用FTP)。
为安全的原因,我建议你在上传时给该文件一个随机的文件名,这样,别人就不容易找到这个文件并执行它了。
第六步: 用浏览器访问 RunSQL.aspx 辅助页面
上传后,通过浏览器访问远程的RunSQL.aspx网页,这会导致你远程服务器上的网页分析 .SQL 文件,执行其中的所有SQL语句。 因为 .SQL 文件包含了重建数据库所需的数据库数据定义和数据填充的所有语句,网页执行完毕后,你就将一个一模一样的数据库部署到你的远程主机上了:
第七步: 删除 RunSQL.aspx 和 .SQL 文件
运行完你的 .SQL 脚本之后,把RunSQL.aspx网页和 .SQL 文件同时从你的远程主机服务器上删除。
为安全的原因,你不想要任何其他人能够远程访问RunSQL.aspx网页,因为它也许会重建你的数据库,导致数据丢失。
第八步: 更新你应用的Web.Config文件来指向主机环境中的数据库
剩下的最后一步是更新你的web.config文件的 <connectionStrings> 部分指向你的远程主机数据库的连接字符串值。之后,你的应用就应该在远程主机上正常工作了。
希望本文对你有所帮助,
Scott
附注:要阅读我写的其他的技巧,诀窍和Recipes帖子的话,请访问这个网页。
【原文地址】 Recipe: Deploying a SQL Database to a Remote Hosting Environment (Part 1)
【原文发表日期】 Friday, December 22, 2006 12:58 AM
场景:
你开发完了一个得意的ASP.NET应用,所有的东西都测试过了而且在你本机上一切工作都正常,充分利用了ASP.NET 2.0中的成员,角色和用户信息等新功能,万事俱备,准备将它发布到一个远程主机环境,跟整个世界分享这个应用。
将.aspx文件和编译的程序集拷贝到远程系统是非常容易的,只要使用FTP或者直接向上拷贝文件即可。但许多开发人员面临的挑战是,如何在远程主机的站点上架设和重建数据库内容,包括数据定义和数据本身。不幸的是,过去以来一直没有极其简单的方式来达成这个目的。
好消息是,这个星期,SQL Server产品组推出了新的 SQL Server Hosting Toolkit的发布候选版 ,这个工具包将使部署你的SQL解决方案到远程主机环境容易之极。这个工具包允许你在本地操作SQL Express,SQL Server 2000,和 SQL Server 2005数据库,然后把你的数据定义和数据轻松地迁移,安装到一个共享的远程主机SQL Server账号上。
下面的内容将描述你可以如何开始使用这个工具包。
SQL Server Hosting Toolkit
SQL Server Hosting Toolkit可以免费获取,同时发布的还有一个数据库发布向导(Database Publishing Wizard),该向导支持2种数据库主机部署场景:
1) 数据库发布向导允许你指向一个你正在本机上操作的数据库,然后自动生成一个.SQL脚本文件,该文件包含了在任何远程系统上重建一个当前数据库的完整拷贝所需的安装逻辑。这个.SQL脚本包括了需要创建数据库定义(表,视图,存储过程,触发器,全文索引目录,角色,规则等等,可在此处参考所有细节),以及把与你本地数据库同样的数据内容填充到新数据库里去的所有的东西(这类似于MySQL 的dump工具)。把这些安装逻辑封装在单个.SQL 文件的好处是,大多数主机供应商已经支持上传 .SQL 文件到他们的主机环境,并且通过他们的管理控制面板运行这些脚本的能力。假定你现有一个支持这个功能的web主机供应商,你可以马上开始使用数据库发布向导来轻松地部署你的网站,而不需要主机供应商安装或配置什么东西。
2) 数据库发布向导也允许你指向一个你正在本机上操作的数据库,然后使用 web service 向你的远程主机环境迁移和重建数据库(而不用创建一个.SQL 文件或者使用主机供应商的管理控制面板运行这个文件)。不过,这个发布选项需要主机环境提供SQL发布web-service。 SQL Server Hosting Toolkit包含了一个免费的SQL发布web-service实现,我们将与主机供应商密切合作来部署这个web-service。
数据库发布向导允许你在本地使用 SQL Express 或 SQL Server 2000/2005 ,然后在远程主机环境中使用SQL 2000 或 SQL 2005。它不要求SQL服务器的版本是一样的,所以,你可以在本地使用SQL Express 2005,然后上传到主机环境中的SQL 2000服务器,而不用改动任何编码。
数据库发布向导也支持对内置的ASP.NET 2.0成员,角色管理,用户信息和健康监测等数据定义的处理。许多人遇上问题,因为随 ASP.NET一起发布的来建立这些数据定义的内置.SQL 脚本在安装时(install-time)需要DBO权限,但很多主机供应商对此并不支持(注:脚本在运行时(runtime)不需要DBO权限,只是在安装时(install time)才需要,但这有时会是个障碍,除非主机供应商愿意为你安装)。而在另一方面,数据库发布向导在安装ASP.NET 2.0成员,角色管理,用户信息等数据定义和数据时,并不需要DBO权限,应该允许你,和使用数据库发布向导部署其他数据库一样,轻松地部署 ASPNETDB数据表和存储过程。
教程一:使用.SQL文件把SQL Express数据库部署到一个SQL Server主机账号上去
在接下来的几周内,我将写一系列的帖子示范如何使用SQL Server Hosting Toolkit中的种种功能。这系列中的第一个教程讨论如何使用它来轻松地生成一个本地SQL Express数据库的 .SQL 安装文件,然后你可以将它拷贝到一个远程主机账号上,用它来重新建立一个 SQL Server 数据库,为你的网站所用。
起始准备:下载和安装数据库发表向导
我们要做的第一步是确认我们安装了SQL Hosting Toolkit中的数据库发布向导。点击这里下载安装。
数据库发布向导既有图形界面的向导,也有命令行工具。图形界面的向导既可以单独运行,也可以通过它向Visual Studio 2005 和 Visual Web Developer Express的解决方案管理器中添加的context-menu支持来运行。为本教程的目的,我们将使用后面这个解决方案管理器的集成方法,它使得发布极其容易。
第一步:创建一个使用本地SQL Express或SQL Server数据库的ASP.NET网站
为方便这个演示,我们将使用随VS 2005(VS) 和Visual Web Developer Express(VWD)而来的内置的Personal Starter Kit模板。为创建一个基于这个模板的新web项目,在VWD或VS中选择文件->新网站,然后在新网站对话框中选择Personal Starter Kit模板。在默认情形下,这个personal starter kit应用是配置使用SQL Express(这数据库是免费的,可以在这里下载)的。执行之后,如下图所示:
在创建应用后,你可以在VWD/VS中选“网站”->“ASP.NET配置”菜单项来运行web管理工具,创建一个新的用户,把该用户添加到网站的“admin”角色中去。然后你就可以这个新的管理员用户账号登录,试着上传新的相片或者定制网站上现有的相片(注意,这么做的话,相片的元数据以及原相片的二进制数据都是储存在数据库里的):
上述步骤结束之后,我们将拥有2个SQL Express数据库,安装在我们项目的\app_data文件夹里。其中一个SQL Express数据库名为personal.mdf,内含特定于我们网站的数据表和存储过程,譬如photo(相片)和album(相册)表,以及基本的内容管理支持等。另外一个SQL Express数据库名为aspnetdb.mdf,内含默认的ASP.NET 2.0成员,角色和用户信息提供器的数据库贮藏,被我们的应用用来做登录和管理之用。
第二步:为我们的数据库创建 .SQL 安装脚本
至此,我们建立了新的应用和本地数据库,向数据库中添加了自定义数据,象新用户账号以及他们的角色成员,以及新的相片和相册等,我们想要把这应用部署到一个远程主机服务器上去。
我们要做的第一步是创建 .SQL 脚本文件,这些文件将允许我们在远程主机账号上自动重建完全一样的数据库定义和数据库内容。我们将使用作为SQL Hosting Toolkit的一部分安装在本机上的数据库发布向导(Database Publishing Wizard)来做。
一开始,点击 Visual Studio 或 Visual Web Developer中的服务器管理器页,查看一下我们的程序所用的数据库:
在上图中可以看到,我们用到了2个SQL Express数据库:ASPNETDB.MDF 和 Personal.MDF。想为每个数据库生成一个 .SQL 安装文件的话,只要选择管理器里的数据库,然后按右鼠标,在其上选择“Publish to Provider(发布到提供者)”上下文菜单项(是由数据库发布向导添加的):
这会启动数据库发布向导,允许我们按部就班地生成数据库的安装脚本。就象在本帖子里的简介部分提到的一样,数据库发布向导支持2个部署选项: 1) 生成 .SQL 安装脚本文件,你能将它们拷贝到远程主机上然后使用他们现有的管理控制面板工具来运行它们,或者 2) 使用主机网站提供的数据库发布Web Service直接把数据库上传。
在这第一个教程里,我们将使用 .SQL 脚本文件的方法,所以,保留默认的单选按钮选项,给你想生成的 .SQL 安装脚本文件提供一个名字:
在点击“下一步”之后,向导会提供选项让你定制生成 .SQL 安装文件时的一些设置。注意,你可以控制是否要删除目标数据库中的现有对象,脚本针对的是SQL 2000 还是SQL 2005 ,是否要同时安装数据定义和数据,还是只要数据定义,或者只要数据:
在本教程中,保留默认的选项,点击“下一步”,生成.SQL 脚本:
至此,你就拥有一个名为Personal.SQL的文件,内含你可以在任何SQL服务器上运行的脚本,该脚本能用来重建数据库中的数据表,存储过程,视图,全文索引目录等,以及导入创建.SQL文件时对应数据库中的所有的数据记录。
该.SQL文件本身是个文本文件,所以你可以用任何文本编辑器将它打开,查看其中的内容,或者添加你自己的语句来做任何定制:
注意,上面的.SQL文件既包括了创建Photos表所需的DDL SQL语句(包括该表所有约束和主键/外键等关系),也包括了在该表创建后在改该表内插入数据的SQL语句。在上面的例子中,甚至包括了插入相片的二进制数据的SQL语句,因为这些数据是保存在数据库里的。
把上述步骤对ASPNETDB SQL Express数据库重复执行之后,你将拥有2个你可以用来在任何SQL服务器上自动重建你的SQL数据库的.SQL 安装脚本:
注意,我们建立的.SQL文可以用来在一个服务器上创建2个单独的数据库,或者也可以在同个数据库里运行,从而生成一个包含了你程序的所有的数据表,存储过程和数据的单一数据库。要实现这个目的,只要对同个数据库运行这两个脚本就可以了。假如没有表名和存储过程名冲突的话,你将拥有一个包括所有东西的单一数据库。当你的主机账号只提供了一个可用的数据库实例时,这后一个选项是非常有用的。
第三步:用我们的 .SQL 文件创建我们的远程数据库
至此,我们生成了 .SQL 文件,我们就可以用它们来在我们的主机环境中安装数据库了。我们怎么使用 .SQL 文件安装数据库的细节取决于主机供应商是如何让我们访问我们的SQL账号的。有些主机供应商提供了一个基于HTML的文件上传工具,允许你提供一个 .SQL 文件,然后他们可以在你拥有的SQL数据库里执行这个文件。
其他的主机供应商提供一个在线的查询工具(如下图所示),允许你拷贝/粘贴SQL语句来在你的数据库里运行。如果你的主机供应商提供了类似的在线查询工具的话,那么你可以用一个文本编辑器打开.SQL文件,然后把其中的内容拷贝/粘贴到查询文本框里,然后运行这些语句。
不同主机供应商提供的SQL工具的质量不尽相同。在测试数据库发布向导时,我们发现主机供应商提供的一些定制的SQL管理工具会不正确地分析合法的SQL语句从而导致问题,特别是对于GOTO语句。这个页面描述了一个你也许见过的一些主机供应商的工具遭遇GOTO语句的问题。为了帮助全面提高SQL主机管理工具的质量,SQL Server产品组在明年的早些时候会发布一个免费的SQL HTML管理工具的源码,主机供应商可以将其集成到他们的界面中去。如果顺利的话,这将有助于改进所有Windows主机环境的标准体验。
如果你的主机供应商没有可用的HTML web管理工具让你轻松管理你的SQL数据库的话,那么你也可以编写一个简单的ASP.NET 网页,你可以将它和你的 .SQL 文件一起FTP到你的网站,然后访问该网页,该网页则把 .SQL 文件当作文本文件读入内存,然后将其变成一个字符串传给ADO.NET来执行。这将给予你和上面的查询分析器一样的结果,为你完全重建你的数据库。
Step 4: 第四步:更新web.config中的连接字符串
一旦在我们的主机环境的数据库里上传数据完毕,我们要向远程网站上传我们的.aspx文件,程序集和其他内容(一般是通过FTP来做的)。
我们要做的最后一步是打开我们的 web.config 文件,更新 <connectionStrings> 部分来指向我们远程主机的新数据库位置。注意,你需要从主机供应商那里得到确切的SQL服务器,数据库名字,以及用户名/密码。
用我们上面的personal starter kit作为例子,我们要改动 web.config 文件中的 <connectionStrings> 部分中的默认连接字符串(原本使用的是本地\app_data文件夹中的2个SQL Express数据库):
<connectionStrings>
<add name="Personal" connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Personal.mdf" />
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf" />
</connectionStrings>
来使用单个SQL Server 2000数据库(Server123机器上的scottguDB数据库)。
<connectionStrings>
<add name="Personal" connectionString="Data Source=Server123;Initial Catalog=scottguDB;Integrated Security=True" providerName="System.Data.SqlClient" />
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer" connectionString="Data Source=Server123;Initial Catalog=scottguDB;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
我们能够使用单个数据库(而不是上面的2个数据库),因为我们对单一数据库运行了2个 .SQL文件,这样,把所有的数据定义和数据库合并到单个数据库实例里去了。
第五步:完成
至此,我们就可以在主机环境里远程运行我们的应用了,它应该是工作的。
总结
作为SQL Hosting Toolkit的一部分推出的数据库发布向导应该使得为任何数据库(SQL Express 或者 SQL Server)创建 .SQL 文件非常容易。你可以使用它来轻松地dump你本机的数据库,然后用来在远程系统上重新建立完全一样的数据库。
在将来的教程里,我将示范你如何不用 .SQL 文件就可以重建远程数据库(而是在VS里通过web service把数据库直接发布到你的主机环境中去),请静候相关细节。
希望本文对你有所帮助,
Scott
附注:我们正计划把数据库发布向导加到 Visual Studio "Orcas"(下一个VS版本)中去,这意味着在那个时段里,你就不用单独下载数据库发布向导了。但我们要确定你不必等到那个时候,这是我们今天就将它提供给Visual Studio 2005和Visual Web Developer Express 2005的原因。
附注2:请访问此页阅读我以前写的其他方面的ASP.NET Tips,Tricks 和 Recipes。
【原文地址】Visual Studio for Database Professionals and other Cool Data Management Tools for .NET
【原文发表日期】 Wednesday, October 18, 2006 7:40 AM
今天早先时候,我们发布了Visual Studio Team版的数据库专业人员版的第六个社区技术预览版(CTP)供免费下载。
Visual Studio 数据库专业人员版获得的好评如潮,其功能包括对数据库重构,数据库定义和数据的比较,数据库单元测试,以及自动的数据生成的支持。你可以在它的MSDN开发人员中心及其社区网页上了解更多的相关信息。你也可以在这里观看一个 Channel9 采访该产品开发组的录像。
我最近在 http://weblogs.asp.net 上看到了另外2个数据管理工具,看上去非常酷,值得花时间看一下:
MassDataHandler ── 一个免费的CodePlex项目,提供了一个可以为单元测试自动生成数据的工具库,可以和任何单元测试框架一起使用。
Data Dictionary Creator ── 一个免费的工具,可以帮助你管理SQL服务器数据库的文档,帮你把文档与数据定义的变动保持同步。
希望本文对你有所帮助,
Scott