六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

教大家SQL Server中的CLR編程(用.NET為SQL Server編寫(xiě)存儲(chǔ)過(guò)程)

[摘要]軟件等級(jí):更新時(shí)間:2016-11-11版本號(hào):v5.7.10 MySQL Server x64官方正式版免費(fèi)下載立即下載 教大家SQL Server中的CLR編程(用.NET為SQL ...
MySQL Server x64官方正式版免費(fèi)下載

軟件等級(jí):

更新時(shí)間:2016-11-11

版本號(hào):v5.7.10

MySQL Server x64官方正式版免費(fèi)下載

 教大家SQL Server中的CLR編程(用.NET為SQL Server編寫(xiě)存儲(chǔ)過(guò)程)

最近在這方面做了一個(gè)調(diào)研,現(xiàn)在在這里分享一下心得。很早就知道可以用.NETSQL Server2005及以上版本編寫(xiě)存儲(chǔ)過(guò)程、觸發(fā)器和存儲(chǔ)過(guò)程的,不過(guò)之前開(kāi)發(fā)的系統(tǒng)要么因?yàn)闅v史原因用的是SQL2000要么根本用不著在SQL Server中啟用CLR,所以一直沒(méi)有嘗試。

首先要說(shuō)明的是要在SQL Server中啟用CLR必須是在SQL Server2005及以上版本,其次在默認(rèn)情況下是沒(méi)有啟用CLR的,必須要顯示設(shè)置為啟用。比如我們要在ArticleCollectorDB數(shù)據(jù)庫(kù)中運(yùn)行用.NET編寫(xiě)的函數(shù)或者存儲(chǔ)過(guò)程,至少先要進(jìn)行下面的SQL語(yǔ)句:

[sql] view plaincopyprint?
  1. exec sp_configure 'clr enabled', 1;--在SQL Server中啟用CLR
  2. reconfigure;
  3. go
  4. --在ArticleCollectorDB數(shù)據(jù)庫(kù)中設(shè)置TRUSTWORTHY為ON
  5. ALTER DATABASE [ArticleCollectorDB] SET TRUSTWORTHY ON

這時(shí)可能會(huì)得到提示要重新啟動(dòng)SQL Server,如果有此提示則重新啟動(dòng)一下。

接著我們?cè)?span style="font-family: Times New Roman">VS中進(jìn)行編碼,在這里我們將分別編寫(xiě)一個(gè)名為IsMatch的函數(shù)和一個(gè)名為SendMail存儲(chǔ)過(guò)程。在VS中創(chuàng)建一個(gè)名為NetSkycn.Data的類(lèi)庫(kù)項(xiàng)目,添加一個(gè)SqlCLR的類(lèi),代碼如下:

[csharp] view plaincopyprint?
  1. using System.Data.SqlTypes;
  2. using System.Net;
  3. using System.Net.Mail;
  4. using System.Security.Permissions;
  5. using System.Text.RegularExpressions;
  6. using Microsoft.SqlServer.Server;
  7. namespace NetSkycn.Data
  8. {
  9. ///
  10. /// 在SQL Server環(huán)境中執(zhí)行的CLR方法,注意提供給SQL Server調(diào)用的方法必須有SqlFunction/SqlProcedure Attribute
  11. /// 作者:周公
  12. /// 創(chuàng)建日期:2012-05-09
  13. ///span>
  14. ///span>
  15. ///
  16. public sealed class SqlCLR
  17. {
  18. ///
  19. /// 判斷字符串是否匹配正則表達(dá)式
  20. ///
  21. ///要匹配的文本
  22. ///進(jìn)行匹配的正則表達(dá)式
  23. ///正則表達(dá)式匹配選項(xiàng),1為忽略大小寫(xiě),2為多行匹配,3為忽略大小寫(xiě)且多行匹配
  24. ///
  25. [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
  26. public static SqlBoolean IsMatch(string source, string pattern,int options)
  27. {
  28. if (string.IsNullOrEmpty(source) string.IsNullOrEmpty(pattern))
  29. {
  30. return SqlBoolean.False;
  31. }
  32. RegexOptions regexOptions=RegexOptions.None;
  33. int optionIgnoreCase = 1;
  34. int optionMultiline = 2;
  35. if ((options & optionIgnoreCase) != 0)
  36. {
  37. regexOptions = regexOptions RegexOptions.IgnoreCase;
  38. }
  39. if ((options & optionMultiline) != 0)
  40. {
  41. regexOptions = regexOptions RegexOptions.Multiline;
  42. }
  43. return (SqlBoolean)(Regex.IsMatch(source, pattern, regexOptions));
  44. }
  45. ///
  46. /// 發(fā)送郵件
  47. ///
  48. ///收件人郵件地址
  49. ///發(fā)件人郵件地址
  50. ///郵件主題
  51. ///郵件內(nèi)容
  52. ///登錄smtp主機(jī)時(shí)用到的用戶(hù)名,注意是郵件地址'@'以前的部分
  53. ///登錄smtp主機(jī)時(shí)用到的用戶(hù)密碼
  54. ///發(fā)送郵件用到的smtp主機(jī)
  55. [SqlProcedure]
  56. [SmtpPermission(SecurityAction.Assert)]
  57. [SecurityPermission(SecurityAction.Assert)]
  58. public static void SendMail(string to, string from, string subject, string body, string userName, string password, string smtpHost)
  59. {
  60. MailAddress addressFrom = new MailAddress(from);
  61. MailAddress addressTo = new MailAddress(to);
  62. MailMessage message = new MailMessage(addressFrom, addressTo);
  63. message.Subject = subject;//設(shè)置郵件主題
  64. message.IsBodyHtml = true;//設(shè)置郵件正文為html格式
  65. message.Body = body;//設(shè)置郵件內(nèi)容
  66. SmtpClient client = new SmtpClient(smtpHost);
  67. //設(shè)置發(fā)送郵件身份驗(yàn)證方式
  68. //注意如果發(fā)件人地址是[email protected],則用戶(hù)名是abc而不是[email protected]
  69. client.Credentials = new NetworkCredential(userName, password);
  70. client.Send(message);
  71. }
  72. }
  73. }

編譯通過(guò)之后,記住類(lèi)庫(kù)的物理全路徑,比如:F:\VS2008\netskycn\NetSkycn.Data\bin\Release\NetSkycn.Data.dll,在這里要強(qiáng)調(diào)幾點(diǎn):一、對(duì)于將來(lái)提供給SQL Server調(diào)用的函數(shù)或者存儲(chǔ)過(guò)程必須是靜態(tài)方法,并且還必須帶有SqlFunction或者SqlProcedure屬性;二、對(duì)于一些需要訪問(wèn)外部網(wǎng)絡(luò)資源和安全屬性的還必須添加響應(yīng)的屬性(如本例中的SendMail方法,如果沒(méi)有添加響應(yīng)的屬性在創(chuàng)建SQL Function/Procedure時(shí)會(huì)出現(xiàn)錯(cuò)誤提示)。

現(xiàn)在我們開(kāi)始遵循先為SQL Server創(chuàng)建程序集、后創(chuàng)建函數(shù)或者存儲(chǔ)過(guò)程的順序來(lái)操作,在操作過(guò)程中用到的SQL語(yǔ)句如下:

[sql] view plaincopyprint?
--在ArticleCollectorDB數(shù)據(jù)庫(kù)中設(shè)置TRUSTWORTHY為ON
  1. ALTER DATABASE [ArticleCollectorDB] SET TRUSTWORTHY ON
  2. --如果已經(jīng)存在該對(duì)象則刪除
  3. IF EXISTS(SELECT * FROM SYS.SYSOBJECTS WHERE NAME='SendMail' AND XTYPE='PC')
  4. DROP PROCEDURE SendMail
  5. --如果已經(jīng)存在該對(duì)象則刪除
  6. IF EXISTS(SELECT * FROM SYS.SYSOBJECTS WHERE NAME='IsMatch' AND XTYPE='FS')
  7. DROP FUNCTION IsMatch
  8. --如果已經(jīng)存在SqlCLR程序集則刪除該程序集
  9. IF EXISTS(SELECT * FROM SYS.ASSEMBLIES WHERE NAME='SqlCLR')
  10. DROP ASSEMBLY SqlCLR
  11. --在SQL Server中創(chuàng)建程序集,,創(chuàng)建的程序集名為SqlCLR
  12. CREATE ASSEMBLY SqlCLR FROM 'F:\VS2008\netskycn\NetSkycn.Data\bin\Release\NetSkycn.Data.dll' WITH PERMISSION_SET = UNSAFE
  13. GO
  14. --從CLR程序集中創(chuàng)建函數(shù),函數(shù)名為IsMatch,有三個(gè)參數(shù),
  15. --[SqlCLR]是SQL Server中程序集名
  16. --[NetSkycn.Data.SqlCLR]是.NET中的類(lèi)的全名(命名空間及類(lèi)名)
  17. --[IsMatch]是.NET中類(lèi)的函數(shù)名
  18. CREATE FUNCTION [dbo].[IsMatch]
  19. (
  20. @source AS NVARCHAR(200),
  21. @pattern AS NVARCHAR(200),
  22. @option INT=3
  23. )
  24. RETURNS BIT
  25. AS
  26. EXTERNAL NAME [SqlCLR].[NetSkycn.Data.SqlCLR].[IsMatch];
  27. GO
  28. --從CLR程序集中創(chuàng)建函數(shù),函數(shù)名為IsMatch,有三個(gè)參數(shù),
  29. --[SqlCLR]是SQL Server中程序集名
  30. --[NetSkycn.Data.SqlCLR]是.NET中的類(lèi)的全名(命名空間及類(lèi)名)
  31. --[SendMail]是.NET中類(lèi)的函數(shù)名
  32. CREATE PROCEDURE [dbo].[SendMail]
  33. (
  34. @to AS NVARCHAR(200),
  35. @from AS NVARCHAR(200),
  36. @subject AS NVARCHAR(200),
  37. @body AS NVARCHAR(MAX),
  38. @userName AS NVARCHAR(200),
  39. @password AS NVARCHAR(200),
  40. @smtpHost AS NVARCHAR(200)
  41. )
  42. AS
  43. EXTERNAL NAME [SqlCLR].[NetSkycn.Data.SqlCLR].[SendMail];
  44. GO

如果沒(méi)有得到任何錯(cuò)誤提示,則表示創(chuàng)建函數(shù)和存儲(chǔ)過(guò)程成功。至此我們會(huì)看到如下情形:

教大家SQL Server中的CLR編程(用.NET為SQL Server編寫(xiě)存儲(chǔ)過(guò)程)

這表示創(chuàng)建成功。

測(cè)試創(chuàng)建函數(shù)的SQL語(yǔ)句(查找article表中title字段是35個(gè)字段的數(shù)據(jù)):

[sql] view plaincopyprint?
  1. select * from article where dbo.IsMatch(Title,'^[\u4e00-\u9fa5]{3,5}$',3)=1

測(cè)試創(chuàng)建存儲(chǔ)過(guò)程的SQL語(yǔ)句:

[csharp] view plaincopyprint?
  1. exec [dbo].SendMail @to='[email protected]',@from='[email protected]',@subject='test',@body='This mail was sent by SQL Procedure',@userName='webmaster',@password='123',@smtpHost='smtp.qq.com'

以上代碼在SQL Server 2005中文企業(yè)版、SQL Server 2008英文企業(yè)版測(cè)試通過(guò)。

可以看出在一些SQL語(yǔ)句不夠靈活的情況下,可以使用.NET來(lái)編寫(xiě)存儲(chǔ)過(guò)程和函數(shù),通過(guò)以上步驟之后和調(diào)用SQL語(yǔ)句寫(xiě)的存儲(chǔ)過(guò)程和函數(shù)沒(méi)有區(qū)別,極大地方便了編程。

希望我的這個(gè)大家有所幫助,記得在這篇日志下面或者主頁(yè)的留言板中留下你們的建議和反饋,這些對(duì)我們是最寶貴的財(cái)富,預(yù)祝大家快樂(lè)!有問(wèn)題大家積極回帖討論下哈!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的電腦知識(shí)




主站蜘蛛池模板: 欧美在线xx | 午夜片在线观看 | 色黄在线观看 | 色综合久久中文 | 亚洲综合精品一二三区在线 | 午夜免费观看视频 | 一二三四影视大全免费观看电视剧 | 日韩欧美爱爱 | 天堂8中文在线最新版在线 天堂8中文在线bt | 亚欧乱色束缚一区二区三区 | 殴美激情| 欧洲性大片xxxxx久久久 | 亚欧美| 亚洲第一网站快活影院 | 伊人青青草 | 日日操视频 | 窝窝午夜视频 | 午夜特片网| 无码中文资源在线播放 | 中文字幕乱码系列免费 | 日韩污视频在线观看 | 欧美在线黄色 | 又粗又黄又猛又爽大片app | 日韩中文字幕在线看 | 速度与激情9下载 | 日韩视频免费看 | 日本免费不卡视频 | 午夜激爽毛片在线看 | 欧美综合区自拍亚洲综合 | 亚洲成人福利网站 | 自拍网视频 | 亚洲美女色在线欧洲美女 | 亚洲乱码一二三四区乱码 | 日韩亚洲一区中文字幕 | 最新日韩在线观看 | 天天综合网天天综合色 | 涩色综合 | 青青草原在线免费 | 青青色在线视频 | 欧美一区二区久久精品 | 中国女人特级毛片 |