先说一点费话吧.....
在不久以前我还是一个非汇编不玩、非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代码。
另外优快云的BLOG好像不支持JavaScript,昨天试了很长时间都没成功!