posts - 40,  comments - 7,  trackbacks - 0
            2007年1月18日
          關于inode;


          inode 譯成中文就是索引節點。每個存儲設備或存儲設備的分區(存儲設備是硬盤、軟盤、U盤 ... ... )被格式化為文件系統后,應該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲數據用的。而inode呢,就是用來存儲這些數據的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權限等。inode為每個文件進行信息索引,所以就有了inode的數值。操作系統根據指令,能通過inode值最快的找到相對應的文件。

          做個比喻,比如一本書,存儲設備或分區就相當于這本書,Block相當于書中的每一頁,inode 就相當于這本書前面的目錄,一本書有很多的內容,如果想查找某部份的內容,我們可以先查目錄,通過目錄能最快的找到我們想要看的內容。雖然不太恰當,但還是比較形象。

          當我們用ls 查看某個目錄或文件時,如果加上-i 參數,就可以看到inode節點了;比如我們前面所說的例子;



          [root@localhost ~]# ls -li lsfile.sh
          2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh

          lsfile.sh 的inode值是 2408949 ; 查看一個文件或目錄的inode,要通過ls 命令的的 -i參數。


          2.10 inode 相同的文件是硬鏈接文件;


          在Linux 文件系統中,inode值相同的文件是硬鏈接文件,也就是說,不同的文件名,inode可能是相同的,一個inode值可以對應多個文件。理解鏈接文件并不難,看看例子就會了。在Linux中,鏈接文件是通過ln工具來創建的。


          2.11 創建硬鏈接,硬鏈接和源文件關系;


          用ln 創建文件硬鏈接的語法:



          # ln 源文件 目標文件

          下面我們舉一個例子,在這個例子中,我們要為sun.txt 創建其硬鏈接sun002.txt。然后看一下sun.txt和sun002.txt的屬性的變化;


          [root@localhost ~]# ls -li sun.txt 注:查看sun.txt的屬性;
          2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:這是sun.txt的屬性;
          [root@localhost ~]# ln sun.txt sun002.txt 注:我們通過ln 來創建sun.txt的硬鏈接文件sun002.txt
          [root@localhost ~]# ls -li sun* 注:我們列一下sun.txt 和sun002.txt
          2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
          2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt

          我們可以看到sun.txt在沒有創建硬鏈接文件sun002.txt的時候,其鏈接個數是1(也就是-rw-r--r--后的那個數值),創建了硬鏈接sun002.txt創建后,這個值變成了2。也就是說,我們每次為sun.txt創建一個新的硬鏈接文件后,其硬鏈接個數都會增加1。

          inode值相同的文件,他們的關系是互為硬鏈接的關系。當我們修改其中一個文件的內容時,互為硬鏈接的文件的內容也會跟著變化。如果我們刪除互為硬鏈接關系的某個文件時,其它的文件并不受影響。比如我們把sun.txt刪除后,我們還是一樣能看到sun002.txt的內容,并且sun02.txt仍是存在的。

          可以這么理解,互為硬鏈接關系的文件,他們好象是克隆體,他們的屬性幾乎是完全一樣;

          下面的例子,我們把sun.txt刪除,然后我們看一下sun002.txt 是不是能看到其內容。



          [root@localhost ~]# rm -rf sun.txt
          [root@localhost ~]# more sun002.txt

          注意:硬鏈接不能為目錄創建,只有文件才能創建硬鏈接。


          2.12 軟鏈接的創建,及軟接與源文件的關系;


          創建軟鏈接(也被稱為符號鏈接)的語法;



          # ln -s 源文文件或目錄 目標文件或目錄

          軟鏈接也叫符號鏈接,他和硬鏈接有所不同,軟鏈接文件只是其源文件的一個標記。當我們刪除了源文件后,鏈接文件不能獨立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內容了。



          [root@localhost ~]# ls -li linuxsir001.txt
          2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
          [root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
          [root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
          2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
          2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt

          解釋

          上面的例子,首先我們查看 linuxsir001.txt 的屬性,比如inode 、所屬文件種類、創建或修改時間等... ...我們來對比一下:

          首先 對比一下節點:兩個文件的節點不同;
          其次 兩個文件的歸屬的種類不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一個鏈接文件;
          第三 兩個文件的讀寫權限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的讀寫權限是 rwxrwxrwx
          第三 兩者的硬鏈接個數相同;都是1
          第四 兩文件的屬主和所歸屬的用戶組相同;
          第五 修改(或訪問、創建)時間不同;

          我們還注意到了linuxsir002.txt 后面有一個標記 ->,這表示linuxsir002.txt 是linuxsir001.txt的軟鏈接文件。

          值得我們注意的是:當我們修改鏈接文件的內容時,就意味著我們在修改源文件的內容。當然源文件的屬性也會發生改變,鏈接文件的屬性并不會發生變化。當我們把源文件刪除后,鏈接文件只存在一個文件名,因為失去了源文件,所以軟鏈接文件也就不存在了。這一點和硬鏈接是不同的;



          [root@localhost ~]# rm -rf linuxsir001.txt 注:刪除linuxsir001.txt
          [root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的屬性;
          2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
          [root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的內容;
          linuxsir002.txt: 沒有那個文件或目錄 注:得到提示,linuxsir002.txt不存在。

          上面的例子告訴我們,如果一個鏈接文件失去了源,就意味著他已經不存在了;

          我們可以看到軟鏈接文件,其實只是源文件的一個標記,當源文件失去時,他也就是存在了。軟鏈接文件只是占用了inode來存儲軟鏈接文件屬性等信息,但文件存儲是指向源文件的。

          軟件鏈接,可以為文件或目錄都適用。無論是軟鏈接還是硬鏈接,都可以用rm來刪除。rm工具是通用的。
          參考資料:http://techcenter.dicder.com/2006/0908/content_185.htm
          posted @ 2007-07-13 09:54 Lansing 閱讀(750) | 評論 (0)編輯 收藏
          寫一些關于PL/SQL的語法,免得等到用到的時候還要去亂翻。
          1。控制流程(if,while)
          2。循環(for)
          3。游標(cursor)
          4。異常處理(exception)

          1。控制流程()


          A.條件語句
          IF <statement> THEN
          ?? PL/SQL
          END IF;

          IF <statement> THEN
          ?? PL/SQL
          ELSE
          ?? PL/SQL
          END IF;

          IF
          <statement> THEN
          ?? PL/SQL
          ELSIF <statement> THEN
          ?? PL/SQL
          END IF;


          2。循環

          A.simple loop
          LOOP
          ?? SQL
          ?? EXIT WHEN <statement>;
          END LOOP;

          LOOP
          ?? SQL
          ?? IF
          <statement> THEN
          ?? EXIT;
          ?? END IF;
          END LOOP;

          B.While loop
          WHILE <statement> LOOP
          ?? SQL
          END LOOP;

          C.For loop
          FOR $counter in $low .. $high LOOP
          ?? SQL
          END LOOP


          3。游標

          在PL/SQL程序中定義的游標叫做顯式游標。

          A.顯式游標的處理由四個部分組成:
          cursor $cursorname is $Query;   --定義游標
          open $cursorname;         --打開游標
          fetch $cursorname into $othervariable  --把游標中的東西取出
          close $cursorname??? --關閉游標

          B.游標屬性
          %found?? ?? ?? 布爾型屬性,當最近一次讀紀錄成功
          ,為true.
          %nofound                失敗時,為false.
          %isopen
          %rowcount?? ?? 返回已從游標中讀取的記錄數。

          C.參數化游標

          所有的SQL語句在上下文區內部都是可執行的,因此都有一個游標指向上下文區,此游標就是所謂的SQL游標。
          與顯式游標不同,SQL游標不被程序打開和關閉。


          4.異常處理概念

          異常處理是用來處理正常執行過程中未預料的事件。如果PL/SQL程序塊一旦產生異常而又沒有指出如何處理時,程序會自動終止。
          異常處理部分放在PL/SQL的后半部分,結構為:

          EXCEPTION
          ?????? WHEN first_exception THEN <code to handle first exception>
          ?????? WHEN second_exception THEN <code to handle second exception>
          ?????? WHEN OTHERS THEN <
          code to handle second exception >? --OTHERS必須放在最后

          異常分為預定義和用戶定義兩種。
          用戶定義的異常是通過顯式使用RAISE語句來引發。如

          DECLARE
          ? e_TooManyStudents EXCEPTION;? -- 類型為Exception,用于指示錯誤條件
          ? v_CurrentStudents NUMBER(3);? -- HIS-101學生注冊當前號
          ? v_MaxStudents NUMBER(3);????? -- HIS-101學生注冊允許的最大號

          BEGIN
           /* 找出注冊學生當前號和允許的最大號 */

          ? SELECT current_students, max_students

          ??? INTO v_CurrentStudents, v_MaxStudents

          ??? FROM classes

          ??? WHERE department = 'HIS' AND course = 101;

          ? /* 檢查學生的號 */

          ? IF v_CurrentStudents > v_MaxStudents THEN

          /* 太多的學生注冊,則觸發例外處理 */

          ? RAISE e_TooManyStudents;

          ? END IF;

          EXCEPTION

          ? WHEN e_TooManyStudents THEN

          ??? /* 當太多的學生注冊,就插入信息解釋發生過錯誤 */

          ??? INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||

          ????? 'students: max allowed is ' || v_MaxStudents);

          END;


          END;

          用戶定義的的異常處理
          可以使用RAISE_APPLICATION_ERROR來創建自己的錯誤處理:
          RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
          其中
          error_number是從-20000到-20999之間的參數; error_message是相應的提示信息,小于512字節。如:

          CREATE OR REPLACE PROCEDURE Register (
          p_StudentID IN students.id%TYPE,
          p_Department IN classes.department%TYPE,
          p_Course IN classes.course%TYPE) AS
          v_CurrentStudents NUMBER;? -- 班上學生的當前號
          v_MaxStudents NUMBER;????? -- 班上學生的最大號

          BEGIN
          /* 找出學生的當前號和最大號 */
          SELECT current_students, max_students
          ?INTO v_CurrentStudents, v_MaxStudents
          FROM classes
          WHERE course = p_Course
          AND department = p_Department;

          /* 確認另外的學生是否有足夠的教室 */
          IF v_CurrentStudents + 1 > v_MaxStudents THEN
          RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
          p_Department || ' ' || p_Course);
          END IF;

          /* 加一個學生在本班 */
          ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);

          EXCEPTION
          WHEN NO_DATA_FOUND THEN
             
          RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
          ??? ?? ??
          ' doesn''t exist!');
          END Register;

          posted @ 2007-01-23 10:10 Lansing 閱讀(373) | 評論 (0)編輯 收藏
          關于ODBC數據源連接文本?

          ????????????  在《外部數據庫的連接原理》一講中我們說過,ODBC提供對多種數據庫的支持,如dBase、Access、MS?SQL?
          ????????????Server及Oracle,也就是說運用ODBC數據源中所提供的連接代碼,我們可以實現對多種數據庫的連接。以連接Access數據庫為例,ODBC數據源連接文本的格式是:
          ????????????  “Driver={數據庫驅動程序};Dbq=數據庫文件;”
          ????????????  在以上連接文本中,如果數據庫跟程序在同一目錄下,或者用變量DefaultDir指定了數據庫所在目錄,則數據庫文件可以不用全路徑名,如下即可:
          ????????????  “ODBC;DBQ=MSAccess.mdb;Driver={Microsoft?Access?Driver?(*.mdb)};”
          ????????????  如下也可:
          ????????????  “ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft?
          ????????????Access?Driver?(*.mdb)};”
          ????????????  如果數據庫跟程序不在同一目錄下,或者沒有用變量DefaultDir指定數據庫所在目錄,則數據庫文件需要用全路徑名,如下:
          ????????????  “ODBC;DBQ=E:\Quake?III?Arena\MSAccess.mdb;Driver={Microsoft?Access?
          ????????????Driver?(*.mdb)};”
          ????????????  以上所說的是連接Access數據庫的格式,那么連接其他數據庫的ODBC數據源連接文本又是怎樣的?連接不同類型的數據庫要使用不同的對應驅動程序,沒忘記吧!不同的驅動程序當然它們的參數組合也就不同了,每一種不同驅動程序都有其特定的的參數形式:?

          ????????????  ⑴、MS?Access?ODBC?DSNless?連接:
          ????????????  ☆、參數:Driver?設置值:{Microsoft?Access?Driver?(*.mdb)}
          ????????????  ☆、參數:Dbq?設置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Access?Driver?
          ????????????(*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass;?”
          ????????????  ⑵、dBase?ODBC?DSNless?連接:?
          ????????????  ☆、參數:Driver?設置值:{Microsoft?dBASE?Driver?(*.dbf)}
          ????????????  ☆、參數:Dbq?設置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?dBASE?Driver?
          ????????????(*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf;?”
          ????????????  ⑶、Oracle?ODBC?DSNless?連接:
          ????????????  ☆、參數:Driver?設置值:{Microsoft?ODBC?for?Oracle}
          ????????????  ☆、參數:Dbq?設置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?ODBC?for?
          ????????????Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass;?”
          ????????????  ⑷、MS?SQL?Server?DSNless?連接:?
          ????????????  ☆、參數:Driver?設置值:{SQL?Server};
          ????????????  ☆、參數:Server?設置值:服務器名稱
          ????????????  ☆、參數:Database?設置值:數據表名稱
          ????????????  ☆、參數:Uid?設置值:用戶名稱
          ????????????  ☆、參數:Pwd?設置值:密碼
          ????????????  ☆、例句:
          ????????????  “Driver={SQL?
          ????????????Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass;?”
          ????????????  ⑸、MS?Text?Driver?DSNless?連接:?
          ????????????  ☆、參數:Driver?設置值:{Microsoft?Text?Driver?(*.txt;?*.csv)}
          ????????????  ☆、參數:Dbq?設置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Text?Driver?(*.txt;?
          ????????????*.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist?Security?
          ????????????Info=False;?”
          ????????????  ⑹、Visual?Foxpro?DSNless?連接:
          ????????????  ☆、參數:Driver?設置值:{Microsoft?Visual?FoxPro?Driver}
          ????????????  ☆、參數:SourceType?設置值:DBC
          ????????????  ☆、參數:SourceDB?設置值:實際路徑文件名稱?
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Visual?FoxPro?
          ????????????Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;”?

          ????????????  ⑺、MySQL?DSNless?連接:
          ????????????  ☆、參數:Driver?設置值:{mysql}
          ????????????  ☆、參數:database?設置值:數據表名稱
          ????????????  ☆、參數:uid?設置值:用戶名稱
          ????????????  ☆、參數:pwd?設置值:密碼
          ????????????  ☆、例句:?
          ????????????  “driver={mysql};?
          ????????????database=yourdatabase;uid=username;pwd=password;option=16386”
          ????????????*******************************************************************
          ????????????SQL語言簡介?

          ????????????  在上一講中我們介紹了連接外部數據庫的方法,那么連接之后怎樣對外部數據庫進行讀取、顯示、增刪、更新、查詢等操作呢?這些操作需要通過外部數據庫等對象調用SQL指令才能完成。
          ????????????  ㈠、什么是SQL語言
          ????????????  SQL(Structure?Query?Languge,結構化查詢語言)是一種數據庫專用的計算機語言,不管是Oracle、MS?
          ????????????SQL?
          ????????????、Access、MySQL或其他公司的數據庫,也不管數據庫建立在大型主機或個人計算機上,都可以使用SQL語言來訪問和修改數據庫的內容。雖然不同公司的數據庫軟件多多少少會增加一些專屬的SQL語法,但大體上,它們還是遵循ASNI(美國國家標準協會)制定的SQL標準。因為SQL語言具有易學習及閱讀等特性,所以SQL逐漸被各種數據庫廠商采用,而成為一種共通的標準查詢語言。只要你學會SQL,即可操作各種數據庫如Visual?
          ????????????Foxpro、Access、dBase等等。總之,SQL語言是各種數據庫都可以使用的數據庫查詢語言。
          ????????????  SQL語言不僅僅具有查詢數據庫的功能,而且可以對數據庫完成選取、增刪、更新與跳轉等各種操作。
          ????????????  ㈡、SQL語言的組成
          ????????????  SQL語言是由命令(函數)、子句、運算符、加總函數及通配符等組成,分述如下:
          ????????????  1、命令
          ????????????  SQL的命令可分成數據定義語言與數據操作語言,數據定義語言可用來建立新的數據庫、數據表、字段及索引等,本教程不予介紹;另一為數據操作語言,可用來建立查詢表、排序、篩選數據、修改、增刪等動作。數據定義語言命令常用的有選擇、添加、刪除和修改這四種:
          ????????????  ⑴、命令:SELECT
          ????????????  中文意思:選擇
          ????????????  說明:用于找出合乎條件的記錄
          ????????????  ⑵、命令:INSERT
          ????????????  中文意思:插入
          ????????????  說明:用于增加一筆記錄或合并兩個數據表
          ????????????  ⑶、命令:UPDATE
          ????????????  中文意思:更新
          ????????????  說明:用于更正合乎條件的記錄
          ????????????  ⑷、命令:DELETE
          ????????????  中文意思:刪除
          ????????????  說明:用于刪除合乎條件的記錄
          ????????????  2、子句
          ????????????  子句是用于設定命令要操作的對象(即參數),SQL所用的子句如下:
          ????????????  ⑴、子句:FROM?
          ????????????  中文意思:數據表
          ????????????  說明:用于指定數據表
          ????????????  ⑵、子句:WHERE
          ????????????  中文意思:條件
          ????????????  說明:用于設定條件
          ????????????  ⑶、GROUP?BY
          ????????????  中文意思:分組(合并)
          ????????????  說明:用于設定分組
          ????????????  ⑷、ORDER?BY
          ????????????  中文意思:排序
          ????????????  說明:用于設定輸出的順序及字段
          ????????????  3、運算符
          ????????????  子句參數中的運算符使子句構成不同的語法格式,如“字段1='100'”、“字段1>'100'”等。運算符又分邏輯運算符與比較運算符。
          ????????????  ◇邏輯運算符如下:
          ????????????  ⑴、運算符:AND
          ????????????  中文意思:并且
          ????????????  說明:邏輯且
          ????????????  ⑵、運算符:OR?
          ????????????  中文意思:或者
          ????????????  說明:邏輯非
          ????????????  ⑶、運算符:NOT
          ????????????  中文意思:取反
          ????????????  說明:邏輯非或邏輯反
          ????????????  ◇比較運算符如下:
          ????????????  ⑴、運算符:<?說明:小于
          ????????????  ⑵、運算符:≤?說明:小于等于
          ????????????  ⑶、運算符:≥?說明:大于等于
          ????????????  ⑷、運算符:>?說明:大于
          ????????????  ⑸、運算符:=?說明:等于
          ????????????  ⑹、運算符:<>?說明:不等于
          ????????????  ⑺、運算符:BETWEEN?說明:用于設定范圍?中文意思:在...之間
          ????????????  ⑻、運算符:LIKE?說明:用于通配設定?中文意思:如同
          ????????????  ⑼、運算符:IN?說明:用于集合設定?中文意思:在...之內
          ????????????  4、加總函數
          ????????????  加總函數常常運用在命令的參數中,如:“SELECT?SUM(數學),AVG(數學)?FROM?成績單”。
          ????????????  ⑴、加總函數:AVG?
          ????????????  中文意思:平均
          ????????????  說明:用于求指定條件的平均?
          ????????????  ⑵、加總函數:COUNT
          ????????????  中文意思:數量
          ????????????  說明:用于求指定的數量
          ????????????  ⑶、加總函數:SUM
          ????????????  中文意思:和
          ????????????  說明:用于求指定條件的和
          ????????????  ⑷、加總函數:MAX
          ????????????  中文意思:最大值
          ????????????  說明:用于求指定條件的最大值
          ????????????  ⑸、加總函數:MIN
          ????????????  中文意思:最小值
          ????????????  說明:用于求指定條件的最小值
          ????????????  5、通配符
          ????????????  ⑴、通配符:%?意義:任何長度的字符串(包括0)
          ????????????  ⑵、通配符:_?意義:下劃線表示任何一個字符
          ????????????  ⑶、通配符:[]?意義:中括號表示某個范圍內的一個字符
          ????????????  在下一講將說明SQL語言是怎樣把命令(函數)、子句、運算符、及加總函數等組合在一起的。

          ????????????*************************************************************************

          ????????????嵌入式SQL的應用?

          ????????????  SQL語句可以單獨在數據庫系統本身中執行,但如果運用在其他編程工具所編制的程序中,一般不能單獨執行,而要把SQL語句嵌入到高級語言(如易語言)中使用,通過高級語言的命令和方法來調用之,此時SQL稱為嵌入式SQL。調用SQL語句的程序稱為宿主程序,在易語言中一般是把SQL語句作為宿主程序的唯一參數來直接處理。嵌入式SQL在使用上有一些規定,在易語言中目前的版本規定如下:
          ????????????  ⑴、在程序中要區分SQL語句和宿主語言的語句。在易語言中好區分,因為SQL語句形式是英文的,而易語言是中文的,但在實際應用時仍然有可能會混亂,所以易語言要把SQL語句轉化為文本型才能調用,即嵌入式SQL語句兩邊要用雙引號來標示。
          ????????????  ⑵、允許SQL語句使用宿主程序的變量,但使用時要將宿主程序的變量跟外部數據庫中表格的字段名區別開來,區別方法如下:
          ????????????  ①、在易語言中要將變量類型轉化為文本型變量才能被SQL文本相加使用,比如下面的例子中有一個叫“數字1”的整數類型變量,插入到SQL文本中是這樣表達:
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內容?+?“=”?+?到文本?(數字1))
          ????????????  ②、包含字段名的SQL文本兩邊加雙引號,變量名不能在雙引號內,如上例。
          ????????????  ⑶、要將字段名跟字段值區別開來,區別方法如下:
          ????????????  ①、對于文本類型的字段,在其字段值兩邊要加上“'”號標示其文本值,代表語法是:字段名稱=‘文本值’。如下:
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?姓名='山大王'”)
          ????????????  又如下面“查找編輯框.內容”中的字段值是文本型,嵌入式SQL語句如下:
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?姓名==”?+?“'”?+?查找編輯框.內容?+?
          “'”)
          ????????????  ②、對于數字類型的字段,在SQL語句中表示其字段值,兩邊不加符號標示,代表語法是:字段名稱=數字值。如下兩例:
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內容?+?“=”?+?查找編輯框.內容)?
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?學號=17”)
          ????????????  ③、對于日期時間類型的字段,在其字段值兩邊要加上“#”號標示其時間值,代表語法是:字段名稱=#時間值#。如下兩例:
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?入學時間?BETWEEN?#2001-01-01#?and?
          ????????????#2002-01-01#”)
          ????????????  外部數據庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內容?+?“=”?+?“#”?+?
          ????????????查找編輯框.內容?+?“#”)
          ????????????  ④、也可以將SQL語句中的字段名(尤其是中文名)可用中括號括住,如:[字段名]。
          ????????????  
          ????????????  ⑷、SQL語句要用半角輸入法輸入,否則可能會出錯。
          ????????????  那么在易語言中怎樣調用SQL語句呢?一般是在外部數據庫對象(控件)的方法中調用,試概括如下:
          ????????????  ⑴、對外部數據庫進行查詢的方法。
          ????????????  對外部數據庫的查詢就是在對外部數據庫不加編輯改動的前提下,只通過記錄集來對數據庫進行顯示、查詢、篩選、排序和記錄集的合并等操作。
          ????????????  所有查詢類的方法起源于下面這個語句,其他查詢類語句是對這個語句的調用(將此語句作為唯一的參數),該語句如下:
          ????????????  外部數據庫.查詢?(查詢類SQL語句)
          ????????????  也可這樣表達:
          ????????????  外部數據庫.查詢?(“SELECT...FROM...[WHERE]...[GROUP?BY]...[ORDER?BY]...?”)
          ????????????  該方法是對當前被打開數據庫進行數據查詢,返回的結果稱為“記錄集句柄”(即記錄集的標記)。注意當不再使用此記錄集時,必須使用“關閉記錄集”將其關閉,如果失敗,返回0。在易語言中,將以上語句等同于記錄集句柄以作為其他查詢類語句的參數。為了使該參數在所有子程序中都能應用,我們一般把它設置為整數型全局變量,并將其值設置如下:
          ????????????  記錄集句柄=外部數據庫.查詢?(查詢類SQL語句)
          ????????????  由于易語言要把SQL語句轉化為文本型才能調用,所以嵌入式SQL語句兩邊要有雙引號,例句:
          ????????????  記錄集句柄?=?外部數據庫1.查詢?(“select?*?from?chj?”)
          ????????????  ※?“chj”是外部數據庫中一個表的名稱
          ????????????  又如,欲得到排序的記錄集,應象下面這樣賦值:
          ????????????  記錄集句柄?=?外部數據庫1.查詢?(“SELECT?*?FROM?chj?ORDER?BY?語文?DESC”)
          ????????????  現將外部數據庫控件中其他的查詢類方法列舉如下:
          ????????????  ①、外部數據庫.重新查詢?(記錄集句柄)?即:
          ????????????  外部數據庫.重新查詢?(外部數據庫.查詢?(查詢類SQL語句))
          ????????????  例句:外部數據庫1.重新查詢?(外部數據庫1.查詢?(“select?*?from?chj?”))?
          ????????????  ②、外部數據庫.首記錄前?(記錄集句柄)?即:
          ????????????  外部數據庫.首記錄前?(外部數據庫.查詢?(查詢類SQL語句))
          ????????????  例句:外部數據庫1.首記錄前?(記錄集句柄)
          ????????????  ③、外部數據庫.尾記錄后?(記錄集句柄)
          ????????????  ④、外部數據庫.到首記錄?(記錄集句柄)
          ????????????  ⑤、外部數據庫.到尾記錄?(記錄集句柄)
          ????????????  ⑥、外部數據庫.到前一記錄?(記錄集句柄)
          ????????????  ⑦、外部數據庫.到后一記錄?(記錄集句柄)
          ????????????  ⑧、外部數據庫.讀?(記錄集句柄,字段名稱或位置)
          ????????????  例句:語文編輯框.內容?=?到文本?(外部數據庫1.讀?(記錄集句柄,?“語文”))
          ????????????  ⑵、對外部數據庫進行編輯的方法。
          ????????????  所謂對外部數據庫的編輯,就是變更改動外部數據庫本身,包括添加、更新、刪除等,對數據庫進行編輯不必通過記錄集。所有非查詢類SQL語句都嵌入下面這個語句來執行:
          ????????????  外部數據庫.執行?(非查詢類SQL語句)
          ????????????  ①、添加記錄,其語法如下:
          ????????????  外部數據庫.執行?(“insert?into?表名稱(字段1,字段2...)?values?(字段值1,字段值2...)?”)
          ????????????  例句:
          ????????????  外部數據庫1.執行?(“INSERT?INTO?chj?”?+?“(學號,姓名,語文,數學,英語)”?+?“?valueS?”?+?
          ????????????“(”?+?學號編輯框.內容?+?“,'”?+?姓名編輯框.內容?+?“','”?+?語文編輯框.內容?+?“','”?+?
          ????????????數學編輯框.內容?+?“','”?+?英語編輯框.內容?+?“')”)
          ????????????  ②、更新記錄,其語法如下:
          ????????????  外部數據庫.執行?(“UPDATE?表名稱?SET?字段1=字段值1,字段2=字段值2...WHERE?條件式”)?
          ????????????  例句:
          ????????????  外部數據庫1.執行?(“UPDATE?chj?SET?學號=”?+?“'”?+?學號編輯框.內容?+?“',”?+?“姓名=”?
          ????????????+?“'”?+?姓名編輯框.內容?+?“',”?+?“語文=”?+?“'”?+?語文編輯框.內容?+?“',”?+?“數學=”?
          ????????????+?“'”?+?數學編輯框.內容?+?“',”?+?“英語=”?+?“'”?+?英語編輯框.內容?+?“'?”?+?“WHERE?
          ????????????姓名=”?+?“'”?+?姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數學=”?+?數學1?+?“AND?
          ????????????英語=”?+?英語1?+?“AND?學號=”?+?學號1)
          ????????????  ③、刪除記錄,其語法如下:
          ????????????  外部數據庫.執行?(“DELETE?*?FROM?表名稱?WHERE?條件式”)
          ????????????  例句:
          ????????????  外部數據庫.執行?(“外部數據庫1.執行?(“DELETE?*?FROM?chj?”?+?“WHERE?姓名=”?+?“'”?+?
          ????????????姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數學=”?+?數學1?+?“AND?英語=”?+?英語1?+?
          ????????????“AND?學號=”?+?學號1)”)
          posted @ 2007-01-19 12:17 Lansing 閱讀(1625) | 評論 (3)編輯 收藏
          Java虛擬機

          一、什么是Java虛擬機


          Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。


          1.為什么要使用Java虛擬機


          Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平臺上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。


          2.誰需要了解Java虛擬機


          Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助于理解Java語言的一些性質,也有助于使用Java語言。對于要在特定平臺上實現Java虛擬機的軟件人員,Java語言的編譯器作者以及要用硬件芯片實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的字節碼,你也需要深入地了解Java虛擬機。


          3.Java虛擬機支持的數據類型


          Java虛擬機支持Java語言的基本數據類型如下:


          byte://1字節有符號整數的補碼
          short://2字節有符號整數的補碼
          int://4字節有符號整數的補碼
          long://8字節有符號整數的補碼
          float://4字節IEEE754單精度浮點數
          double://8字節IEEE754雙精度浮點數
          char://2字節無符號Unicode字符


          幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬件標記。操作這些原始數據類型數據的字節碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。


          虛擬機支持的其它數據類型包括:
          object//對一個Javaobject(對象)的4字節引用
          returnAddress//4字節,用于jsr/ret/jsr-w/ret-w指令
          注:Java數組被當作object處理。


          虛擬機的規范對于object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的字節碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的字節碼程序。Java虛擬機由于字節碼定義的限制似乎只能運行于32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把字節碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平臺無關性和可
          移植性。


          二、Java虛擬機體系結構


          Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。


          1.Java指令集


          Java虛擬機支持大約248個字節碼。每個字節碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當于Java程序的匯編語言。
          Java指令集中的指令包含一個單字節的操作符,用于指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單字節的操作符構成。


          虛擬機的內層循環的執行過程如下:


          do{
          取一個操作符字節;
          根據操作符的值執行一個動作;
          }while(程序未結束)


          由于指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利于提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個字節大,那么它存儲的順序是高位字節優先。例如,一個16位的參數存放時占用兩個字節,其值為:


          第一個字節*256+第二個字節字節碼指令流一般只是字節對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4字節邊界對齊。


          2.寄存器


          Java虛擬機的寄存器用于保存機器的運行狀態,與微處理器中的某些專用寄存器類似。


          Java虛擬機的寄存器有四種:
          pc:Java程序計數器。
          optop:指向操作數棧頂端的指針。
          frame:指向當前執行方法的執行環境的指針。
          vars:指向當前執行方法的局部變量區第一個變量的指針。


          Java虛擬機


          Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對于寄存器數目不多的處理器)。
          所有寄存器都是32位的。


          3.棧


          Java虛擬機的棧有三個區域:局部變量區、運行環境區、操作數區。


          (1)局部變量區 每個Java方法使用一個固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。局部變量都是32位的。長整數和雙精度浮點數占據了兩個局部變量的空間,卻按照第一個局部變量的索引來尋址。(例如,一個具有索引n的局部變量,如果是一個雙精度浮點數,那么它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范并不要求在局部變量中的64位的值是64位對齊的。虛擬機提供了把局部變量中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變量的指令。


          (2)運行環境區 在運行環境中包含的信息用于動態鏈接,正常的方法返回以及異常傳播。


          ·動態鏈接
          運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用于支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變量時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,并把變量訪問翻譯成與這些變量運行時的存儲結構相應的偏移地址。動態鏈接方法和變量使得方法中使用的其它類的變化不會影響到本程序的代碼。


          ·正常的方法返回
          如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用于恢復調用者的寄存器,并把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然后在調用者的執行環境中繼續執行下去。


          ·異常和錯誤傳播
          異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用


          ·程序使用了throw語句。
          當異常發生時,Java虛擬機采取如下措施:
          ·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
          ·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那么系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。
          ·由于虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
          ·如果找不到匹配的catch子句,那么當前方法得到一個"未截獲異常"的結果并返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那么這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那么系統將調用一個缺省的異常處理塊。
          (3)操作數棧區 機器指令只從操作數棧中取操作數,對它們進行操作,并把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用于給方法傳遞參數,并從方法接收結果,也用于支持操作的參數,并保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,并把結果壓回到操作數棧中。


          每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用于其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由字節碼驗證器強制實行。但是,有少數操作(操作符dupe和swap),用于對運行時數據區進行操作時是不考慮類型的。


          4.無用單元收集堆


          Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集算法,可以根據系統的需求使用各種各樣的算法。


          5.方法區


          方法區與傳統語言中的編譯后代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯后的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯后的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平臺無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。

          posted @ 2007-01-18 14:27 Lansing 閱讀(591) | 評論 (1)編輯 收藏
          Sun 提供的標準 Java 開發包(JDK)沒有提供創建特定于平臺的可執行文件的工具(一點都不吃驚,這是真的)。然而,其實有很多方法能夠幫助你實現這一想法。
            
            第三方工具
            一種方法是使用第三方商業工具或免費工具將 Java 應用程序打包為一個可執行文件。
            
            下面是價格和特性都不同的兩個工具,但是在 Web 上還有其它幾個第三方工具可以免費下載。
            
            http://www.bysoft.se/sureshot/exej/
            http://www.duckware.com/jexepack/
            使用商業安裝程序(installer)
            InstallAnywhere 是一個常用的安裝程序,它將管理應用程序的安裝過程,并將應用程序打包為可執行程序。
            
            使用 .jar
            除了以上方法之外,還可以將應用程序打包為一個可執行的 .jar 文件,而不是一個 .exe 文件。在這篇文章中我將不詳細介紹這種方法,你可以在這里找到一個非常棒的在線教程
            
            你需要做的最重要的一件事是指定在 .jar 文件中哪個類是應用程序的入口點。例如,對你的應用程序來說就是具有一個 public static void main(String[] args) 方法的引導類。可以在 .jar 表示文件的 Main-Class 頭部信息中提供這些信息。這個頭部信息的通用形式為:Main-Class: classname,其中 classname 是應用程序的入口點的類名稱。
            
            使用 Java Webstart
            Java Webstart 是標準 Java 運行時環境(JRE)的隱藏的寶物,自從版本 1.3 開始,JRE 就包含了 Java Webstart。它是一個簡單但功能強大且靈活的將應用程序部署到任何平臺的方法。
            
            Webstart 允許應用程序的用戶從他們的瀏覽器、電子郵件或桌面啟動和管理應用程序。Java Webstart 的一個主要優點是一旦應用程序被安裝,在每次啟動它時,它都將會檢查用戶是否在運行最新版本的應用程序。如果不是,應用程序將通過網絡裝載新版本到桌面然后執行,因此解決了軟件傳播問題。
            
            如果你的應用程序已經有很多用戶的話,這一點就尤其重要。還有很重要的一點是,它能夠檢查用戶的本地桌面環境,并能保證他們安裝了正確的 JRE 版本來運行你的應用程序。
            
            Java Webstart 本身有一系列文章,所以我建議你訪問 Java Webstart Web 站點查看更多文檔和教程。
            
            結束語
            前兩種方法可能會滿足你對這個問題的需要,但是我強烈建議你仔細看一下 Java Webstart。它是 Java 標準的一部分,并且能夠在所有平臺下一致工作。我比較喜歡這個應用程序打包方法。
          posted @ 2007-01-18 14:21 Lansing 閱讀(703) | 評論 (0)編輯 收藏
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          歡迎探討,努力學習Java哈

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Lansing's Download

          Lansing's Link

          我的博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仁寿县| 衡东县| 玉门市| 长武县| 阿鲁科尔沁旗| 阳新县| 莒南县| 楚雄市| 延安市| 榆林市| 修文县| 惠来县| 青浦区| 康平县| 阿拉尔市| 荆门市| 三河市| 长宁县| 南皮县| 安化县| 宣化县| 湘阴县| 乐都县| 牡丹江市| 资中县| 长子县| 洞头县| 海门市| 夹江县| 晴隆县| 陆良县| 丹凤县| 固原市| 永嘉县| 辽宁省| 墨江| 贺州市| 上饶市| 邢台市| 石河子市| 乾安县|