先說一點費話吧.....
在不久以前我還是一個非彙編不玩、非C/C++不用的純微軟派的FANS,認爲只有這樣的程序員纔是懂得軟件的程序員(但坦白地說我並沒有BS過那些搞J2EE和.Net開發的同行們。),所以在我學完了JAVA的語法、做完了幾練習之後就完全拋棄了它,一直使用我引以爲榮的VC來做爲寫作平臺,即便是在一個項目中用來寫界面的代碼佔據了20%~~30%甚至更高時我也毫無怨言地接受了。
然而在現在這個金錢性社會裏,時間就是金錢,效率就是金錢,商機也是轉瞬即逝的,一切都是按低成本高效率的原則進行着。在一個項目中,可能當你還在爲用VC來使程序變得更加美觀而煞費苦心時(這簡直就不人乾的活),那些用JAVA或.Net來開的競爭對手們可能都已經完成了他們項目,這就是效率的體現,也抓住了商機。並不是VC不好,而是用它就要與底層做較多的接觸,浪費了時間,所以並不是所有的項目都可以變成你用來展示技術的平臺,這就得進行合理的估算,在一些時實性要求較高或保密性較強的時候可以用VC甚至是內聯彙編,但對於那些不太重要的(尤其是界面部分)你就應該勇敢地拿起JAVA或C#來節約時間。
所以在今天早晨8:20分時,我拿起了那本被我放置在書架上N久的《Java 2實例入門》而步入“高效“開發的行列。謝謝大家,我的費話完了(頭一偏,躲過了迎面飛來的一塊磚....好險啊!),下面就來說下正題
其實代碼是我很久以前就寫了的,當時是在用VC做一個小項目,想將數據庫的操作也加入其中,但由於不知道用VC怎麼操作,所以就用JAVA來寫了。先在數據庫中寫好了幾個存儲過程,然後用JDBC來連接,針對每一個存儲過程都寫了一個JAVA文件,而後在VC中用ShellExecte或WinExec來啓動JVM,並將編譯後的類文件作爲參數傳入,這樣就可以操作數據庫了。爲了保證JDBC的正確性,我是在JBuilder2006中作了驗證的,都可以正確執行,但一命令行下就什麼也得不到了,記得當時和一兄弟討論了很久也沒有解決,直到後來的一次偶然的操作才知道了原因:原來在JBuilder2006執行時,它會自己去搞定和數據庫的連接(這要藉助於JDBC的驅動),然而JDK的命令行卻沒有這個功能,所以即便是安裝了JDBC的驅動它也搞不定,我的解決方法是將 JDBC驅動安裝目錄/Lib目錄下的幾個.jar文件解壓後再拷貝到JAVA源文件的同目錄中,問題真的就解決了,真的可以用VC來操作數據庫了,
下面是JAVA的代碼:
//該類用於執行存儲過程Del_All_Info,刪除所有信息
//
//thinkSJ 2006-06-14
/////////////////////////////////////////////////
import java.sql.*; //導入SQL類
public class Dll_All_Info {
//類屬性
String dri = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //驅動名稱
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433"; //連接字符串
//執行存儲過程刪除所有信息
public boolean DeleteAll(){
try {
try {
Class.forName(this.dri);
} catch (ClassNotFoundException ex1) {
}
Connection con = DriverManager.getConnection(this.url, "sa", "");
java.sql.CallableStatement cs = con.prepareCall(
"{call SaveInfo..Del_All_Info}"); //該存儲過程沒有返回值
cs.execute() ;
con.close(); //關閉連接
return true;
} catch (Exception ex) {
ex.printStackTrace() ;
return false;
}
}
public static void main(String[] args) {
Dll_All_Info delAll = new Dll_All_Info() ; //初使化,並連接到數據庫
delAll.DeleteAll(); //執行
}
}
好,再來貼一段執行有參存儲過程的代碼 :
//該類用於執行存儲過程Del_From_Tab @Info_ID int , @Result int output
//
//thinkSJ 2006-06-15
//////////////////////////////////////////////////////////////////////
import java.sql.*; //導入SQL類
public class Del_By_ID {
//類屬性
String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //驅動名稱
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433"; //連接字符串
private Connection con = null; //數據庫連接
int Info_ID ; //刪除的ID號
//構造函數
public Del_By_ID(int id)
{
Open_DB(this.driver,this.url);
this.Info_ID = id; //在構造函數中指定要刪除的ID號
}
//打開數據庫連接
public boolean Open_DB(String driver, String url) {
try {
Class.forName(driver); //裝載驅動(jdbc)
con = DriverManager.getConnection(url, "sa", ""); //連接數據庫
//得到連接時,連接自動打開
return true;
} catch (Exception ex) {
return false;
}
}
//關閉到數據庫的連接
public boolean Close_DB() {
try {
con.close();
return true;
} catch (SQLException ex) {
return false;
}
}
public int DelID(int Info_ID){
int nRet = 0;
if (Info_ID <=0)
return nRet;
try {
java.sql.CallableStatement cs = this.con.prepareCall(
"{call SaveInfo..Del_From_Tab(?,?)}");
cs.setString(1,""+Info_ID);
cs.setString(2,""+nRet);
cs.execute() ;
return 1;
} catch (SQLException ex) {
return 0;
}
}
public static void main(String[] args) {
int id = 3;
Del_By_ID del = new Del_By_ID(id) ; //新建並打連接
int ret = del.DelID(del.Info_ID) ; //執行並判斷返回值
del.Close_DB() ; //關閉連接
}
}
下面這段代碼是用於執行有返回值的存儲過程:
//用於執行存儲過程Get_All_Info
//
//thinkSJ 2006-06-15
/////////////////////////////////////////////////////
import java.sql.*;
import java.util.ArrayList;
public class Get_Info {
//類屬性
String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //驅動名稱
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433"; //連接字符串
private Connection con = null; //數據庫連接
//構造函數
public Get_Info(){
this.Open_DB(this.driver ,this.url) ;
}
//打開數據庫連接
public boolean Open_DB(String driver, String url) {
try {
Class.forName(driver); //裝載驅動(jdbc)
con = DriverManager.getConnection(url, "sa", ""); //連接數據庫
//得到連接時,連接自動打開
return true;
} catch (Exception ex) {
return false;
}
}
//關閉到數據庫的連接
public boolean Close_DB() {
try {
con.close();
return true;
} catch (SQLException ex) {
return false;
}
}
//得到信息
public ArrayList Get_Info(){
ResultSet rs = null; //結果集
ArrayList al = new ArrayList() ;//初使化鏈表
try {
java.sql.CallableStatement cs = this.con.prepareCall(
"{call SaveInfo..Get_All_Info}");
rs = cs.executeQuery() ;
while (rs.next()) {
al.add(""+rs.getInt(1) ); //將數據保存到鏈表中
al.add(rs.getString(2) );
al.add(rs.getString(3) );
}
rs.close() ;
} catch (SQLException ex) {
try{
rs.close();
}catch(Exception ex1){
}
ex.printStackTrace() ;
}
return al;
}
public static void main(String[] args) {
Get_Info get_info = new Get_Info(); //新建並建立連接
ArrayList al = new ArrayList();
al = get_info.Get_Info(); //得到返回值
for(int i =0;i < al.size();i++){
System.out.print(al.get(i) + " ");
i++;
System.out.print(al.get(i) + " ");
i++;
System.out.println(al.get(i));
}
get_info.Close_DB() ; //關閉連接
}
}
最後這段代碼也是用於執行有參存儲過程的:
//用於執行存儲過程Save_Into_Tab @a varchar(256)
//
//thinkSJ 2006-06-15
///////////////////////////////////////////////////
import java.sql.*;
public class Save_Info {
//類屬性
String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //驅動名稱
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433"; //連接字符串
String Infomation = null; //信息
String Date = null; //日期
private Connection con = null; //數據庫連接
//構造函數
public Save_Info(String s,String d){
this.Open_DB(this.driver ,this.url) ;
this.Infomation = s; //在構造函數中指定要保存的信息
this.Date = d;
}
//打開數據庫連接
public boolean Open_DB(String driver, String url) {
try {
Class.forName(driver); //裝載驅動(jdbc)
con = DriverManager.getConnection(url, "sa", ""); //連接數據庫
//得到連接時,連接自動打開
return true;
} catch (Exception ex) {
return false;
}
}
//保存信息
public void Save(String sInfo,String sDate){
try {
java.sql.CallableStatement cs = this.con.prepareCall(
"{call SaveInfo..Save_Into_Tab(?,?)}");
cs.setString(1,sDate);
cs.setString(2,sInfo);
cs.execute() ;
} catch (SQLException ex) {
}
}
//關閉到數據庫的連接
public boolean Close_DB() {
try {
con.close();
return true;
} catch (SQLException ex) {
return false;
}
}
public static void main(String[] args) {
String s = "Tell me!";
String d = "2006-06-15";
Save_Info save_info = new Save_Info(s,d); //新建並打開連接
save_info.Save(save_info.Infomation,save_info.Date) ;
save_info.Close_DB() ; //關閉數據庫
}
}
這是咖啡館開業後的第一段JAVA代碼。
另外CSDN的BLOG好像不支持JavaScript,昨天試了很長時間都沒成功!