C# Oracle資料庫連線及操作
1、 將光碟放入光碟機,自動彈出安裝介面,選擇開始安裝;
2、 歡迎:下一步;
3、 檔案定位,所有內容預設,如果更改oracle安裝路徑,在目標路徑中進行更改,下一步;
4、 可用產品:伺服器端選擇第一個Oracle8i Enterprise Edition 8.1.7.0.0,客戶端選擇第二個Oracle8i Client8.1.7.0.0 下一步;
5、 安裝型別:選擇典型(779MB),下一步;
6、 資料庫標識:全域性資料庫名:ORA817,SID:ORA817,下一步
7、 摘要:安裝
8、 開始安裝…………………….等待
9、 安裝進度完成後,開始自動配置並啟動資料庫,繼續等待
當彈出下面對話方塊時,表明ORACLE安裝成功
確定並退出
一、登陸ORACLE
開始—>程式—> Oracle-OraHome81—> Database Administration—> DBA Studio
預設,以獨立模式啟動DBAStudio,點選確定登陸
登陸後,在左面的樹形結構中雙擊我們建立的全域性資料庫名稱,在此為ORA817,登陸使用者為internal,口令為oracle,不區分大小寫。
二、建立表空間
在左面的樹形結構裡,選擇儲存—>表空間,然後點選右鍵,選擇建立,在右面彈出建立表空間的的對話方塊,名稱為JNJWD
三、建立使用者
建立完表空間後,繼續點選左面的樹形結構,選擇安全性—>使用者,然後點選右鍵,選擇建立,在右面的一般資訊視窗中填寫名稱:JNJWD,口令:JNJWD,表空間預設值選擇JNJWD,切換至角色視窗,配置角色,雙擊DBA和RESOURCE至下面角色清單中
開始—>程式—> Oracle-OraHome81—> Network Administration—> Net8 Assistant
開啟Net8後,選擇本地—>服務名稱,點選右面的綠色加號,建立服務名,彈出嚮導,在網路服務名中輸入JCJXGL,點選下一步
選擇TCP/IP網路協議,點選下一步
在協議設定中,填寫伺服器主機名:伺服器的計算機名或IP地址,埠號預設1521不變,點選下一步
在服務設定中,選擇通過SID連線伺服器,伺服器SID為ORA817,Oracle8i連線型別為預設資料庫,預設不變,點選下一步,點選測試彈出測試對話方塊,預設使用者為SCOTT,點選更改登陸,用我們建立的JNJWD使用者及口令登陸。測試連線成功,返回並點選完成
匯入\匯出資料庫:
開始—>執行cmd,開啟命令提示符狀態
匯出:EXP JNJWD / JNJWD FILE= JNJWD.DMP回車
匯入:IMP JNJWD / JNJWD FROMUSER= JNJWDFILE= JNJWD.DMP
注意:匯出資料庫時,匯出檔案將儲存在當前提示符前的目錄中,匯入資料時,首先檢查資料檔案是否在當前目錄,否則先進檔案所在路徑,然後執行匯入命令,或者在檔名前直接加上目錄
軟體環境:
1、Windows2000+ORACLE 8.1.7
2、ORACLE安裝路徑為:C:\ORACLE
實現方法:
1、 開始->設定->控制面板->管理工具->服務
停止所有Oracle服務。
2、 開始->程式->Oracle - OraHome81->Oracle InstallationProducts->
Universal Installer
卸裝所有Oracle產品,但Universal Installer本身不能被刪除
5、 執行regedit,選擇HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del鍵刪除這個入口。
6、 執行regedit,選擇HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滾動
這個列表,刪除所有Oracle入口。
7、 執行refedit,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,
刪除所有Oracle入口。
8、 開始->設定->控制面板->系統->高階->環境變數
刪除環境變數CLASSPATH和PATH中有關Oracle的設定
9、 從桌面上、STARTUP(啟動)組、程式選單中,刪除所有有關Oracle的組和圖示
10、 刪除\ProgramFiles\Oracle目錄
11、 重新啟動計算機,重起後才能完全刪除Oracle所在目錄
12、 刪除與Oracle有關的檔案,選擇Oracle所在的預設目錄C:\Oracle,刪除這個入
口目錄及所有子目錄,並從Windows 2000目錄(一般為C:\WINNT)下刪除以下文
件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。
13、WIN.INI檔案中若有[ORACLE]的標記段,刪除該段
14、 如有必要,刪除所有Oracle相關的ODBC的DSN
15、 到事件檢視器中,刪除Oracle相關的日誌
說明:
如果有個別DLL檔案無法刪除的情況,則不用理會,重新啟動,開始新的安裝,
安裝時,選擇一個新的目錄,則,安裝完畢並重新啟動後,老的目錄及檔案就可以刪除掉了。
(t114)
在Windows NT/2000下清除Oracle8i執行環境(重新安裝前的準備工作):
1. 刪除Oracle8i登錄檔:
regedit.exe => HKLM => Software => ORACLE
2. 刪除Oracle8i服務:
regedit.exe => HKLM => System => CurrentControlset => Services=> 以Oracle開頭的服務
3. 刪除Oracle8i事件日誌:
regedit.exe => HKLM => System => CurrentControlset => Services=> Eventlog => Application => 以Oracle開始的事件
4. 刪除Windows NT/2000安裝磁碟\Program Files\Oracle目錄。
5. 刪除Oracle8i環境變數
控制面板 => 系統 => 高階 => 環境變數
(1) 刪除CLASSPATH
(2) 編輯PATH,將其中與Oracle有關係的路徑刪除。
6. 刪除Oracle8i選單
7. 重新啟動Windows NT/2000,停止服務。
8. 刪除Oracle8i主目錄。
伍、Oracle資料庫體系結構
Oracle資料庫的體系結構包括四個方面:資料庫的物理結構、邏輯結構、記憶體結構及程序。
1. 物理結構
物理資料庫結構是由構成資料庫的作業系統檔案所決定,Oracle資料庫檔案包括:
資料檔案(DataFile)
資料檔案用來儲存資料庫中的全部資料,例如資料庫表中的資料和索引資料.通常以為*.dbf格式,例如:userCIMS.dbf 。
日誌檔案(RedoLog File)
日誌檔案用於記錄資料庫所做的全部變更(如增加、刪除、修改)、以便在系統發生故障時,用它對資料庫進行恢復。名字通常為Log*.dbf格式,如:Log1CIMS.dbf,Log2CIMS.dbf 。
控制檔案(ControlFile)
每個Oracle資料庫都有相應的控制檔案,它們是較小的二進位制檔案,用於記錄資料庫的物理結構,如:資料庫名、資料庫的資料檔案和日誌檔案的名字和位置等資訊。用於開啟、存取資料庫。名字通常為Ctrl*ctl 格式,如Ctrl1CIMS.ctl。
配置檔案
配置檔案記錄Oracle資料庫執行時的一些重要引數,如:資料塊的大小,記憶體結構的配置等。名字通常為init*.ora 格式,如:initCIMS.ora 。
2 邏輯結構
Oracle資料庫的邏輯結構描述了資料庫從邏輯上如何來儲存資料庫中的資料。邏輯結構包括表空間、段、區、資料塊和模式物件。資料庫的邏輯結構將支配一個數據庫如何使用系統的物理空間.模式物件及其之間的聯絡則描述了關係資料庫之間的設計.
一個數據庫從邏輯上說是由一個或多個表空間所組成,表空間是資料庫中物理編組的資料倉庫,每一個表空間是由段(segment)組成,一個段是由一組區(extent)所組成,一個區是由一組連續的資料庫塊(database block)組成,而一個數據庫塊對應硬碟上的一個或多個物理塊。一個表空間存放一個或多個數據庫的物理檔案(即資料檔案).一個數據庫中的資料被邏輯地儲存在表空間上。
表空間(tablespace)
Oracle資料庫被劃分為一個或多個稱為表空間的邏輯結構,它包括兩類表空間,System表空間和非System表空間,其中,System表空間是安裝資料庫時自動建立的,它包含資料庫的全部資料字典,儲存過程、包、函式和觸發器的定義以及系統回滾段。除此之外,還能包含使用者資料。
一個表空間包含許多段,每個段有一些可以不連續的區組成,每個區由一組連續的資料塊組成,資料塊是資料庫進行操作的最小單位。
每個表空間對應一個或多個數據檔案,每個資料檔案只能屬於一個表空間。
資料庫塊(databaseblock)
資料庫塊也稱邏輯塊或ORACLE塊,它對應磁碟上一個或多個物理塊,它的大小由初始化引數db-block-size(在檔案init.ora中)決定,典型的大小是2k。Pckfree 和pctused 兩個引數用來優化資料塊空間的使用。
區(extent)
區是由一組連續的資料塊所組成的資料庫儲存空間分配的邏輯單位。
段(segment)
段是一個或多個不連續的區的集合,它包括一個表空間內特定邏輯結構的所有資料,段不能跨表空間存放。Oracle資料庫包括資料段、索引段、臨時段、回滾段等。
模式物件(schemaobject)
Oracle資料庫的模式物件包括表、檢視、序列、同意詞、索引、觸發器、儲存.過程等,關於它們將重點在後面章節介紹。
3.Oracle Server系統程序與記憶體結構
當在計算機伺服器上啟動Oracle資料庫後,稱伺服器上啟動了一個Oracle例項(Instance)。ORACLE 例項(Instance)是存取和控制資料庫的軟體機制,它包含系統全域性區(SGA)和ORACLE程序兩部分。SGA是系統為例項分配的一組共享記憶體緩衝區,用於存放資料庫例項和控制資訊,以實現對資料庫中資料的管理和操作。
程序是作業系統中一個極為重要的概念。一個程序執行一組操作,完成一個特定的任務.對ORACLE資料庫管理系統來說,程序由使用者程序、伺服器程序和後臺程序所組成。
當用戶執行一個應用程式時,系統就為它建立一個使用者程序。伺服器程序處理與之相連的使用者程序的請求,它與使用者程序相通訊,為相連的使用者程序的ORACLE請求服務。
為了提高系統性能,更好地實現多使用者功能,ORACLE還在系統後臺啟動一些後臺程序,用於資料庫資料操作。
系統程序的後臺程序主要包括:
SMON 系統監控程序:(system monitor)負責完成自動例項恢復和回收分類(sort)表空間。
PMON 程序監控程序:(process monitor)實現使用者程序故障恢復、清理記憶體區和釋放該程序所需資源等。
DBWR 資料庫寫程序:資料庫緩衝區的管理程序。在它的管理下,資料庫緩衝區中總保持有一定數量的自由緩衝塊,以確保使用者程序總能找到供其使用的自由緩衝塊。
LGWR 日誌檔案寫程序:是日誌緩衝區的管理程序,負責把日誌緩衝區中的日誌項寫入磁碟中的日誌檔案上。每個例項只有一個LGWR程序。
ARCH 歸檔程序:(archiver process)把已經填滿的線上日誌檔案拷貝到一個指定的儲存裝置上。僅當日志文件組開關(switch)出現時,才進行ARCH操作。ARCH不是必須的,而只有當自動歸檔可使用或者當手工歸檔請求時才發出。
RECO 恢復程序:是在具有分散式選項時使用的一個程序,主要用於解決引用分散式事務時所出現的故障。它只能在允許分散式事務的系統中出現。
LCKn 封鎖程序:用於並行伺服器系統,主要完成例項之間的封鎖。
記憶體結構(SGA)
SGA是Oracle為一個例項分配的一組共享記憶體緩衝區,它包含該例項的資料和控制資訊。SGA在例項啟動時被自動分配,當例項關閉時被收回。資料庫的所有資料操作都要通過SGA來進行。
SGA中記憶體根據存放資訊的不同,可以分為如下幾個區域:
(見圖 SGA中記憶體區域.gif)
Buffer Cache:存放資料庫中資料庫塊的拷貝。它是由一組緩衝塊所組成,這些緩衝塊為所有與該例項相連結的使用者程序所共享。緩衝塊的數目由初始化引數DB_BLOCK_BUFFERS確定,緩衝塊的大小由初始化引數DB_BLOCK_SIZE確定。大的資料塊可提高查詢速度。它由DBWR操作。
b. 日誌緩衝區Redo Log Buffer:存放資料操作的更改資訊。它們以日誌項(redo entry)的形式存放在日誌緩衝區中。當需要進行資料庫恢復時,日誌項用於重構或回滾對資料庫所做的變更。日誌緩衝區的大小由初始化引數LOG_BUFFER確定。大的日誌緩衝區可減少日誌檔案I/O的次數。後臺程序LGWR將日誌緩衝區中的資訊寫入磁碟的日誌檔案中,可啟動ARCH後臺程序進行日誌資訊歸檔。
c. 共享池Shared Pool:包含用來處理的SQL語句資訊。它包含共享SQL區和資料字典儲存區。共享SQL區包含執行特定的SQL語句所用的資訊。資料字典區用於存放資料字典,它為所有使用者程序所共享。
Cursors:一些記憶體指標,執行待處理的SQL語句
其他資訊區:除了上述幾個資訊區外,還包括一些程序之間的通訊資訊(如封鎖資訊);在多線索伺服器配置下,還有一些程式全域性區的資訊,請求佇列和響應佇列等。
陸、ORACLE資料型別
欄位型別 中文說明 限制條件 其它說明
CHAR 固定長度字串 最大長度2000 bytes
VARCHAR2 可變長度的字串 最大長度4000 bytes 可做索引的最大長度749
NCHAR 根據字符集而定的固定長度字串 最大長度2000 bytes
NVARCHAR2 根據字符集而定的可變長度字串 最大長度4000 bytes
DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS) 經過嚴格測試,無千蟲問題
LONG 超長字串 最大長度2G(231-1) 足夠儲存大部頭著作
RAW 固定長度的二進位制資料 最大長度2000 bytes 可存放多媒體圖象聲音等
LONG RAW 可變長度的二進位制資料 最大長度2G 同上
BLOB 二進位制資料 最大長度4G
CLOB 字元資料 最大長度4G
NCLOB 根據字符集而定的字元資料 最大長度4G
BFILE 存放在資料庫外的二進位制資料 最大長度4G
ROWID 資料表中記錄的唯一行號 10 bytes ********.****.****格式,*為0或1
NROWID 二進位制資料表中記錄的唯一行號 最大長度4000 bytes
NUMBER(P,S) 數字型別 P為整數位,S為小數位
DECIMAL(P,S) 數字型別 P為整數位,S為小數位
INTEGER 整數型別 小的整數
FLOAT 浮點數型別 NUMBER(38),雙精度
REAL 實數型別 NUMBER(63),精度更高
資料型別 |
引數 |
描述 |
char(n) |
n=1 to 2000位元組 |
定長字串,n位元組長,如果不指定長度,預設為1個位元組長(一個漢字為2位元組) |
varchar2(n) |
n=1 to 4000位元組 |
可變長的字串,具體定義時指明最大長度n, 這種資料型別可以放數字、字母以及ASCII碼字符集(或者EBCDIC等資料庫系統接受的字符集標準)中的所有符號。 如果資料長度沒有達到最大值n,Oracle 8i會根據資料大小自動調節欄位長度, 如果你的資料前後有空格,Oracle 8i會自動將其刪去。VARCHAR2是最常用的資料型別。 可做索引的最大長度3209。 |
number(m,n) |
m=1 to 38 n=-84 to 127 |
可變長的數值列,允許0、正值及負值,m是所有有效數字的位數,n是小數點以後的位數。 如:number(5,2),則這個欄位的最大值是99,999,如果數值超出了位數限制就會被擷取多餘的位數。 如:number(5,2),但在一行資料中的這個欄位輸入575.316,則真正儲存到欄位中的數值是575.32。 如:number(3,0),輸入575.316,真正儲存的資料是575。 |
date |
無 |
從公元前4712年1月1日到公元4712年12月31日的所有合法日期, Oracle 8i其實在內部是按7個位元組來儲存日期資料,在定義中還包括小時、分、秒。 預設格式為DD-MON-YY,如07-11月-00 表示2000年11月7日。 |
long |
無 |
可變長字元列,最大長度限制是2GB,用於不需要作字串搜尋的長串資料,如果要進行字元搜尋就要用varchar2型別。 long是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。 |
raw(n) |
n=1 to 2000 |
可變長二進位制資料,在具體定義欄位的時候必須指明最大長度n,Oracle 8i用這種格式來儲存較小的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件。 raw是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。 |
long raw |
無 |
可變長二進位制資料,最大長度是2GB。Oracle 8i用這種格式來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案。 在同一張表中不能同時有long型別和long raw型別,long raw也是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。 |
blob clob nclob |
無 |
三種大型物件(LOB),用來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案,最大長度是4GB。 LOB有幾種型別,取決於你使用的位元組的型別,Oracle 8i實實在在地將這些資料儲存在資料庫內部儲存。 可以執行讀取、儲存、寫入等特殊操作。 |
bfile |
無 |
在資料庫外部儲存的大型二進位制物件檔案,最大長度是4GB。 這種外部的LOB型別,通過資料庫記錄變化情況,但是資料的具體儲存是在資料庫外部進行的。 Oracle 8i可以讀取、查詢BFILE,但是不能寫入。 大小由作業系統決定。 |
資料型別是列或儲存過程中的一個屬性。
Oracle支援的資料型別可以分為三個基本種類:字元資料型別、數字資料型別以及表示其它資料的資料型別。
字元資料型別
CHAR char資料型別儲存固定長度的字元值。一個CHAR資料型別可以包括1到2000個字元。如果對CHAR沒有明確地說明長度,它的預設長度則設定為1。 如果對某個CHAR型別變數賦值,其長度小於規定的長度,那麼Oracle自動用空格填充。
VARCHAR2 儲存可變長度的字串。雖然也必須指定一個VARCHAR2資料變數的長度,但是這個長度是指對該變數賦值的最大長度而非實際賦值長度。不需用空格填充。最多可設定為4000個字元。因為VARCHAR2資料型別只儲存為該列所賦的字元(不加空格),所以VARCHAR2需要的儲存空間比CHAR資料型別 要小。
Oracle推薦使用VARCHAR2
NCHAR和NVARCHAR2 NCHAR和NVARCHAR2資料型別分別儲存固定長度與可變長度的字串,但是它們使用的是和資料庫其他型別不同的字符集。在建立資料庫時,需要指定所使用的字符集,以便對資料中資料進行編碼。還可以指定一個輔助的字符集[即本地語言集]。NCHAR和NVARCHAR2型別的列使用輔助字符集。 NCHAR和NVARCHAR2型別的列使用輔助字符集。
在Oracle 9i中,可以以字元而不是位元組為單位表示NCHAR和NVARCHAR2列的長度。
LONG long資料型別可以存放2GB的字元資料,它是從早期版本中繼承下來的。現在如果儲存大容量的資料,Oracle推薦使用CLOB和NCLOB資料型別。在表和SQL語句中使用LONG型別有許多限制。
CLOB和NCLOB CLOB和NCLOB資料型別可以儲存多達4GB的字元資料。NCLOB資料型別可儲存NLS資料。
數字資料型別
Oracle使用標準、可變長度的內部格式來儲存數字。這個內部格式精度可以高達38位。
NUMBER資料型別可以有兩個限定符,如:columnNUMBER(precision,scale)。precision表示數字中的有效位。如果沒有指定precision的話,Oracle將使用38 作為精度。scale表示小數點右邊的位數,scale預設設定為0。如果把scale設成負數,Oracle將把該數字取捨到小數點左邊的指定位數。
日期資料型別
Oracle標準日期格式為:DD-MON-YY HH:MI:SS
通過修改例項的引數NLS_DATE_FORMAT,可以改變例項中插入日期的格式。在一個會話期間,可以通過Alter session SQL命令來修改日期,或者通過使用SQL語句的TO_DATE表示式中的引數來更新一個特定值。
其它的資料型別
RAW和LONG RAW RAW和LONG RAW資料型別主要用於對資料庫進行解釋。指定這兩種型別時,Oracle以位的形式來儲存資料。RAW資料型別一般用於儲存有特定格式的物件,如點陣圖。 RAW資料型別可佔用2KB的空間,而LONG RAW資料型別則可以佔用2GB大小。
ROWID ROWID是一種特殊的列型別,稱之為偽列(pseudocolumn)。ROWID偽列在SQL SELECT語句中可以像普通列那樣被訪問。Oracle資料庫中每行都有一個偽列。ROWID表示行的地址,ROWID偽列用ROWID資料型別定義。
ROWID與磁碟驅動的特定位置有關,因此,ROWID是獲得行的最快方法。但是,行的ROWID會隨著解除安裝和過載資料庫而發生變化,因此建議不要在事務 中使用ROWID偽列的值。例如,一旦當前應用已經使用完記錄,就沒有理由儲存行的ROWID。不能通過任何SQL語句來設定標準的ROWID偽列的值。
列或變數可以定義成ROWID資料型別,但是Oracle不能保證該列或變數的值是一個有效的ROWID。
LOB(大型物件)資料型別,可以儲存4GB的資訊。LOB有以下3中型別:
<CLOB>,只能儲存字元資料
<NCLOB>,儲存本地語言字符集資料
<BLOB> ,以二進位制資訊儲存資料
可以指定將一個LOB資料儲存在Oracle資料庫內,還是指向一個包含次資料的外部檔案。
LOB可以參與事務。管理LOB中的資料必須通過DBMS_LOB PL/SQL內建軟體包或者OGI介面。
為了便於將LONG資料型別轉換成LOB,Oracle 9i包含許多同時支援LOB和LONG的函式,喊包括一個ALTER TABLE語句的新選擇,它允許將LONG資料型別自動轉換成LOB。
BFILE
BFILE資料型別用做指向儲存在Oracle資料庫以外的檔案的指標。
XML Type
作為對XML支援的一部分,Oracle9i包含了一個新的資料型別XML Type。定義為XMLType的列將儲存一個字元LOB列中的XML文件。有許多內建的功能可以使你從文件中抽取單個節點,還可以在XML Type文件中對任何節點建立索引。
使用者自定義資料
從Oracle 8以後,使用者可以定義自己的複雜資料型別,它們由Oracle基本資料型別組合而成。
AnyType、AnyData和AnyDataSet
Oracle包括3個新的資料型別,用於定義在現有資料型別之外的資料結構。其中每種資料型別必須用程式單元來定義,以便讓Oracle9i知道如何處理這些型別的特定實現。
型別轉換
Oracle會自動將某些資料型別轉換成其他的資料型別,轉換取決於包括該值的SQL語句。
資料轉換還可以通過Oracle的型別轉換函式顯示地進行。
連線與比較
在大多數平臺上Oracle SQL中的連線操作符用兩條豎線(||)表示。連線是將兩個字元值連線。Oracle的自動型別轉換功能使得兩個數字值也可以進行連線。
NULL
NULL值是關係資料庫的重要特徵之一。實際上,NULL不代表任何值,它表示沒有值。如果要建立表的一個列,而這個列必須有值,那麼應將它指定為NOT NULL,這表示該列不能包含NULL值。
任何資料型別都可以賦予NULL值。NULL值引入了SQL運算的三態邏輯。如果比較的一方是NULL值,那麼會出現3種狀態:TURE、FALSE以及兩者都不是。
因為NULL值不等於0或其他任何值,所以測試某個資料是否為NULL值只能通過關係運算符IS NULL來進行。
NULL值特別適合以下情況:當一個列還未賦值時。如果選擇不使用NULL值,那麼必須對行的所有列都要賦值。這實際上也取消了某列不需要值的可能性,同時對它賦的值也很容易產生誤解。這種情況則可能誤導終端使用者,並且導致累計操作的錯誤結果。
number(p,s)
p:1~38
s:-84~127
p>0,對s分2種情況:1. s>0
精確到小數點右邊s位,並四捨五入。然後檢驗有效數位是否<=p;如果s>p,小數點右邊至少有s-p個0填充。
2. s<0
精確到小數點左邊s位,並四捨五入。然後檢驗有效數位是否<=p+|s|
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
1234.9876 NUMBER(6) 1235
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
oracle 的命名規則:
1、要以字母開頭
2、包含字母和數字,以及# $
3、不能超過30個字元
oracle基本資料型別
|
oracle 資料庫中討論char ,varchar ,varchar2 資料型別!
這3種字串資料型別是我們使用最多的,我們在資料庫設計時到底該怎麼使用了? 首先我們先來分析3個數據型別的說明: 1。char CHAR的長度是固定的,最長2000個字元。 2。varchar 和 varchar2 可以肯定的是oracle中目前是可以使用varchar資料型別的,但他們的區別我查了不少資料也沒有找到一個準確的答案 最常見的說話是說oracle中的varchar只是varchar2的別名也就是同義詞。 其次也有人認為varchar是最大長度為2000的可變字串(和sql server中的varchar一致),而varchar2最大長度為4000。 知道了他們的特點我們就來討論下使用區別 1.char和varchar、varchar2 由於varchar和varchar2用途類似,我們先來討論char和他們的使用區別: varchar和varchar2比char節省空間,在效率上比char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在資料庫設計上常說的‘以空間換效率’。 varchar和varchar2雖然比char節省空間,但是如果一個varchar和varchar2列經常被修改,而且每次被修改的資料的長度不同,這會引起‘行遷移’(Row Migration)現象,而這造成多餘的I/O,是資料庫設計和調整中要盡力避免的,在這種情況下用char代替varchar和varchar2會更好一些。 當然還有一種情況就是象身份證這種長度幾乎不變的欄位可以考慮使用char,以獲得更高的效率。 2。varchar和varchar2 這裡就進入重點了,前面的區別我們在sql server中我們已經基本瞭解了,大家可能都知道,最多也就是複習下,但oracle增加了一個varchar2型別,是大家以前所沒有用到過的。 因為oracle保證在任何版本中該資料型別向上和向下相容,但不保證varchar,還有其他資料中一般都有varchar這個資料型別。 所以我得出了以下結論: 如果想在oracle新版本的資料庫相容就不要用varchar,如果想和oracle之外其他資料庫相容就不要用varchar2。 |
ORACLE中的資料型別分類
ORACLE中的資料型別不可謂不多,下面把我這兩天來的學習體會寫一下吧!1、字元資料型別:包括我CHAR,VARCHAR2,LONG。CHAR型可以儲存字母數字值,這種資料型別的列長度可以是1到2000個位元組。如果未指明,則預設其佔用一個位元組,如果使用者輸入的值小於指定的長度,資料庫則用空格填充至固定長度。VARCHAR2型其實就是VARCHAR,只不過後面多了一個數字2,VARCHAR2就是VARCHAR的同義詞,也稱別名。資料型別大小在1至4000個位元組,但是和 CHAR不同的一點是:當你定義了VARCHAR2長度為30,但是你只輸入了10個字元,這時VARCHAR2不會像CHAR一樣填充,在資料庫中只有 10具位元組。 LONG型:此資料型別用來儲存可變長度的字元資料,最多能儲存2GB。但是有一些限制:一個表中只有一列可以為LONG型,LONG列不能定義為主鍵或唯一約束,不能建立索引,過程或儲存過程不能接受LONG資料型別的引數。 2、數值資料型別只有NUMBER型,但是NUMBER功能不小,它可以儲存正數,負數,零,定點數和精度為30位的浮點數。格式為(P=38,S=0),其中P為精度,表示數字的總位數,它在1-38之間,S為範圍,表示小數點右邊的數字的位數,它在-84至127之間。 3、日期時間資料型別:有DATE資料型別,TIMESTAMP資料型別。DATE用 於儲存表中的日期和時間資料,ORACLE使用自己的格式儲存日期,使用7個位元組固定長度,每個位元組分別儲存世紀,年月日,小時,分和秒。日期資料型別的 值從公元前4712年1月1日到公元9999年12月31日。ORACLE中的SYSDATE函式用於返回當前的日期和時間。TIMESTAMP資料型別與DATE不同的是:它還返回當前的時區。 4RAW和LONG RAW 資料型別 此種資料型別主要用於儲存二進位制資料。 RAW用於儲存基於位元組的資料,最多能儲存2000個位元組,它沒有預設大小,所以在使用時要指定大小,可以建立索引。 RAW LONG用於儲存可變長度的二進位制資料,最多能儲存2GB,它受的限制和LONG型別一樣。 5、LOB資料型別 LOB又稱為“大物件”資料型別:主要有CLOB,BLOB,BFILE,三種子型別。 CLOB代表(CHARACTERLOB),它能夠儲存大量字元資料,可以儲存非結構化的XML文件。 BLOG代表(BINARY LOB),它可以儲存較大的二進位制物件;如圖形,音視訊剪輯。 BFILE 代表(BINARY FILE),它能夠將二進位制檔案儲存在資料庫外部的作業系統檔案中,注意是二進位制檔案,不是一般資料,BFILE列儲存一個BFILE定位器,它指向位於 伺服器檔案系統上的二進位制檔案,支援的檔案最大為4GB。不過ORACLE10以上的會更大,這還需要硬體方面的支援。
一 varchar,nvarchar,
四個型別都屬於變長字元型別, varchar和varchar2的區別在與後者把所有字元都佔兩位元組,前者只對漢字和全形等字元佔兩位元組。 nvarchar和nvarchar2的區別和上面一樣, 與上面區別在於是根據Unicode 標準所進行的定義的型別,通常用於支援多國語言類似系統的定義。
1.char
char的長度是固定的,比如說,你定義了char(20),即使你你插入abc,不足二十個位元組,資料庫也會在abc後面自動加上17個空格,以補足二十個位元組;
char是區分中英文的,中文在char中佔兩個位元組,而英文佔一個,所以char(20)你只能存20個字母或10個漢字。
char適用於長度比較固定的,一般不含中文的情況
2.varchar/varchar2
varchar是長度不固定的,比如說,你定義了varchar(20),當你插入abc,則在資料庫中只佔3個位元組。
varchar同樣區分中英文,這點同char。
varchar2基本上等同於varchar,它是oracle自己定義的一個非工業標準varchar,不同在於,varchar2用null代替varchar的空字串
varchar/varchar2適用於長度不固定的,一般不含中文的情況
3.nvarchar/nvarchar2
nvarchar和nvarchar2是長度不固定的
nvarchar不區分中英文,比如說:你定義了nvarchar(20),你可以存入20個英文字母/漢字或中英文組合,這個20定義的是字元數而不是位元組數
nvarchar2基本上等同於nvarchar,不同在於nvarchar2中存的英文字母也佔兩個位元組
nvarchar/nvarchar2適用於存放中文
char [ ( n ) ]
固定長度,非 Unicode 字元資料,長度為 n 個位元組。n 的取值範圍為 1 至 8,000,儲存大小是 n 個位元組。
varchar [ ( n | max ) ]
可變長度,非 Unicode 字元資料。n 的取值範圍為 1 至 8,000。max 指示最大儲存大小是 2^31-1 個位元組。儲存大小是輸入資料的實際長度加 2 個位元組,用於反映儲存的資料的長度。所輸入資料的長度可以為 0 個字元。
* 如果列資料項的大小一致,則使用 char。
* 如果列資料項的大小差異相當大,則使用 varchar。
* 如果列資料項大小相差很大,而且大小可能超過 8,000 位元組,請使用 varchar(max)。
如果未在資料定義或變數宣告語句中char 或 varchar 資料型別指定 n,則預設長度為 1。如果在使用CAST 和 CONVERT 函式時char 或 varchar 資料型別未指定 n,則預設長度為 30。
當執行 CREATE TABLE 或 ALTER TABLE 時,如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為varchar 處理。
另外幫助理解的,只供參考:轉自http://www.51testing.com/?uid-258885-action-viewspace-itemid-141197
也可參照學習http://ce.sysu.edu.cn/garden/dispbbs.asp?boardid=26&ID=8774&replyID=18180&skin=1
1.NULL值(空值)。
a. char列的NULL值佔用儲存空間。
b. varcahr列的NULL值不佔用儲存空間。
c. 插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。
2.插入資料
無論插入資料涉及的列是否建立索引,char的效率都明顯低於varchar。
3. 更新資料
如果更新的列上未建立索引,則char的效率低於varchar,差異不大;建立索引的話,效率較高。
4. 修改結構
a. 無論增加或是刪除的列的型別是char還是varchar,操作都能較快的完成,而且效率上沒有什麼差異。
b. 對於增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費時間,而修改char列需要花費很長的時間。
5.資料檢索
無論是否通過索引,varchar型別的資料檢索略優於char的掃描。
選擇char還是選擇varchar的建議
1.適宜於char的情況:
a. 列中的各行資料長度基本一致,長度變化不超過50位元組;
b. 資料變更頻繁,資料檢索的需求較少。
c. 列的長度不會變化,修改char型別列的寬度的代價比較大。
d. 列中不會出現大量的NULL值。
e. 列上不需要建立過多的索引,過多的索引對char列的資料變更影響較大。
2.適宜於varchar的情況;
a. 列中的各行資料的長度差異比較大。
b. 列中資料的更新非常少,但查詢非常頻繁。
c. 列中經常沒有資料,為NULL值或為空值
nchar [ ( n ) ]
n 個字元的固定長度的 Unicode 字元資料。n 值必須在 1 到 4,000 之間(含)。儲存大小為兩倍 n 位元組。
nvarchar [ ( n | max ) ]
可變長度 Unicode 字元資料。n 值在 1 到 4,000 之間(含)。max 指示最大儲存大小為 2^31-1 位元組。儲存大小是所輸入字元個數的兩倍 + 2 個位元組。所輸入資料的長度可以為 0 個字元。
註釋
如果沒有在資料定義或變數宣告語句中指定 n,則預設長度為 1。如果沒有使用 CAST 函式指定 n,則預設長度為30。
如果列資料項的大小可能相同,請使用 nchar。
如果列資料項的大小可能差異很大,請使用 nvarchar。
sysname 是系統提供的使用者定義資料型別,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用於引用資料庫物件名。
為使用 nchar 或 nvarchar 的物件分配的是預設的資料庫排序規則,但可使用 COLLATE 子句分配特定的排序規則。
SET ANSI_PADDING ON 永遠適用於 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用於 nchar 或 nvarchar 資料型別。
在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2這五種型別的區別
1.CHAR(size)和VARCHAR(size)的區別
CHAR為定長的欄位,最大長度為2K位元組;
VARCHAR為可變長的欄位,最大長度為4K位元組;
2.CHAR(size)和NCHAR(size)的區別
CHAR如果存放字母數字佔1個位元組,存放GBK編碼的漢字存放2個位元組,存放UTF-8編碼的漢字佔用3個位元組;
NCHAR根據所選字符集來定義存放字元的佔用位元組數,一般都為2個位元組存放一個字元(不管字元或者漢字)
3.VARCHAR(size)和VARCHAR2(size)的區別
在現在的版本中,兩者是沒有區別的;最大長度為4K位元組;推薦使用VARCHAR2;
4.VARCHAR2(size)和NVARCHAR2(size)的區別
最大長度為4K位元組,區別同CHAR與NCHAR的區別;(如果資料庫字符集長度是2,則NVARCHAR2最大為2K)
5.共同特性
當執行insert的時候,插入的值為'',則轉變成null,即insert... values('') <=> insert ... values(null)
搜尋的條件須用where xx is null
6.例子
比如有一個性別字段,裡面存放“男,女”的其中一個值,兩種常用選擇
CHAR(2) 和 NCHAR(1)
先裝oracle客戶端
1、控制面板->管理工具->資料來源(ODBC)->新增資料來源->選擇oracle 客戶端
Data Source Name 可以任意起名,推薦和SID一樣
Description 描述
TNS Service Name 下拉選單中會自動顯示環境變數TNS_ADMIN所指目錄下的tnsnames.ora檔案中SERVICE_NAME的名稱,也就是要連線的SID UserID 使用者名稱
2、程式碼
string ConnectionString = "DataSource=orcl; User Id=SCOTT; Password=scott"; //連線字串
OracleConnection conn = newOracleConnection(ConnectionString); //建立一個新連線
try
{
conn.Open(); //開啟連線
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * fromemp"; //SQL語句
OracleDataReader rs = cmd.ExecuteReader();
while (rs.Read()) //讀取資料,如果rs.Read()返回為false的話,就說明到記錄集的尾部了
{
MessageBox.Show(rs.GetString(1));
}
rs.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
conn.Close();
}
Oracle
ODBC
New version:
"Driver={Microsoft ODBC forOracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;"
Old version:
"Driver={Microsoft ODBC Driver forOracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword;"
OLEDB, OleDbConnection (.NET)
Standard security:
"Provider=msdaora;DataSource=MyOracleDB;User Id=UserName;Password=asdasd;"
This one's from Microsoft, the followingare from Oracle
Standard Security:
"Provider=OraOLEDB.Oracle;DataSource=MyOracleDB;User Id=Username;Password=asdasd;"
Trusted Connection:
"Provider=OraOLEDB.Oracle;DataSource=MyOracleDB;OSAuthent=1;"
OracleConnection (.NET)
Standard:
"Data Source=Oracle8i;IntegratedSecurity=yes";
This one works only with Oracle 8i release3 or later
Declare the OracleConnection:
C#:
using System.Data.OracleClient;
OracleConnection oOracleConn = newOracleConnection();
oOracleConn.ConnectionString = "myconnectionstring";
oOracleConn.Open();
VB.NET:
Imports System.Data.OracleClient
Dim oOracleConn As OracleConnection = NewOracleConnection()
oOracleConn.ConnectionString = "myconnectionstring"
oOracleConn.Open()
Data Shape
MS Data Shape:
"Provider=MSDataShape.1;PersistSecurity Info=False;Data Provider=MSDAORA;Data Source=orac;userid=username;password=mypw"
using System;
using System.Data;
using System.Data.OracleClient;
using System.Web.UI.WebControls;
namespace SiFenManager.Util
{
/// <summary>
/// 資料庫通用操作類
/// </summary>
public class Database
{
protected OracleConnection con;//連線物件
public Database()
{
con=newOracleConnection(DafangFramework.AppConfig.DataBaseConnectionString);
}
public Database(string constr)
{
con=new OracleConnection(constr);
}
#region 開啟資料庫連線
/// <summary>
/// 開啟資料庫連線
/// </summary>
private void Open()
{
//開啟資料庫連線
if(con.State==ConnectionState.Closed)
{
try
{
//開啟資料庫連線
con.Open();
}
catch(Exception e)
{
throw e;
}
}
}
#endregion
#region 關閉資料庫連線
/// <summary>
/// 關閉資料庫連線
/// </summary>
private void Close()
{
//判斷連線的狀態是否已經開啟
if(con.State==ConnectionState.Open)
{
con.Close();
}
}
#endregion
#region 執行查詢語句,返回OracleDataReader ( 注意:呼叫該方法後,一定要對OracleDataReader進行Close )
/// <summary>
/// 執行查詢語句,返回OracleDataReader ( 注意:呼叫該方法後,一定要對OracleDataReader進行Close )
/// </summary>
/// <param name="sql">查詢語句</param>
/// <returns>OracleDataReader</returns>
public OracleDataReaderExecuteReader(string sql)
{
OracleDataReader myReader;
Open();
OracleCommand cmd = new OracleCommand(sql,con);
myReader =cmd.ExecuteReader(CommandBehavior.CloseConnection);
return myReader;
}
#endregion
#region 執行帶引數的SQL語句
/// <summary>
/// 執行SQL語句,返回影響的記錄數
/// </summary>
/// <param name="sql">SQL語句</param>
/// <returns>影響的記錄數</returns>
public int ExecuteSql(string sql,params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
{
try
{
PrepareCommand(cmd, con, null, sql,cmdParms);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch(System.Data.OracleClient.OracleException e)
{
throw e;
}
}
}
#endregion
#region 執行帶引數的SQL語句
/// <summary>
/// 執行不帶引數的SQL語句
/// </summary>
/// <param name="sql">SQL語句</param>
public void ExecuteSql(stringsql)
{
OracleCommand cmd = newOracleCommand(sql,con);
try
{
Open();
cmd.ExecuteNonQuery();
Close();
}
catch(System.Data.OracleClient.OracleException e)
{
Close();
throw e;
}
}
#endregion
#region 執行SQL語句,返回資料到DataSet中
/// <summary>
/// 執行SQL語句,返回資料到DataSet中
/// </summary>
/// <param name="sql">sql語句</param>
/// <returns>返回DataSet</returns>
public DataSet GetDataSet(stringsql)
{
DataSet ds=new DataSet();
try
{
Open();//開啟資料連線
OracleDataAdapter adapter=new OracleDataAdapter(sql,con);
adapter.Fill(ds);
}
catch//(Exception ex)
{
}
finally
{
Close();//關閉資料庫連線
}
return ds;
}
#endregion
#region 執行SQL語句,返回資料到自定義DataSet中
/// <summary>
/// 執行SQL語句,返回資料到DataSet中
/// </summary>
/// <param name="sql">sql語句</param>
/// <paramname="DataSetName">自定義返回的DataSet表名</param>
/// <returns>返回DataSet</returns>
public DataSet GetDataSet(stringsql,string DataSetName)
{
DataSet ds=new DataSet();
Open();//開啟資料連線
OracleDataAdapter adapter=new OracleDataAdapter(sql,con);
adapter.Fill(ds,DataSetName);
Close();//關閉資料庫連線
return ds;
}
#endregion
#region 執行Sql語句,返回帶分頁功能的自定義dataset
/// <summary>
/// 執行Sql語句,返回帶分頁功能的自定義dataset
/// </summary>
/// <param name="sql">Sql語句</param>
/// <param name="PageSize">每頁顯示記錄數</param>
/// <paramname="CurrPageIndex">當前頁</param>
/// <paramname="DataSetName">返回dataset表名</param>
/// <returns>返回DataSet</returns>
public DataSet GetDataSet(stringsql,int PageSize,int CurrPageIndex,string DataSetName)
{
DataSet ds=new DataSet();
Open();//開啟資料連線
OracleDataAdapter adapter=new OracleDataAdapter(sql,con);
adapter.Fill(ds,PageSize * (CurrPageIndex -1), PageSize,DataSetName);
Close();//關閉資料庫連線
return ds;
}
#endregion
#region 執行SQL語句,返回記錄總數
/// <summary>
/// 執行SQL語句,返回記錄總數
/// </summary>
/// <param name="sql">sql語句</param>
/// <returns>返回記錄總條數</returns>
public int GetRecordCount(stringsql)
{
int recordCount = 0;
Open();//開啟資料連線
OracleCommand command = new OracleCommand(sql,con);
OracleDataReader dataReader =command.ExecuteReader();
while(dataReader.Read())
{
recordCount++;
}
dataReader.Close();
Close();//關閉資料庫連線
return recordCount;
}
#endregion
#region 統計某表記錄總數
/// <summary>
/// 統計某表記錄總數
/// </summary>
/// <param name="KeyField">主鍵/索引鍵</param>
/// <paramname="TableName">資料庫.使用者名稱.表名</param>
/// <paramname="Condition">查詢條件</param>
/// <returns>返回記錄總數</returns>
public int GetRecordCount(stringkeyField, string tableName, string condition)
{
int RecordCount = 0;
string sql = "select count(" + keyField+ ") as count from " + tableName + " " + condition;
DataSet ds = GetDataSet(sql);
if (ds.Tables[0].Rows.Count > 0)
{
RecordCount=Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
ds.Clear();
ds.Dispose();
return RecordCount;
}
/// <summary>
/// 統計某表記錄總數
/// </summary>
/// <param name="Field">可重複的欄位</param>
/// <paramname="tableName">資料庫.使用者名稱.表名</param>
/// <paramname="condition">查詢條件</param>
/// <param name="flag">欄位是否主鍵</param>
/// <returns>返回記錄總數</returns>
public int GetRecordCount(stringField, string tableName, string condition, bool flag)
{
int RecordCount = 0;
if (flag)
{
RecordCount = GetRecordCount(Field,tableName, condition);
}
else
{
string sql = "selectcount(distinct(" + Field + ")) as count from " + tableName +" " + condition;
DataSet ds = GetDataSet(sql);
if (ds.Tables[0].Rows.Count > 0)
{
RecordCount =Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
ds.Clear();
ds.Dispose();
}
return RecordCount;
}
#endregion
#region 統計某表分頁總數
/// <summary>
/// 統計某表分頁總數
/// </summary>
/// <param name="keyField">主鍵/索引鍵</param>
/// <paramname="tableName">表名</param>
/// <paramname="condition">查詢條件</param>
/// <param name="pageSize">頁寬</param>
/// <paramname="RecordCount">記錄總數</param>
/// <returns>返回分頁總數</returns>
public int GetPageCount(stringkeyField, string tableName, string condition, int pageSize, int RecordCount)
{
int PageCount = 0;
PageCount = (RecordCount % pageSize) > 0? (RecordCount / pageSize) + 1 : RecordCount / pageSize;
if (PageCount < 1) PageCount = 1;
return PageCount;
}
/// <summary>
/// 統計某表分頁總數
/// </summary>
/// <param name="keyField">主鍵/索引鍵</param>
/// <paramname="tableName">表名</param>
/// <paramname="condition">查詢條件</param>
/// <param name="pageSize">頁寬</param>
/// <returns>返回頁面總數</returns>
public int GetPageCount(stringkeyField, string tableName, string condition, int pageSize, ref intRecordCount)
{
RecordCount = GetRecordCount(keyField,tableName, condition);
return GetPageCount(keyField, tableName, condition,pageSize, RecordCount);
}
/// <summary>
/// 統計某表分頁總數
/// </summary>
/// <param name="Field">可重複的欄位</param>
/// <paramname="tableName">表名</param>
/// <paramname="condition">查詢條件</param>
/// <param name="pageSize">頁寬</param>
/// <param name="flag">是否主鍵</param>
/// <returns>返回頁頁總數</returns>
public int GetPageCount(stringField, string tableName, string condition, ref int RecordCount, int pageSize,bool flag)
{
RecordCount = GetRecordCount(Field,tableName, condition, flag);
return GetPageCount(Field, tableName,condition, pageSize, ref RecordCount);
}
#endregion
#region Sql分頁函式
/// <summary>
/// 構造分頁查詢SQL語句
/// </summary>
/// <param name="KeyField">主鍵</param>
/// <param name="FieldStr">所有需要查詢的欄位(field1,field2...)</param>
/// <param name="TableName">庫名.擁有者.表名</param>
/// <param name="where">查詢條件1(where ...)</param>
/// <param name="order">排序條件2(order by ...)</param>
/// <paramname="CurrentPage">當前頁號</param>
/// <param name="PageSize">頁寬</param>
/// <returns>SQL語句</returns>
public string JoinPageSQL(stringKeyField, string FieldStr, string TableName, string Where, string Order, intCurrentPage, int PageSize)
{
string sql = null;
if (CurrentPage == 1)
{
sql = "select " + CurrentPage * PageSize + "" + FieldStr + " from " + TableName + " " + Where +" " + Order + " ";
}
else
{
sql = "select * from (";
sql += "select " + CurrentPage * PageSize + "" + FieldStr + " from " + TableName + " " + Where +" " + Order + ") a ";
sql += "where " + KeyField +" not in (";
sql += "select " + (CurrentPage - 1) * PageSize +" " + KeyField + " from " + TableName + " " +Where + " " + Order + ")";
}
return sql;
}
/// <summary>
/// 構造分頁查詢SQL語句
/// </summary>
/// <param name="Field">欄位名(非主鍵)</param>
/// <paramname="TableName">庫名.擁有者.表名</param>
/// <param name="where">查詢條件1(where ...)</param>
/// <param name="order">排序條件2(order by ...)</param>
/// <paramname="CurrentPage">當前頁號</param>
/// <param name="PageSize">頁寬</param>
/// <returns>SQL語句</returns>
public string JoinPageSQL(stringField, string TableName,string Where, string Order, int CurrentPage, intPageSize)
{
string sql = null;
if (CurrentPage == 1)
{
sql = "select rownum " +CurrentPage * PageSize + " " + Field + " from " + TableName+ " " + Where + " " + Order + " group by " +Field;
}
else
{
sql = "select * from (";
sql += "select rownum " +CurrentPage * PageSize + " " + Field + " from " + TableName+ " " + Where + " " + Order + " group by " +Field + " ) a ";
sql += "where " + Field + "not in (";
sql += "select rownum " +(CurrentPage - 1) * PageSize + " " + Field + " from " +TableName + " " + Where + " " + Order + " group by" + Field + ")";
}
return sql;
}
#endregion
#region 根據系統時間動態生成各種查詢語句(現已經註釋掉,以備以後使用)
// #region 根據查詢時間的條件,動態生成查詢語句
// /// <summary>
// /// 根據查詢時間的條件,動態生成查詢語句
// /// </summary>
// /// <param name="starttime">開始時間</param>
// /// <param name="endtime">結束時間</param>
// /// <param name="dw">單位</param>
// /// <param name="startxsl">開始線損率</param>
// /// <param name="endxsl">結束線損率</param>
// /// <param name="danwei">單位欄位</param>
// /// <param name="xiansunlv">線損率欄位</param>
// /// <param name="tablehz">表字尾</param>
// /// <returns>SQL語句</returns>
// public string SQL(DateTimestarttime,Date