在SQL Server2005中使用 .NET程序集

昨天完成了一個最簡單的在數據庫中創建標量值函數,今天主要完成表值函數,存儲過程和用戶定義類型在和.NET結合下的使用方法.
1,表值函數
所謂表值函數就是說這個函數返回的結果是一個Table,而不是單個的值.
在.NET 中創建這樣的函數,返回的結果是一個IEnumerable接口.這個接口非常靈活,所有.NET數組集合等都是實現了該接口的.下面我們舉一個簡單的例子來說明.
在VS2005中創建一個類Student,這個就是我們要返回的表的內容,類下面有屬性int Age,string sName,DateTime Birthday,int SID;
然后在另外一個類UserFunction中寫入如下代碼:

[SqlFunction(FillRowMethodName="FillRow")]
public static IEnumerable GetStudent()
{
Hashtable hash = new Hashtable();
for(int i=0;i<3;i++)
{
Student s = new Student();
s.SID = i;
...
hash.Add(i, s);
}
return hash.Values;
}
public static void FillRow(object obj, ref SqlInt32 id, ref SqlString name, ref SqlDateTime bir, ref SqlInt32 age)
{
Student s = (obj as Student);
id = s.SID;
name = s.sName;
bir = s.Birthday;
age = s.Age;

}

第一個屬性中指定FillRowMethodName就是為了將返回的IEnumerable接口中的數據進行轉換,將數據庫無法認識的集合轉換為數據庫人生的字段.下面的函數FillRow就是具體轉換的過程.
這樣寫完成以后,在數據庫那邊添加好這個程序集,然后就可以創建表值函數了:

create function BuildTable()
returns table(SID int,[sName] nvarchar(100),Birthday datetime,Age int)
as
external name SQLFunction.[SQLFunction.UserFunction].GetStudent


這兒就不用太多的解釋了,就是將名為SQLFunction的程序集中的[名字空間.類].方法添加到BuildTable函數中.
這兒需要說明一下就是數據庫中的類型和.NET中的類型的對應問題.int,datetime就不說了,主要是.NET中的string,在數據庫中沒有string類型,在FillRow中指出了類型SqlString,而這個類型的對應是nchar,nvarchar.這兒不能對應char,varchar,我不知道為什么必須是對應nchar的.所以上面我們寫的是[sName] nvarchar(100).
大功告成,測試一下,輸入語句select * from BuildTable()看看返回你的表沒有.
2.存儲過程
CLR存儲過程和CLR函數非常相似,不過有幾點更高的能力:
CLR存儲過程可以有一個返回值,也可以寫輸出參數,可以返回消息給客戶程序,可以調用DDL和DML語句.
.NET創建存儲過程要編寫為靜態函數,然后加上SqlProcedure屬性.
比如我們寫一個簡單的存儲過程

[SqlProcedure]
public static int Add(int a, int b)
{
return a + b;
}


然后在數據庫中寫入:

create procedure Add2Num
@a int,@b int
as
external name SQLFunction.[SQLFunction.UserFunction].[Add]


整個代碼我就不用解釋了,和前面創建函數一樣.
我們運行看看結果:

declare @a int
exec @a=Add2Num 10,12
print @a


3.用戶定義類型(UDT)
要創建UDT類必須符合"UDT規范",.NET中的約束如下:
他們必須帶SqlUserDefinedType 屬性
必須帶有Serializable屬性
必須實現INullable接口
必須博阿訇公開和靜態的Parse和ToString方法以用于轉換數據類型字符串或逆向轉換.
必須暴露數據元素為公開字段或公開屬性.
好,那我們就創建一個簡單的UDT復數類如下:

[Serializable]
[SqlUserDefinedType(Format.Native)]
[StructLayout(LayoutKind.Sequential)]
public class Complex:INullable
{
bool isNull=false;
double real, imag;
public bool IsNull
{
get { return isNull; }
}
public double Real
{
get { return real; }
set { real = value; }
}
public double Imag
{
get { return imag; }
set { imag = value; }
}
public override string ToString()
{
if (isNull)
{
return "NULL";
}
else
{
return real + "," + imag;
}
}
public static Complex Parse(SqlString s)
{
if (s == null || s.IsNull)
{
return null;
}
else
{
Complex c = new Complex();
string str = Convert.ToString(s);
string[] st = str.Split(',');
c.real = Convert.ToDouble(st[0]);
c.imag = Convert.ToDouble(st[1]);
return c;
}
}
}

編譯好,在數據庫中添加程序集后,我們運行如下代碼:

create type Complex
external name SQLFunction.[SQLFunction.Complex]


這樣我們就創建好了用戶定義類型Complex.
數據庫事例代碼中有相關內容,參見:
\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\UserDefinedDataType

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284839.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 實例解釋面向對象編程中的接口隔離原則

在面向對象編程中&#xff0c;SOLID 是五個設計原則的首字母縮寫&#xff0c;旨在使軟件設計更易于理解、靈活和可維護。這些原則是由美國軟件工程師和講師羅伯特C馬丁(Robert Cecil Martin)提出的許多原則的子集&#xff0c;在他2000年的論文《設計原則與設計模式》中首次提出…

Appium同時運行多個設備

為了提高測試效率&#xff0c;測試需要同時在多個android設備上運行&#xff0c;就需要啟動多個appium。 啟動appium時&#xff0c;為每個設備設置不同的端口號&#xff0c;并為driver設置該設備的udid。見如下實例&#xff0c;關鍵是紅色部分 DesiredCapabilities capabilitie…

AI作畫的業界天花板被我找到了,AIGC模型揭秘 | 昆侖萬維

一、前景 1、AI和AIGC的關系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文縮寫為AI。它是研究、開發用于模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。 AIGC是繼 UGC、PGC 之后新型利用AI技術自動生成內容的生產…

【ArcGIS微課1000例】0022:ArcGIS點(點坐標)自動連成線操作案例教程

ArcGIS中,可以將帶三維坐標(X、Y、Z)的點/點集自動連成線,本文演示具體操作流程。 文章目錄 實戰演練GPS點數據下載實戰演練 打開ArcMap軟件,添加實驗文件夾0022下的GPS軌跡點.shp矢量點數據(文末提供下載地址),該數據是由GPS RTK采集的河道點數據,首先需要將GPS點坐…

微信公眾號 文章的爬蟲系統

差不多倆個星期了吧&#xff0c;一直在調試關于微信公眾號的文章爬蟲系統&#xff0c;終于一切都好了&#xff0c;但是在這期間碰到了很多問題&#xff0c;今天就來回顧一下&#xff0c;總結一下&#xff0c;希望有用到的小伙伴可以學習學習。 1、做了倆次爬蟲了&#xff0c;第…

[轉]關于C#操作WPS和office兼容性的問題

最近一直在做的開發是關于導出word的功能&#xff0c;一開始的做法是在VS中直接添加引用office PIA&#xff0c;Microsoft.Office.Interop.Word&#xff0c;VS08有兩個版本&#xff0c;V11和V12&#xff0c;V11對應的是office03&#xff0c;V12對應的office07&#xff0c;試驗之…

AI入門到進階到放棄

前些天&#xff0c;發現了一個比較好的AI學習網站&#xff0c;有很多數學基礎&#xff0c;也通俗易懂&#xff0c;我自己先記錄起來防止忘記&#xff0c;猛戳這里&#xff08;學習網站&#xff09;

OAuth認證與授權

什么是OAuth授權&#xff1f; 一、什么是OAuth協議OAuth(開放授權)是一個開放標準。允許第三方網站在用戶授權的前提下訪問在用戶在服務商那里存儲的各種信息。而這種授權無需將用戶提供用戶名和密碼提供給該第三方網站。OAuth允許用戶提供一個令牌給第三方網站&#xff0c;一個…

IO的多路復用

一、概念: 使單線程或者單進程同時監測若干個文件描述符具有執行的能力&#xff1b; 二、作用: 類似于多進程和多線程 三、必要性: 多線程或者多進程對資源需求較高 四、IO模型: 1.阻塞io 不設置的話系統默認 2.非阻塞io 在阻塞io的基礎上調整為不在阻塞狀態 用到的函數接口…

C# 禁用 全局快捷鍵

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/12558056.htmlC# 禁用 全局快捷鍵給軟件添加快捷鍵時&#xff0c;經常遇到其它軟件或者系統已設置的快捷鍵&#xff0c;導…

SegmentFault Hackathon 文藝復興

我有一個 idea&#xff0c;我想實現它&#xff0c;我正實現它&#xff0c;我已實現它。世界上存在一些好奇心旺盛、不愛墨守成規的人&#xff0c;略微偏執但又極度投入的他們崇尚自由&#xff0c;熱衷用技術實現自己的想法&#xff0c;他們帶著不羈的態度生活&#xff0c;利用編…

臥槽!VS Code 上竟然也能畫流程圖了???

作為一款開源的主流代碼編輯器&#xff0c;VSCode 在發布之后一直受到不少開發者的喜愛。 此前&#xff0c;我們也曾在公眾號上分享過多篇文章&#xff0c;向大家推薦了不少 VSCode 上比較實用&#xff08;或沙雕&#xff09;的插件。因此&#xff0c;有很多水友也經常調侃道&…

【QGIS入門實戰精品教程】14.1:QGIS如何加載各種在線地圖?

文章目錄 一、XYZ Tiles連接方式二、插件添加三、WMS/WMTS/OWS連接方式一、XYZ Tiles連接方式 1. 加載OpenStreetMap QGIS默認可以加載OpenStreetMap地圖。在左側點擊XYZ Tiles,默認下面有個OpenStreetMap選項,雙擊打右側會顯示地圖,如下圖所示: 在OpenStreetMap上右鍵→…

Oracle11g不能導出空表問題

ORACLE 11g 用exp命令導出庫文件備份時&#xff0c;發現只能導出來一部分表而且不提示錯誤&#xff0c;之前找不到解決方案只能把沒導出來的表重新建建立。后來發現是所有的空表都沒有導出來。于是想好好查查,因為在以前的10g版本中沒有這樣的問題。查資料發現Oracle 11g中有個…

SkiaSharp 之 WPF 自繪時鐘(案例版)

SkiaSharp是一個跨平臺2D圖形API&#xff0c;用于.NET平臺&#xff0c;基于Googles Skia Graphics庫(skia.org網站). 它提供了一個全面的2D API&#xff0c;可以跨移動、服務器和桌面模型來渲染圖像。該圖形庫可實現獲取指定坐標像素值、繪制2d圖形、繪制文字&#xff08;必須有…

推薦一簡單易用的腦圖制作工具

幕布是什么&#xff1f; 大綱文檔工具&#xff0c;管理你的大腦層級折疊文字&#xff0c;結構化思考助手一鍵轉換思維導圖并編輯&#xff0c;效率翻倍幕布可以做什么&#xff1f; 大綱筆記&#xff0c;思維整理 學習筆記清單工具 管理日程管理待辦購物清單等等內容創作會議記錄…

自動性能統計信息(三)(Automatic Performance Statistics)

1.3 管理自動工作負載庫&#xff08;AWR&#xff09;本節講述如何管理AWR&#xff0c;包含以下主題&#xff1a; 管理快照 管理基線 管理基線模板 傳輸自動工作負載庫數據 使用自動工作負載庫視圖 生成AWR報告 生成AWR對比報告 生成ASH報告 …

su: user tomcat does not exist

http://www.cnblogs.com/allegro/p/5005352.html 問題在于 你的startup.sh 里面設置了 用戶,你需要修改為root或者tomcat用戶 這是開發 遷移碰到的問題 test ".$TOMCAT_USER" . && TOMCAT_USERtomcat # Set JAVA_HOME to working JDK or JRE # JAVA_HOME/op…

【QGIS入門實戰精品教程】4.5:QGIS打開Excel中的點坐標,并生成矢量文件

QGIS中可以很方便添加Excel或其他文本格式的點坐標,并將其轉為矢量等多種格式的文件。 擴展閱讀: 【ArcGIS風暴】ArcGIS 10.2導入Excel數據X、Y坐標(經緯度、平面坐標),生成Shapefile點數據圖層 文章目錄 1. 數據準備2. 添加數據3. 保存文矢量文件1. 數據準備 本實驗使用…

[NOI2014]起床困難綜合癥

從高位往地位貪心即可 # include <bits/stdc.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 10);IL ll Read(){RG char c getchar(); RG ll x 0, z 1;for(;…