Delphi能够使用JDBC吗?(100分)

  • 主题发起人 主题发起人 HANFI
  • 开始时间 开始时间
H

HANFI

Unregistered / Unconfirmed
GUEST, unregistred user!
开发数据库程序,不可避免的要与不同的数据库打交道,于是我们使用ODBC连接数据库<br>可是,如果要实现对多种不同的数据库支持,就需要在客户端安装很多种不同的数据库客户端,<br>Java中使用JDBC非常简单,一个Jar包搞定一个数据库,DELPHI该怎么做才能使用JDBC呢<br>JNI还没有研究透,希望有同好能共同探讨这个问题
 
不明白,delphi又不是java干吗要用JDBC?
 
[:D]Web Services
 
有这个必要 ? odbc 不必 jdbc 差啊,特别在 microsoft 的平台上。<br>不过可以 delphi 可以通过 jini 与 java 通讯。google 一把 delphi jini 即可。
 
主要是想在未知的客户机环境下正常运行数据库管理软件<br>这样只要带齐JDBC驱动,JRE就可以不考虑客户环境了,一个软件足以
 
jdbc也不是万能的,如果odbc都不齐全,所以delphi也不是万能的,干吗delphi非要用jdbc,用zeoslib,sqldirect等也可以,不需要数据库环境(操作系统基本的要)
 
其实也不是非要用jdbc,只是现在Jdbc的资源比较丰富,只要找到驱动Jar宝,修改一下连接串,那么,依此设计的程序就可以在设计者不知道的情况下(无需开发者帮助)就可以支持自己想访问的数据库系统。<br>对zeoslib,sqldirect 不是很了解,网上的介绍也比较少
 
jdbc相当于odbc
 
终于在网上找到一篇delphi调用Java的文章<br>今天测试完毕,Jdbc的调用看来只能使用Java然后封装起来,返回给Delphi<br>效率等问题还有待测试<br><br>Java JNI 和 Delphi 相互調用<br><br>DELPHI 調用 JAVA 的方法,作為入門也不算複雜,只是創建JVM的環境麻煩一些。進行的順序是:<br><br>a.建立 JVM 環境<br>b.創建 JAVA 環境實例<br>c.找到 class<br>d.找到方法<br>e.調用方法<br>f.結束<br><br>如何得到 DELPHI 的 JNI 定義,請看前一篇中的說明。直接進入主題。<br><br>二、介紹 DELPHI 調用 JAVA 的方法<br>1、創建一個 DelphiCallJava.java,文件的內容:<br>public class DelphiCallJava ...{<br><br>&nbsp; &nbsp; public static String dTest(String args)...{<br>&nbsp; &nbsp; &nbsp; &nbsp; if(args==null)...{<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "您沒有輸入參數.";<br>&nbsp; &nbsp; &nbsp; &nbsp; }else ...{<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "您輸入的參數是:"+args;<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>}<br><br>這個類太簡單了,沒什麼可說的。將這個 class 保存成無 BOM 的 UTF-8 格式文件。同樣,從簡單起見,也是沒有創建包的。再用下面這個命令行進行編譯:<br>javac -encoding utf-8 DelphiCallJava.java<br><br><br>2、創建 Delphi 的EXE工程<br>JAVA 的數據類型轉換到 DELPHI 的數據類型,請看 jni.pas 中的定義。<br><br>DelphiCallJava.dpr 的代碼:<br><br><br>program DelphiCallJava;<br>...{$APPTYPE CONSOLE}<br><br>uses Windows, SysUtils, Variants, Classes, jni;<br><br>const Handle=0;<br>const strParam='傳給java的參數';<br><br>label lexit;<br>var &nbsp; &nbsp;jvm: Jni.PJavaVM;<br>&nbsp; &nbsp; tenv: Jni.TJNIEnv;<br><br>&nbsp; &nbsp; cid: Jni.JClass;<br>&nbsp; &nbsp; mid: Jni.JMethodID;<br>&nbsp; &nbsp; tmp: Jni.JString;<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; vm_args: Jni.JavaVMInitArgs; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //建立 JVM 的參數<br>&nbsp; &nbsp; options: array[0..2] of Jni.JavaVMOption;<br>&nbsp; &nbsp; env: Jni.PJNIEnv;<br>&nbsp; &nbsp; rec: Integer;<br>begin<br>&nbsp; &nbsp; options[0].optionString := '-Djava.compiler=NONE';<br>&nbsp; &nbsp; options[1].optionString := '-Djava.class.path=.'; &nbsp; // Java 工程路徑, '.' 表示黨前路徑<br>&nbsp; &nbsp; options[2].optionString := '-verbose:jni';<br><br>&nbsp; &nbsp; JNI_GetDefaultJavaVMInitArgs(@vm_args);<br>&nbsp; &nbsp; vm_args.version := Jni.JNI_VERSION_1_4;<br>&nbsp; &nbsp; vm_args.options := @options;<br>&nbsp; &nbsp; vm_args.nOptions := 3;<br>&nbsp; &nbsp; vm_args.ignoreUnrecognized := Jni.JNI_TRUE;<br><br>&nbsp; &nbsp; rec := Jni.JNI_CreateJavaVM(@jvm, @env, @vm_args); &nbsp; //建立JVM<br>&nbsp; &nbsp; if (rec = JNI_ERR ) then begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Windows.MessageBox(Handle, 'create JVM exception.', ’DelphiCallJava‘, Windows.MB_OK);<br>&nbsp; &nbsp; &nbsp; &nbsp; exit;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; tenv := TJNIEnv.Create(env);<br>&nbsp; &nbsp; if tenv=nil then Begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Windows.MessageBox(Handle, 'Please load jvm first.', ’DelphiCallJava‘, Windows.MB_OK);<br>&nbsp; &nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; &nbsp; End;<br><br><br><br>&nbsp; &nbsp; //取得 DelphiCallJava 的類ID, 如果有'包',也指定, &lt;package&gt;.&lt;class&gt;<br>&nbsp; &nbsp; cid := tenv.FindClass('DelphiCallJava');<br>&nbsp; &nbsp; if (cid = nil) then begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Windows.MessageBox(Handle, '找不到類:DelphiCallJava', ’DelphiCallJava‘, Windows.MB_OK);<br>&nbsp; &nbsp; &nbsp; &nbsp; goto lexit;<br>&nbsp; &nbsp; end;<br><br>&nbsp; &nbsp; //取得方法ID<br>&nbsp; &nbsp; mid := tenv.GetStaticMethodID(cid, 'dTest', '(Ljava/lang/String;)Ljava/lang/String;'); <br>&nbsp; &nbsp; if (tenv.ExceptionOccurred()&lt;&gt;nil) then begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Windows.MessageBox(Handle, '找不到方法(dTest)', ’DelphiCallJava‘, Windows.MB_OK);<br>&nbsp; &nbsp; &nbsp; &nbsp; goto lexit;<br>&nbsp; &nbsp; end;<br><br>&nbsp; &nbsp; //將 string 轉換成 java string<br>&nbsp; &nbsp; tmp := tenv.StringToJString(PChar(UTF8Encode(strParam)));<br>&nbsp; &nbsp; //用類ID和方法ID調用 JAVA 方法<br>&nbsp; &nbsp; tmp := tenv.CallStaticObjectMethod(cid, mid, [tmp]); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp; if (tenv.ExceptionOccurred()&lt;&gt;nil) then begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Windows.MessageBox(Handle, '調用方法(dTest)失敗!', ’DelphiCallJava‘, Windows.MB_OK);<br>&nbsp; &nbsp; &nbsp; &nbsp; goto lexit;<br>&nbsp; &nbsp; end;<br><br>&nbsp; &nbsp; //顯示結果<br>&nbsp; &nbsp; writeLn( '' &nbsp;);<br>&nbsp; &nbsp; writeLn( '傳給java的參數是:' +strParam );<br>&nbsp; &nbsp; writeLn( 'java返回:'+UTF8Decode(tenv.JStringToString(tmp)) &nbsp;);<br><br>&nbsp; &nbsp; lexit:<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; if tenv&lt;&gt;nil then begin<br>&nbsp; &nbsp; &nbsp; &nbsp; freeAndNil(tenv);<br>&nbsp; &nbsp; &nbsp; &nbsp; jvm^.DestroyJavaVM(jvm); //釋放JVM資源<br>&nbsp; &nbsp; End;<br>end.<br><br>準備命令行編譯,別忘記 jni.pas 和 jni_md.inc 放在一塊,編譯命令:<br>dcc32 /B DelphiCallJava.dpr<br><br><br>3、執行、測試<br>將這幾個命令行的編譯做成一個批處理文件:<br><br><br>@ECHO OFF<br>rem &nbsp;語言編碼名稱, 要和操作系統相對應,否則會出現亂碼.<br><br>rem jre所在的路徑,像 JAVA_HOME 一樣指向安裝的目錄<br>SET JRE_HOME=C:sdk/jdk1.5.0_15/jre<br><br>SET PATH=%PATH%;C:/Program Files/borland/Delphi7/Bin<br>REM &nbsp;jvm.dll 一定要在 PATH 所指的路徑下, 因為 Delphi 要調用 jvm.dll<br>SET PATH=%PATH%;%JRE_HOME%/bin/client<br><br><br>rem java 的編譯命令行<br>javac -encoding big5 DelphiCallJava.java<br><br>REM 編譯delphi的工程<br>dcc32 /B DelphiCallJava.dpr<br><br>rem 執行demo<br>IF EXIST DelphiCallJava.exe call DelphiCallJava.exe<br><br>PAUSE<br><br><br>保存成 DelphiCallJava.cmd ,雙擊執行,即看到結果,如圖:<br>圖1<br>可以看到,圖中前面輸出的是JVM的DEBUG信息。不輸出DEBUG 信息,就清楚多了,看下圖:<br>http://read.newbooks.com.cn/info/196658.html
 
刚刚在程序员联合开发网上注册了项目<br>有兴趣的哥们可以一起参与一下<br>http://studio.pudn.com/project.asp?id=GeneralSqlTools
 
后退
顶部