网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.教你如何用SQL备份和还原数据库.
.SQL Server 2005使用基于行版本控.
.小写转大写金额.
.在SQL Server 2005中编辑SQL Ser.
.SQLServer数据库维护计划莫名其妙.
.将sql server中的自动增长序列,.
.SQL Server 2005 - 如何实作CLR存.
.SQL Server2000+JDBC常见问题及解.
.SQL Server 2000/2005下将数据导.
.收集SQL Server统计信息.
.详细讲解提高数据库查询效率的实.
.讲解V$Datafile_Header相关字段的.
.SQL Artisan多层查询条件嵌套功能.
.crosscheck长时间运行后未见结果.
.由浅入深讲解update statistics的.
.在SQL Server 2005中查询表结构及.
.sql 事件探查器方案.
.深入探讨纯软件方式的双机热备解.
.全文本检索的应用(1).
.一个有关SQL Server连接的问题.

使用SQL Server 2005中的CLR集成

发表日期:2006-7-14


“最近碰到点事”
“啥”
“想往数据库连续的插入一批数据”
“那就插啊,看你愁的”
“可是没办法写一个这样的存储过程啊。我不会sql的循环,而且也不能分析字符串用split取值。又不能在程序中直接拼sql语句”
“……”
“怎么那么看着我啊”
“你在用vs2005和sql2005?”
“是啊”
“来,整点新东西吧”
……
这个问题是前几天遇到的,简单描述一下:单一课程和系列课程。一个系列包括多个单一课程。存放数据的表的设计为
表:ES_RefSerailCourse
列:SerialCourseID(int) | CourseID(int)
一个SerialCourseID对应多个CourseID。操作时,创建系列,选择多个课程到一个控件(该控件可以返回用","分隔的选择的课程的编号,点击提交后创建系列,同时把生成的系列编号和课程编号插入到ES_RefSerailCourse。
这种连续插入数据的问题,以前用vs2003+sql200的时候,我是在数据访问层打开一个连接后,循化插入数据,最后关闭连接。这个办法虽然显得很笨,但是当时也没有什么好办法可以在数据库边完成循化插入数据。而现在,时代不同了,我们有了vs2005和sql2005,对于这种t-sql没法完成的任务,可以用sql2005的CLR集成功能实现。
sql2005的CLR集成,说的通俗一些就是用.net语言编写数据库应用,包括存储过程,函数,触发器等等均可。其基本的使用过程为:
1.在vs2005建立一个数据库应用项目。
2.在该项目用.net语言编写数据库应用。
3.将用.net语言编写数据库应用通过vs2005部署到sql2005。
4.实际使用中调用。
下面按照上面的顺序讲一下这个过程。(好久没有写技术文章了,如果有描述不清或错误的地方,欢迎在评论中交流)

1.在vs2005建立一个数据库应用项目。

如图所示,建立一个这样的database项目。建立后会要求你指定一个数据库连接,按照提示一步步进行就ok。建立完成后可以测试一下数据库连接。办法为:在解决方案上点右键,选Deploy(中文应该是部署?),如果状态栏提示部署成功,那就ok了,否则请检查一下数据库连接(以及……人品)。

2.在该项目用.net语言编写数据库应用。
我用C#。这个过程和编写普通的程序基本相同。下面是上面问题的解决程序

 

 1         /// <summary>
 2         /// 将课程加入到系列
 3         /// </summary>
 4         /// <param name="serialID">系列编号</param>
 5         /// <param name="ids">课程编号汇总</param>
 6         /// <returns></returns>
 7         [Microsoft.SqlServer.Server.SqlProcedure]
 8         public static void up_AddCoursetoSerial(SqlInt32 serialID, SqlString ids)
 9         {
10             using (SqlConnection connection = new SqlConnection("context connection=true"))
11             {
12                 connection.Open();
13                 System.Text.StringBuilder sqlb=new System.Text.StringBuilder();
14                 string[] courseIds = ids.Value.Split(new char[] { ',' });
15                 foreach (string courseId in courseIds)
16                 {
17                     if (courseId.Length > 0)
18                     {
19                         sqlb.AppendFormat("insert into [ES_RefSerailCourse] values({0},{1}) ;", serialID, courseId);
20                     }
21                 }
22                 command = new SqlCommand(sqlb.ToString(), connection);
23                 SqlContext.Pipe.ExecuteAndSend(command);
24             }
25         }
 

a .在方法上加attribute,是什么就加什么。具体可以查SDK文档。这样在编译和部署的时候vs2005就会按照你的意思来做了。
b.暴露在外的数据需要使用System.Data.SqlTypes。这是自然的。
c.构造完command后,使用SqlContext.Pipe.ExecuteAndSend()执行。
(实际上,我们还是拼了sql语句,但最后的表现形式却成了一个存储过程。大部分的项目都不允许直接把sql语句写到程序中,所以,这个办法就有了用武之地。)

3.将用.net语言编写数据库应用通过vs2005部署到sql2005。
完成上面的工作后,对项目进行编译,部署,方法是在解决方案上点右键,选...... 这个的结果是vs2005在sql2005中生成了一个存储过程。接下来就可以到sql2005的存储过程管理部分看一下是否多了一个名字叫“up_AddCoursetoSerial”的,如果存在,那恭喜你,一切都很完美。

4.实际使用中调用。
到这一步,就忘记这是一个用.net语言写的存储过程吧,该怎么用就怎么用。下面是我的实际应用:

 

 1 ALTER PROC [dbo].[ES_SerialRecordCourse_Insert]
 2  (
 3  @SerialCourseID    int out,
 4  @SerialCourseName    nvarchar(100),
 5  @Description    nvarchar(200),
 6         @IDs nvarchar(500)
 7  )
 8 AS
 9 INSERT INTO [ES_SerialRecordCourse]
10  (
11  [SerialCourseName],
12  [Description]
13  )
14 VALUES
15  (
16  @SerialCourseName,
17  @Description
18  )
19 SET @SerialCourseID=@@IDENTITY
20
21 --向 系列_课程对应表 插入数据
22 exec dbo.up_AddCoursetoSerial @SerialCourseID,@IDs
23
 

最后一句就是调用了我们刚才写的存储过程,接受两个参数。是不是很方便?

看到这里,相信聪明的你已经对sql2005的CLR集成有了初步的印象。如果想完全掌握这个强大的武器,最好的办法就是立刻开始自己的编写。在之前,看看msdn上对这个的介绍也会很有帮助
http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx
我也是前几天因为项目需要才接触这个,希望可以和大家一起来学这个很酷的新功能:)

好了,我的最新的一篇笔记完成了!和前一篇笔记相隔的时间大概是……一年??
but,better later than never :)


链接地址: http://notus.cnblogs.com/archive/2006/07/13/450008.html

上一篇:解决sqlserver2005中文版与vs2005的WebApplicationProject的冲突问题 人气:7699
下一篇:将SQLServer2005 数据库还原或恢复到SQLServer2000数据库中 人气:9185
浏览全部SQL Server 2005的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐