當前位置:首頁 » 編程語言 » sql中ctl是什麼
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql中ctl是什麼

發布時間: 2023-06-13 02:41:36

『壹』 oracle 中的 *.ctl 放的什麼東西呀

.ctl是控制文件
裡面有資料庫名,資料庫創建時間,數據文件、log文件位置,表空間信息,近期的備份信息等信息,官方文檔如下
控制文件是一個很小的二進制文件,用於記錄資料庫的物理結構。一個控制文件只屬於一個資料庫。創建資料庫時,創建控制文件。當資料庫的物理結構改變的時候,Oracle會更新控制文件。用戶不能編輯控制文件,控制文件的修改由Oracle完成。
資料庫的啟動和正常運行都離不開控制文件。啟動資料庫時,Oracle從初始化參數文件中獲得控制文件的名字及位置,打開控制文件,然後從控制文件中讀取數據文件和聯機日誌文件的信息,最後打開資料庫。資料庫運行時,Oracle會修改控制文件,所以,一旦控制文件損壞,資料庫將不能正常運行。
控制文件記錄的資料庫信息如下:
資料庫名稱(Database Name)
創建資料庫的時間戳
數據文件的名字及位置
聯機日誌文件的名字及位置
表空間信息
日誌歷史記錄(Log History)
歸檔日誌的信息
備份信息
當前的日誌序列號(Log Sequence Number)
校驗點信息(Checkpoint)

『貳』 SQL和Oracle的功能上有什麼區別

許多軟體公司都理解開發不依賴於特定資料庫類型(例如Oracle、SQL Server、DB2)的應用程序的重要性,它可以讓客戶們選擇自己習慣的平台。一般來說,軟體開發人員都能夠識別出他們的負責資料庫維護的客戶,和必須使用現有平台和個性化的客戶。

關於Oracle和SQL Server之間的區別,已經有很多篇文章從企業的角度和資料庫管理員的角度出發描寫了兩者之間的一般差別。在這篇文章裡面,我將會從應用程序的角度向你描述SQL erver 和oracle平台之間的區別,並且將會討論開發不依賴於資料庫環境的應用程序的幾種可能的方法。與此同時,我不會再論討對於應用程序來說,兩個平台之間顯而易見的區別,例如表的分割和索引。

定義通用介面和語言有很少的幾種通用語言和介面可以讓應用程序不依賴於資料庫,想來也可以以同樣的方式應用在關系型資料庫上面: ANSI是美國國家標准局定義的,這是一家志願者成員的組織(用私人基金運轉),他們在有關設備和程序等廣泛領域內開發了國家承認的標准。在資料庫領域, ANSI定義了編寫SQL命令的標准,假設命令可以運行在任何的資料庫上,而不需要更改命令的語法。ODBC是開放資料庫連接(ODBC)介面,微軟定義的,它可以讓應用程序訪問資料庫管理系統(DBMS)中的數據,使用SQL作為訪問數據的標准。ODBC允許最大的互聯性,這意味著一個單個的應用程序可以訪問不同的資料庫管理系統。然後,應用程序終端用戶可以添加開放資料庫連接(ODBC)資料庫驅動來將應用程序與他們所選擇的資料庫管理系統鏈接上。 OLE DB是ODBC的繼承者,是一組允許例如基於VB、C++、Access等任何可以連接到類似SQL Server、Oracle、DB2、MySQL等後台的「前台」的軟體組件。在許多種情況下,OLE DB組件都比原有的ODBC提供了好得多的性能。 JDBC(Java資料庫連接)應用程序介面是Java編程語言和廣泛范圍的資料庫,SQL資料庫和其他表列數據源(例如電子表格或者普通文本文件)之間,進行不依賴於資料庫的連接的行業標准。JDBD應用程序介面為基於SQL的資料庫訪問提供了調用級別的應用程序介面。真實世界中的通用介面不幸的是,並不是所有資料庫級別的命令都是ANSI,每個資料庫平台都有自己的擴展功能。對於ANSI或者通用介面,一般來說都代表著幾本功能,因此也可能意味著喪失了性能方面的競爭力。對於小型資料庫和小型應用程序來說,要維護對資料庫的通用訪問是簡單的,但是當資料庫和/或應用程序變得越來越大,越來越復雜,你就不得不向代碼中添加功能。

SQL Server和Oracle的常用函數對比

---------數學函數

1.絕對值
S:select abs(-1) value
O:select abs(-1) value from al

2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al

3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al

4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al

5.四捨五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346

6.e為底的冪
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182

7.取e為底的對數
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1

8.取10為底對數
S:select log10(10) value 1
O:select log(10,10) value from al; 1

9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16

10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2

11.求任意數為底的冪
S:select power(3,4) value 81
O:select power(3,4) value from al 81

12.取隨機數
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;

13.取符號
S:select sign(-8) value -1
O:select sign(-8) value from al -1

----------三角函數相關

14.圓周率
S:SELECT PI() value 3.1415926535897931
O:不知道

15.sin,cos,tan 參數都以弧度為單位
例如:select sin(PI()/2) value 得到1(SQLServer)

16.Asin,Acos,Atan,Atan2 返回弧度

17.弧度角度互換(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度

---------數值間比較

18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a

O:select greatest(1,-2,4,3) value from al

19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a

O:select least(1,-2,4,3) value from al

20.如何處理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl

--------字元串函數

21.求字元序號
S:select ascii('a') value
O:select ascii('a') value from al

22.從序號求字元
S:select char(97) value
O:select chr(97) value from al

23.連接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al

23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al

23.模糊子串的位置 --返回2,參數去掉中間%則返回7
// 本文轉自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=996&d=dwn1rn
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle沒發現,但是instr可以通過第四個參數控制出現次數
select INSTR('sdsfasdqe','sd',1,2) value from al 返回6

24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al

25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al

26.子串全部替換
S:Replace
O:select Translate('fasdbfasegas','fa','我' ) value from al

27.長度
S:len,datalength
O:length

28.大小寫轉換 lower,upper

29.單詞首字母大寫
S:沒發現
O:select INITCAP('abcd dsaf df') value from al

30.左補空格(LPAD的第一個參數為空格則同space函數)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al

31.右補空格(RPAD的第一個參數為空格則同space函數)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al

32.刪除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim

33. 重復字元串
S:select REPLICATE('abcd',2) value
O:沒發現

34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
返回0-4,4為同音,1最高

--------------日期函數

35.系統時間
S:select getdate() value
O:select sysdate value from al

36.前後幾日
直接與整數相加減

37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al

38.求時間
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al

39.取日期時間的其他部分
S:DATEPART 和 DATENAME 函數 (第一個參數決定)
O:to_char函數 第二個參數決定

參數---------------------------------下表需要補充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O無效)
dayofyear dy, y (O表星期)
day dd, d (d O無效)
week wk, ww (wk O無效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S無效)
minute mi, n (n O無效)
second ss, s (s O無效)
millisecond ms (O無效)
----------------------------------------------

40.當月最後一天
S:不知道
O:select LAST_DAY(sysdate) value from al

41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

42.字元串轉時間
S:可以直接轉或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

43.求兩日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用兩個日期相減(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

44.根據差值求新的日期(比如分鍾)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;

45.求不同時區時間
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

-----時區參數,北京在東8區應該是Ydt-------
AST ADT 大西洋標准時間
BST BDT 白令海標准時間
CST CDT 中部標准時間
EST EDT 東部標准時間
GMT 格林尼治標准時間
HST HDT 阿拉斯加—夏威夷標准時間
MST MDT 山區標准時間
NST 紐芬蘭標准時間
PST PDT 太平洋標准時間
YST YDT YUKON標准時間

Oracle支持的字元函數和它們的Microsoft SQL Server等價函數:

函數 Oracle Microsoft SQL Server
把字元轉換為ASCII ASCII ASCII
字串連接 CONCAT (expression + expression)
把ASCII轉換為字元 CHR CHAR
返回字元串中的開始字元(左起) INSTR CHARINDEX
把字元轉換為小寫 LOWER LOWER
把字元轉換為大寫 UPPER UPPER
填充字元串的左邊 LPAD N/A
清除開始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字元串中的起始模式(pattern) INSTR PATINDEX
多次重復字元串 RPAD REPLICATE
字元串的語音表示 SOUNDEX SOUNDEX
重復空格的字串 RPAD SPACE
從數字數據轉換為字元數據 TO_CHAR STR
子串 SUBSTR SUBSTRING
替換字元 REPLACE STUFF
將字串中的每個詞首字母大寫 INITCAP N/A
翻譯字元串 TRANSLATE N/A
字元串長度 LENGTH DATELENGTH or LEN
列表中最大的字元串 GREATEST N/A
列表中最小的字元串 LEAST N/A
如果為NULL則轉換字串 NVL ISNULL

日期函數

函數 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
當前日期和時間 SYSDATE GETDATE()
一個月的最後一天 LAST_DAY N/A
時區轉換 NEW_TIME N/A
日期後的第一個周日 NEXT_DAY N/A
代表日期的字元串 TO_CHAR DATENAME
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截斷 TRUNC CONVERT
字元串轉換為日期 TO_DATE CONVERT
如果為NULL則轉換日期 NVL ISNULL

轉換函數

函數 Oracle Microsoft SQL Server
數字轉換為字元 TO_CHAR CONVERT
字元轉換為數字 TO_NUMBER CONVERT
日期轉換為字元 TO_CHAR CONVERT
字元轉換為日期 TO_DATE CONVERT
16進制轉換為2進制 HEX_TO_RAW CONVERT
2進制轉換為16進制 RAW_TO_HEX CONVERT

其它行級別的函數

函數 Oracle Microsoft SQL Server
返回第一個非空表達式 DECODE COALESCE
當前序列值 CURRVAL N/A
下一個序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用戶登錄賬號ID數字 UID SUSER_ID
用戶登錄名 USER SUSER_NAME
用戶資料庫ID數字 UID USER_ID
用戶資料庫名 USER USER_NAME
當前用戶 CURRENT_USER CURRENT_USER
用戶環境(audit trail) USERENV N/A
在CONNECT BY子句中的級別 LEVEL N/A

合計函數

函數 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP

Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)

『叄』 CLI CLR CTL的全稱與作用分別是什麼

編輯詞條 C++/CLI 什麼是C++/CLI呢?C++當然指的是Bjarne Stroustrup在BELL實驗室發明的C++語言,它實現了運行時取得速度和尺寸最佳化的靜態對象模型,然而它除了堆分配外不支持程序的動態修改,它准許無限地接近底層設備,但在程序運行過程中幾乎無法操作活動類型,也無法操作與程序相關聯的底層結構。Herb Sutter,C++/CLI的主要構造者之一,稱C++是一門「混凝土」式的語言。
CLI指的是通用語言結構,一種支持動態組件編程模型的多重結構,在許多情況下,這代表了一個與C++對象模型完全顛倒了的模式。一個時實的軟體層,有效地執行系統,在底層操作系統與程序之間運行。操作底層的設備受到一定的限制,操作執行程序中的活動類型及與程序相關聯的下部結構得到了支持。反斜杠(/)代表C++和CLI的捆綁,這個捆綁帶來的細節問題是本文主要討論的問題。
所以,「什麼是C++/CLI」問題的最初、最接近答案是:它是靜態C++對象模型到CLI的動態組件對象編程模型的捆綁。簡而言之,它就是你如何用C++在.NET中編程,而不是C#或Visual Basic.NET。象C#和CLI本身一樣,C++/CLI正在ECMA(歐洲計算機製造商協會)主持下進行標准化,以最終符合ISO標准。
實時通用語言(CLR)是CLI的微軟版本,它非常適用於微軟的Windows操作系統,相似地,Visual C++2005是C++/CLI的實現。
作為第二個近似的答案,我認為C++/CLI是.NET編程模式與C++的結合,正如以前將模板與C++結合起來產生的泛型編程。所有這種結合中,企業所擁有的C++的投資以及開發人員使用C++的經驗將得到保存,而這恰恰是使用C++/CLI進行開發的重要基礎。
學習C++/CLI的方法
在設計C++/CLI語言中涉及三個方面問題,這同樣貫徹於所有的其他程序開發語言:一是語言級的語法向底層通用類型系統(簡稱CTS)的映射;二是向程序開發人員提供的CLI的底層細節結構的級別選擇;三是超越CLI的直接支持,提供額外的功能性函數的選擇。
第一條對於所有的CLI語言來說都大致相同,第二條和第三條對於不同的CLI語言來說是不同的,相互區別的。根據你需要解決什麼樣的問題,你將選擇這種或那種語言,也有可能混合使用多種CLI語言。學習C++/CLI涉及到了解它在設計過程中的所有這些涉及方面。
從C++/CLI到CTS的映射?
使用C++/CLI編程時間了解底層的CTS非常重要。CTS包括以下三種常用類的類型:
1、多態引用類型,這正是對於所有繼承類所要使用的。
2、非多態值類型,這用於實時高效的具體類型,例如數值類型。
3、抽象的介面類型,這用於定義一個操作集,也可以用於實現介面的引用或值類型集合。
這個設計方面的問題,即將CTS映射到語言內建的數據類型集合,通常同樣貫穿於所有的CLI語言,雖然不同的CLI語言語法不同。所以,在C#中你可能這么寫:
abstract class Shape { ... } // C#
來定義了一個Shape基類,從該類將導出幾何對象,然而在C++/CLI你將這么寫:
ref class Shape abstract { ... }; // C++/CLI
上述代碼說明了底層的C++/CLI引用類型。這兩種聲明在內層代表的意思是一樣的。相似地,在C#中你這么寫:
struct Point2D { ... } // C#
來定義一個具體的Point2D 類,然而在C++/CLI中這么寫:
value class Point2D { ... }; // C++/CLI
C++/CLI支持的類型集合代表了CTS與本地設備的綜合,這決定了你的語法選擇,例如:
class native {};
value class V {};
ref class R {};
interface class I {};
CTS也支持與本地列舉類型稍微不同的列舉類類型。當然,對於上述兩者CTS是都支持的。例如:
enum native { fail, pass };
enum class CLIEnum : char { fail, pass};
相似地,CTS支持它本身的數組類型,並且它再一次將其與本地數組在行為上區分開來。同時,微軟再次為這兩種類型提供了支持。
int native[] = { 1,1,2,3,5,8 };
array<int>^ managed = { 1,1,2,3,5,8 };
那種認為一種CLI語言比其他CLI語言在向底層的CTS映射中表現的更出色或更完美都是不確切的,相反,每種不同的CLI語言代表著對CTS底層對象模型的不同理解,在下一節你將更清楚地看到這一點。
CLI的細節
設計一個CLI語言時第二個必須要考慮的問題是將CLI的底層執行模式融入到語言的細節級別。這種語言用於解決什麼問題?這種語言是否有必須的工具來解決這些問題?這種語言可能吸引什麼樣的程序開發人員?
例如,值類型存在於託管堆上,在很多情況下值類型可以看到它們自身的存在。
1、通過隱含的加箱操作,當一個值類型的實例被分配給一個對象或當一個虛擬的方法通過一個值類型來調用;
2、當這個值類型被當作應用引用類類型的成員時;
3、當這個值類型 被當作CLI數組成員時;
需要指出的是,這種情況下開發人員是否被允許操作值類型的地址是CLI語言設計時必須應該予以考慮的問題。
存在的問題
在垃圾收集器掃描緊縮狀態下,位於託管堆上的任何對象非常可能面對重新定位問題。指向對象的指針可以實時跟蹤並修改。開發人員不能自己手動跟蹤,所以,如果你獲許取得一個可能位於託管堆上的值類型的地址時,除了本地指針外,還需要有一個跟蹤形態的指針。
銷售商考慮的是什麼?那就是需要簡單和安全,在語言中直接提供跟蹤一個對象或集合的指針使語言復雜化,沒有這種支持,將減少復雜程度,可資利用的、潛在的程序開發人群可能會增加,此外,准許程序開發人員操作生命短暫的值類型,增加了錯誤產生的可能性,程序開發人員可能有意無意地對內存進行錯誤操作,不支持跟蹤指針,一個潛在的更安全地實時環境產生了。
另一方面,效率和靈活性也是必須考慮的一個問題,每一次向同一個對象分配值類型時,一個全新的數值加箱操作發生了,准許存取加箱值類型允許在內存中進行更新,這可能在性能上產生了一個非常巨大的進步。沒有跟蹤形態的指針,你無法用指針演算法重新聲明一個CLI數組,這意味著CLI數組不能使用標准模板庫進行重新聲明,也不能使用一般的演算法。准許操作加箱數值使設計具有更大地靈活性。
微軟在C++/CLI中選擇地址集合模式來處理託管堆上的值類型。
int ival = 1024;
int^ boxedi = ival;
array<int>^ ia = gcnew array<int>{1,1,2,3,5,8};
interior_ptr<int> begin = &ia[0];
value struct smallInt { int m_ival; ... } si;
pin_ptr<int> ppi = &si.m_ival;
典型地C++/CLI開發人員是一個復雜的系統程序員,承擔著提供下層內部構造和有組織的應用程序的任務,而這些恰恰是未來商業發展的基礎。C++/CLI開發人員必須兼顧可測量性和可執行性,所以必須在系統的高度級上來看待CLI下層結構。CLI細節水平反映了開發人員的臉色。
復雜性本身並不代表對質量的否定,人類比單細胞細菌復雜的多,這當然不是一件壞事,然而,當表達一個簡單的概念變的復雜化後,這常常被認為是一件壞事。在C++/CLI中,CLI開發團隊已經試著提供一種精巧的方法來表達方式一個復雜的事情。
額外增加的功能
第三個設計方面是特定功能性的語言層,它遠遠超過CLI所提供的直接支持,雖然這可能需要在語言層支持和CLI底層執行模式間建立一個映射。但在某些情況下,這恰恰是不可能的,因為語言無法調節CLI的行為。這種情況的例子就是在基類的構造及析構函數中定義虛函數。根據ISO-C++在這種情況下的語言學,需要用每一個基類的構造和虛構函數重新設置虛擬表,而這是不可能的,因為虛擬表句柄是實時管理的,而不是某一個語言來管理。
所以,這個設計方面是在完美性和可行性之間的妥協產物,C++/CLI提供的額外功能主要表現在三個方面:
1、獲取資源的一種形式是對於引用類型的初始化,此外,提供一種自動化工具,用於佔用較少資源、所謂的可確定性自動消亡的垃圾收集類型對象。
2、一種深度拷貝形式的語法與C++拷貝構造函數和拷貝分配操作符相一致,但其並不適用與值類型。
3、除了最初的一般性CLI機制外,還有對於CTS類型的C++模板直接支持。這些是我第一篇文章中討論的主題。此外,還提供了針對CLI類型的可校驗STL版本。
讓我們來看一個簡單的例子,一個確定性消亡問題。在垃圾搜集器重新聲明一塊與對象相關聯的內存之前,一個相關的消亡方法,如果存在的話,將被調用。你可以認為這種方法是超級析構函數,因為它與對象的程序生命期無關。這就叫做終結。終結函數是否調用以及什麼時間調用都沒有明確規定,這就是垃圾收集器的非確定性終結。
在動態內存管理的情況下,非確定性終結工作非常好,當可用內存變的越來越少時,垃圾收集器介入並開始著手解決問題。然而,非決定性終結也有工作不好的時候,當一個對象維護一個重要資源,例如一個資料庫連接、鎖定某些類別、或者可能是本地的堆內存。在這種情況下,只要是不需要,應立即釋放資源。目前CLI所支持的解決問題的方法是,對於一個類通過執行IDisposable介面提供的Dispose方法釋放資源。這里的問題是執行Dispose方法需要一個清晰的聲明,所以它也就不可能存在調用。
最基本的C++中的設計模式是上述的通過初始化來獲取資源,這意味著類使用構造函數來獲取資源,相反,類使用析構函數來釋放資源。這些行為由類對象在生存期內自動管理。
下面是引用類釋放資源時所做的順序動作:
1、 首先使用析構函數來封裝所有與釋放類有關的資源時所必須的代碼;
2、 析構函數自動調用後,結束類對象的生命期。
對於引用類型來說,CLI沒有類析構函數的概念,所以析構函數不得不映射為在底層執行的其它代碼。此時,在內部,編譯器執行以下操作:
1、 類讓其基類列表繼承自IDisposable介面;
2、 析構函數轉換成IDisposable的Dispose方法。
以上實現了目標的一半,一種實現析構造函數自動調用的方法仍然需要,對於引用類型,一種特殊的基於棧的符號得到支持,也就是說,一個對象的生命期與它的聲明範圍有關。在內部,編譯器將符號轉換為在託管堆上分配引用對象。隨著作用域的終結,編譯器插入一個Dispose方法-用戶定義的析構函數。與對象有關的內存的收回在垃圾收集器的控制下得到執行。
C++/CLI並不是將C++拓展到一個託管的世界,更確切的說,它代表一個完全綜合的範例,某種程度上就象當初將泛編程模式和多重繼承綜合進該語言一樣。我認為C++/CLI開發小組做了一項非常卓有成效的工作。
小結
C++/CLI代表託管和本地編程的結合。在反復過程中,這種綜合已經通過源級相對獨立但又相互平等地組件和二進制元素得到了完成,包括混合模式(本地和CTS類型的源級混合,還有一個本地及CLI對象文件的二進制混合),純模式(本地和CTS類型的源代碼級混合,所有的都被編譯為CLI對象文件),本地分類(可以通過一個特定的打包類來保持CTS類型),和CTS分類(可以保持本地類型為指針)。
當然,C++/CLI開發人員也可以單獨使用CLI類型來編程,並通過這種方式來提供伺服狀態下的可校驗代碼,例如可以作為SQL Server2005的一個SQL存儲過程。
現在,還是回到這個問題上來,什麼是C++/CLI?它是進行.NET編程模式的最佳切入點。對於C++/CLI,有一個來自C++的遷移路徑,它不僅包含C++的底層基礎,而且也需要C++編程經驗,對於這些,我感到非常滿意。
C++/CLI(CLI:Common Language Infrastructure)是一門用來代替C++託管擴展(下文使用MC++指代)新的語言規范。重新簡化了C++託管擴展的語法,提供了更好的代碼可讀性。和微軟.NET的其他語言一樣,微軟向ECMA提交了C++/CLI的標准。C++/CLI現在可以在Visual C++ 2005上開發。C++/CLI的部分特性已經申請了專利。
1 語法改變
C++/CLI是一門獨立的語言(比如新的關鍵字),而不是像C++託管擴展一樣是C++的超集 (C++託管擴展有一些不標志的關鍵字如__gc和__value)。所以,C++/CLI對於這些語法有較大的改變,尤其是去除了一些意義不明確的關鍵字,增加了一些.NET的特性.
很多不一致的語法,像MC++的不同版本用法的操作符new()被區分開:在C++/CLI,.NET引用類型的創建要使用新的關鍵字gcnew。並且C++/CLI增加了新的泛型概念(與C++ templates相似,但還是有很大的區別)。
1.1 句柄(Handle)
回到MC++,有兩類指針: 用__nogc標識的指針是傳統意義上的C++指針,而用__gc標識的指針為.NET中的引用。但在C++/CLI里,唯一的指針就是傳統意義上的C++指針,而.NET引用類型使用一個「句柄」來獲取,使用新的語法「類名^」代替了MC++的「類名*」。新的句法使得託管和非託管代碼混合開發更加方便;它指明了對象將會被垃圾回收器自動銷毀還是手動銷毀。
範例代碼:
// C++託管擴展
#using <mscorlib.dll>
using namespace System::Collections;
__gc class referencetype
{
protected:
String* stringVar;
int intArr __gc[];
ArrayList* doubleList;
public:
referencetype(String* str,int* pointer,int number) // 哪個是託管的?
{
doubleList = new ArrayList();
System::Console::WriteLine(str->Trim() + number.ToString());
}
};
// C++/CLI
#using <mscorlib.dll>
using namespace System::Collections::Generic;
ref class referencetype
{
protected:
String^ stringVar;
array<int> intArr;
List<double>^ doubleList;
public:
referencetype(String^ str,int* pointer,int number) // 不會再分不清了吧?
{
doubleList = gcnew List<double>();
System::Console::WriteLine(str->Trim() + number);
}
};
1.2 跟蹤引用(Tracking reference)
C++/CLI里的一個「跟蹤引用」也是一個句柄,但它是傳地址而不是傳值。等同於在C#中加了「ref」關鍵字,或Visual Basic .NET的「ByRef」。C++/CLI使用「^%」語法來定義一個跟蹤引用。與傳統C++中的「*&」語法相似。
下面的示例了「跟蹤引用」的使用。如果把「^%」改成「^」(也就是使用普通的句柄),10個字元串將不會被修改,而只會生成那些字元串的副本,這些都是因為那些引用已經不是傳地址而是傳值。
int main()
{
array<String^>^ arr = gcnew array<String^>(10);
int i = 0;
for each(String^% s in arr)
s = gcnew String(i++.ToString());
return 0;
}
上面的代碼示例了用戶如何用C++/CLI做一些其他.NET語言不能做的事情,比如C#就不允許在foreach循環中這樣做。例如foreach(ref string s in arr)在C#中是非法的。
1.3 析構(Finalizer/Destructor)
C++/CLI的另一個變化就是使用「!類名()」來聲明一個託管類型的「析構方法」(在垃圾回收器回收對象之前的不確定的時間由CLR調用),而原來的「~類名()」是用來定義「傳統的析構函數」(能被用戶自己調用)。另外,下面的例子說明了如何在C++/CLI中託管對象如何自動調用「傳統析構函數」。
在一個典型的.NET程序中(例如直接使用CIL)編程,可以由用戶自己調用的「析構方法」是用實現IDisposable介面,通過編寫Dispose方法來實現顯式釋放資源;而不確定的「析構方法」是通過重載Finalize函數來實現的。
// C++/CLI
ref class MyClass // :IDisposable (編譯器自動實現IDisposable介面)
{
public:
MyClass(); // 構造函數
~MyClass(); // (確定的) 析構函數 (編譯器使用IDisposable.Dispose來實現)
protected:
!MyClass(); // 析構方法 (不確定的) (編譯器通過重載virtual void Finalize來實現)
public:
static void Test()
{
MyClass auto; // 這不是個句柄,它將調用MyClass的默認構造函數
// 使用auto對象
// 函數返回前自動調用auto的析構函數(IDisposable.Dispose,由~MyClass()定義)來釋放資源
// 以上代碼等效於:
MyClass^ user = gcnew MyClass();
try { /* 使用auto對象 */ }
finally { delete user; /* 由編譯器調用auto.Dispose() */ }
}
};
// C#
class MyClass : IDisposable
{
public MyClass() {} // 構造函數
~MyClass() {} // 析構方法 (不確定的) (編譯器通過重載virtual void Finalize來實現),與C++/CLI的!MyClass()等效
public void Dispose() {} // Dispose方法
public static void Test()
{
using(MyClass auto = new MyClass())
{ /* 使用auto對象 */ }
// 因為使用了using句法,編譯器自動調用auto.Dispose()
// 以上代碼等效於:
MyClass user = new MyClass();
try { /* 使用user對象 */ }
finally { user.Dispose(); }
}
}編輯詞條 CLR CLR(公共語言運行庫,Common Language Runtime)和Java虛擬機一樣也是一個運行時環境,它負責資源管理(內存分配和垃圾收集),並保證應用和底層操作系統之間必要的分離。
為了提高平台的可靠性,以及為了達到面向事務的電子商務應用所要求的穩定性級別,CLR還要負責其他一些任務,比如監視程序的運行。按照.NET的說法,在CLR監視之下運行的程序屬於「受管理的」(managed)代碼,而不在CLR之下、直接在裸機上運行的應用或者組件屬於「非受管理的」(unmanaged)的代碼。
CLR將監視形形色色的常見編程錯誤,許多年來這些錯誤一直是軟體故障的主要根源,其中包括:訪問數組元素越界,訪問未分配的內存空間,由於數據體積過大而導致的內存溢出,等等。
然而,這種對受管理代碼的運行監視是有代價的。雖然當前還不可能精確地得到監視程序運行所需要的開銷,但從當前Beta測試版的性能表現來看,正如Microsoft所承認的那樣,我們可以預料由它導致的性能降低程度至少達到10%。當然,如果監視程序運行能夠將穩定性和可用性提高到一個新的檔次,我們可以懷疑10%的性能降低是否還可以稱為一件壞事……
在處理器性能改善方面,摩爾定律已經一再被證明是正確的。既然如此,我們要得到一台性能增加了10%的伺服器要等待多長時間呢、
單片機 匯編 指令:CLR C//C狀態清零單片機 匯編 指令:CLR C//C狀態清零
另有:CLR 公用語言運行時 Common Language Runtime
.NET提供了一個運行時環境,叫做公用語言運行時(Common Language Runtime),是一種多語言執行環境,支持眾多的數據類型和語言特性。他管理著代碼的執行,並使開發過程變得更加簡單。這是一種可操控的執行環境,其功能通過編譯器與其他工具共同展現。
依靠一種以運行時為目標的編譯器開發的代碼叫做可操控代碼。
元數據:為了使運行時環境可以向可操控代碼提供服務,語言編譯器需要產生一種元數據,它將提供在使用語言中的類型、成員、引用的信息。運行時環境使用元數據定位並載入類,在內存中展開對象實例,解決方法調用,產生本地代碼,強制執行安全性,並建立運行時環境的邊界。
可操控執行的含義:對象在執行的過程中完全被運行時環境所控制。運行時環境提供以下服務:自動內存管理、調試支持、增強的安全性及與非可操控性代碼的互操作性。條件:1、選擇以運行時為目標的語言編譯器,如VB、C#;2、在組件的輸出類型中使用CLR要求的語言特性。
CLR生化技術介紹
CLR生物處理技術是我司聯合中山大學基於生物接觸氧化法、UNITANK、CASS處理方法的基礎上並結合我司CLR生物復合菌技術而研發成功的專有技術。CLR生物復合菌是綜合了國內外先進技術,採用高科技手段,將自然水體中有益的微生物,通過特殊的設備分離、提純、培殖馴化、濃縮後配製成高活性、高濃度、多組合的固劑或水劑貯存。CLR生物處理技術是利用環境微生物處理技術組合成的一種高效污水生化處理技術。它由微生物復合菌群及載體等組成,並配與嚴格的供氧量,其主要是通過人工強化技術,將我公司培殖的CLR復合菌群一次性引入到污水處理系統內,系統內設有特殊的CLR-TL生物載體(也稱生物床),便於微生物快速結膜繁衍生存。在一定曝氣供氧條件下生物載體上逐漸形成菌群生物膜,利用其新陳代謝作用吸附、消化、分解污水中的有機污染物,使之轉化為穩定的無害化物質,達到凈化水質的目的。
CLR生化技術主要特點如下:
①、池內單位容積的生物固體量都高於活性污泥法曝氣池及生物濾池,因此,其具有較高的容積負荷,最高可達到2.0 kgCOD/(m3·d);
②、CLR生化池內培養的是我司專有的CLR生物復合菌,處理效果顯著,也不存在污泥膨脹問題,運行管理簡便;
③、CLR生化池由於兼有活性污泥法和生物膜法的特點,因此,單位體積內有較高的微 生物量,使得該工藝具有一定的抗沖擊能力;
④、污泥產量較少。
CLR工藝技術討論區
氧化溝(Qxidation Ditch)稱為連續式反應池(Continuous Loop Reactor),簡稱CLR,最早是由帕斯維爾(A.Psaveer)博士設計,於1954年在荷蘭沃紹本建造並投入使用。之後,相繼成為歐洲、大洋洲、南非和北美洲的一種重要污水處理技術。到目前為止,西方國家已經建造了近1500座氧化溝。七十年代末,氧化溝技術進入我國,並引起環保界的極大興趣。根據氧化溝的處理機理,研究開發了多種型式的氧化溝工藝,如卡魯塞爾(Carroussel)型、奧伯爾(Orbal)型、射流曝氣式、導管式、一體化式等多種形式的氧化溝。
DE型氧化溝
DE型氧化溝是丹麥克魯格公司在間歇運行的氧化溝基礎上發展的一種新型的氧化溝。在運行穩定可靠的前提下,操作更趨靈活方便。DE型氧化溝為雙溝半交替工作式氧化溝系統,具有良好的生物除氮功能。它與D型、T型氧化溝的不同之處是二沉池與氧化溝分開,並有獨立的污泥迴流系統。兩個氧化溝相互連通,串聯運行,交替進水。溝內設雙速曝氣轉刷,高速工作時曝氣充氧,低速工作時只推動水流,基本不充氧,使兩溝交替處於厭氧和好氧狀態,從而達到脫氮的目的。若在DE氧化溝前增設一個缺氧段,可實現生物除磷,形成脫氮除磷的DE型氧化溝工藝。
Carrousel氧化溝是由荷蘭DHV技術咨詢公司在六十年代後期發明的,當時開發這一工藝的主要目的是尋求一種渠道更深、效率更高和機械性能更好的系統設備來改善和彌補當時流行的轉刷式氧化溝的技術特點。
與其它池型氧化溝相比,其最大的特點是採用特殊設計的立式低速表曝機作曝氣設備,由於曝氣設備的不同(區別於其它水平軸式曝氣裝置),使污水在混合曝氣充氧的同時具有泵的局部水力提升作用,使混合液和原水得到徹底的混合。
奧貝爾氧化溝由三個相對獨立的同心橢園形溝道組成,污水由外溝道進入溝內,然後依次進入中間溝道和內溝道,最後經中心島流出,至二次沉澱池。三個環形溝道相對獨立,溶解氧分別控制在0、1、2 mg/l,其中外溝道容積達50%~60%,處於低溶解氧狀態,大部分有機物和氨氮在外溝道氧化和去除。內溝道體積約為10%~20%,維持較高的溶解氧(2mg/l),為出水把關。在各溝道橫跨安裝有不同數量轉碟曝氣機,進行供氧兼有較強的推流攪拌作用。
奧貝爾氧化溝除具備一般氧化溝的優點:流程簡單、抗沖擊負荷能力強、出水水質穩定和易於維護管理。
3.細胞毒性T淋巴細胞 細胞毒性T淋巴細胞(cytotoxic lymphocyte,CTL)是白細胞的亞部,為一種特異T細胞,專門分泌各種細胞因子參與免疫作用。對某些病毒、腫瘤細胞等抗原物質具有殺傷作用,與自然殺傷細胞構成機體抗病毒、抗腫瘤免疫的重要防線。
殺傷機制:
1.釋放穿孔素,顆粒酶殺傷靶細胞。
2.通過Fasl介導靶細胞的凋亡。
作用特點:
1.可連續殺傷靶細胞,具有高效性
2.具有抗原特異性
3.具有自身MHC限制性
Coal-to-liquids(CTL),煤制油,由煤炭氣化生產合成氣、再經費-托合成生產合成油稱之為煤炭間接液化技術。

2.