欢迎光临
我们一直在努力

运用.NET+SQL Server2005构建多层网站(2)-.NET教程,数据库应用

建站超值云服务器,限时71元/月

sql server 2005的一大新特性便是整合了.net 的clr。整合了.net clr的好处在于,可以很方便地使开发者可以使用自己熟悉的.net 语言来创建存储过程,触发器,自定义函数等。在本文中,将以c#来创建存储过程。为什么不用t-sql来创建存储过程呢?因为t-sql发展到目前,已经很长时间了,在某些场合有其局限性,比如t-sql不是面向对象的,某些语法过于复杂等。而如果使用面向对象的.net 语言来编写如存储过程等数据对象时,由于.net 语言强大的特性,因此能写出更健壮和更优秀的存储过程。

注意,通过sql server 2005用.net编写的存储过程,都是和用.net语言编写一般应用的程序一样,都是managed code。此外,clr 编程语言提供了 t-sql 中所没有的丰富构造(例如数组和列表等)。与 t-sql(它是一种解释语言)相比,clr 编程语言之所以具有更好的性能,是因为托管代码是已编译的。对于涉及算术计算、字符串处理、条件逻辑等的操作,托管代码的性能可能要优于 t-sql 一个数量级。在本文中,虽然可以用t-sql来编写存储过程,但为了说明问题,还是以c#来写存储过程。步骤如下:

  首先,打开visual studio 2005 beta 2,选择c#语言,新建立一个database工程,命名为sqlproject1。此时,visual studio 2005 beta 2会询问你,要与什么数据库进行关联。由于我们采用的是pubs这个数据库,因此我们选择机器名是本地机器,设置好sql的验证方式,选择pubs数据库,就可以了。(注意,在sql server 2005中,pubs和northwind数据库不再是sql server 2005的自带数据库了,需要http://go.microsoft.com/fwlink/?linkid=31995去下载)。

接着,在工程建立完毕后,选择新增项目,选择store procedure存储过程,并以authors.cs命名,再按确定,并输入以下代码:

using system;
using system.data;
using system.data.sql;
using system.data.sqltypes;
using microsoft.sqlserver.server;
using system.data.sqlclient;

public partial class storedprocedures
{
 [microsoft.sqlserver.server.sqlprocedure]

 public static void getauthors()
 {
  sqlpipe sp = sqlcontext.pipe;
  using (sqlconnection conn = new sqlconnection("context connection=true"))
  {
   conn.open();
   sqlcommand cmd = new sqlcommand();
   cmd.commandtype = commandtype.text;
   cmd.connection = conn;
   cmd.commandtext = "select datepart(second, getdate()) " + " as timestamp,* from authors";
   sqldatareader rdr = cmd.executereader();
   sp.send(rdr);
  }
 }

 [sqlprocedure]

 public static void gettitlesbyauthor(string authorid)
 {
  string sql = "select t.title, t.price, t.type, " + "t.pubdate from authors a" +
     " inner join titleauthor ta on a.au_id = ta.au_id " +
     " inner join titles t on ta.title_id = t.title_id " +
     " where a.au_id = ’" + @authorid + "’";
  using (sqlconnection conn = new sqlconnection("context connection=true"))
  {
   conn.open();
   sqlpipe sp = sqlcontext.pipe;
   sqlcommand cmd = new sqlcommand();
   cmd.commandtype = commandtype.text;
   cmd.connection = conn;
   cmd.commandtext = sql;
   sqlparameter paramauthorid = new sqlparameter("@authorid", sqldbtype.varchar, 11);
   paramauthorid.direction = parameterdirection.input;
   paramauthorid.value = authorid;
   cmd.parameters.add(paramauthorid);
   sqldatareader rdr = cmd.executereader();
   sp.send(rdr);
  }
 }
}

  让我们来看上面的代码。首先声明了authors类,并且要引入system.data.sql;,system.data.sqltypes;,microsoft.sqlserver.server; system.data.sqlclient等命名空间。其中,在microsoft.sqlserver.server命名空间中,有两个十分重要的类:

  ·sqlcontext: 一个sqlcontext类包含的方法可以取得一个数据库实例连接、命令,事务等。

  ·sqlpine: 用户实现发送查询结果和消息到客户端,和ado.net里面的response类有很多相似之处。

  在authors类中包含了两个静态方法,分别是getauthors和gettitlesbyauthor。其中,getauthors方法返回pubs数据库中authors表的所有数据,而gettitlesbyauthor,则返回指定作者的所写的图书。

  在getauthors方法中,首先通过调用sqlcontext类的pipe属性引用sqlpine对象:

sqlpipe sp = sqlcontext.pipe;

  接着,使用sqlconnection对象连接到数据库。注意,在连接数据库的字符串中,使用”context=true”,表示使用已经登陆到数据库的用户进行登陆:

using (sqlconnection conn = new sqlconnection("context connection=true"))
conn.open();

  再创建sqlcommand对象的实例,并且设置其属性:

sqlcommand cmd = new sqlcommand();
cmd.commandtype = commandtype.text;
cmd.connection = conn;
cmd.commandtext = "select datepart(second, getdate()) " + " as timestamp,* from authors";

  通过调用sqlcommand对象的executereader方法来执行sql语句。

sqldatareader rdr = cmd.executereader();

  最后,使用sqlpipe对象,将结果集返回 到客户端。这可以使用send方法实现

sp.send(rdr);

  要注意的是,我们在创建存储过程后,必须对其进行部署。我们先选择builde菜单中的 build sqlproject1,就会编译我们刚才创建的类。当编译完工程后,就可以进行部署了。部署也十分简单,选择build菜单,然后选择deploy sqlproject1,这样就会自动将刚写好的存储过程部署到sql server 2005中去。

  最后,我们还要在sql server management studio中,执行如下语句,以确保在sql server 中可以执行托管代码:

exec sp_configure ’clr enabled’, 1;
reconfigure with override;
go

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 运用.NET+SQL Server2005构建多层网站(2)-.NET教程,数据库应用
分享到: 更多 (0)