日期:2014-05-20  浏览次数:20987 次

Java应用程序连接VF数据库
场景介绍:

——Java测试连接程序
  操作系统:XP SP3
  计算机名:roydd
  测试代码:

import java.sql.*;

public class JDBCDemo 
{
public static void main(String args[]) 
{

Connection connDbf = null;  
PreparedStatement psDbf = null;  
ResultSet rsDbf = null;  
//Foxprotest为foxpro数据库所在计算机名,xsd为共享文件夹名,X1.DBF为数据文件
String filePath = "//Foxprotest/xsd/X1.DBF";
//数据库表名  
String fileName = "X1";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
String strurl = "jdbc:odbc:Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + filePath + ";Exclusive=No;";  
connDbf = DriverManager.getConnection(strurl);  
String sql = "select * from " + fileName;  
psDbf = connDbf.prepareStatement(sql);
rsDbf = psDbf.executeQuery();
while(rsDbf.next()){
System.out.println(rsDbf.getString("DZBH"));
}
}catch (ClassNotFoundException e) {
e.printStackTrace(System.err);
} catch (SQLException e) {
e.printStackTrace(System.err);
}
}
}

*******************************************************************************************

——VF数据库
  操作系统:win98
  计算机名:Foxprotest
  数据库版本: VF2.6
  自由表名: X1

******************************************************************************************

现在,我的代码在本地roydd机器上测试可以正常读取本地VF数据库,但是去读取Foxprotest上的VF数据库就报错java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Fox Error 1
我已经将Foxprotest机器上的VF数据库项目目录共享在局域网上,在我本地roydd机器上已经可以打开该共享目录。

请各位教我,我的Java应用程序为什么会报错,是路径写错,还是哪设置不到位?又或者。。。。。。

------解决方案--------------------
你在VFP中直接
use \\Foxprotest\xsd\X1.DBF
能否成功
------解决方案--------------------
我对foxpro不大了解,你的意思是在本地roydd机器的VF上输入这个命令,看能访问到Foxprotest机器上的X1.DBF文件么?

yes
在VFP的命令窗口下输入
------解决方案--------------------
VB code
java对vfp数据库的操作
--------------------------------------------
 
一:创建新的ODBC数据资源
1.windows2000的控制面板-》管理工具-》数据源(ODBC),出现下面的对话框,在对话框的”用户DSN”:选择“Visual FoxPro Database”的用户数据源,单击“添加”按纽。
2.在出现的对话框里,选择使用“Microsoft Visual Foxpro Driver”驱动程序来安装数据资源,单击“完成”按纽。
3.在弹出来的答话框,我们设置“Data Source Name”为JDBCDemo.java,“DataBase type”项为“Free Table directory”,然后在“path:”项指定JDBCDemo.java所在的目录为ODBC数据资源的目录。再选择”Options“,把Fetch data om background选上。Collating sequence: Machine
2.JDBCDemo.java

/*
 * @(#)JDBCDemo.java 2003/9/29
 */
import java.sql.*;

/**
 * 演示JDBC操作数据库的各项功能,包括表的创建
 * (CREATE)和删除(DROP),记录的插入(INSERT),
 * 选择(SELECT)和更改(UPDATE)等操作 。

 */
public class JDBCDemo 
{
public static void main(String args[]) 
{
try {
Statement stmt;
PreparedStatement pstmt;
ResultSet rs;

// 加载 jdbc-odbc 桥驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//定义JDBC URL
String url = "jdbc:odbc:JDBCDemo";

//得到与数据库的连接
Connection con DriverManager.getConnection (url);


//显示URL和连接信息
System.out.println("URL: " + url);
System.out.println("Connection: " + con);

//得到一个Statement对象
stmt = con.createStatement();

   //如果表DemoTable已经存在,则删除之,否则,抛掷一个异常
System.out.println("DROP TABLE DemoTable, if it exists.");
try{

stmt.executeUpdate("DROP TABLE DemoTable");

                   }catch(Exception e){
System.out.print(e);
System.out.println("No existing table to delete");
}

//在数据库中创建一个表DemoTable
stmt.executeUpdate("CREATE TABLE DemoTable ("+ "test_id int,test_val char(15) not null)");
System.out.println("table DemoTable created!");

//在表中插入一些值
stmt.executeUpdate("INSERT INTO DemoTable ("+ "test_id, test_val) VALUES(1,'One')");
stmt.executeUpdate("INSERT INTO DemoTable ("+ "test_id, test_val) VALUES(2,'Two')");
stmt.executeUpdate("INSERT INTO DemoTable ("+ "test_id, test_val) VALUES(3,'Three')");
stmt.executeUpdate("INSERT INTO DemoTable ("+ "test_id, test_val) VALUES(4,'Four')");
stmt.executeUpdate("INSERT INTO DemoTable ("+ "test_id, test_val) VALUES(5,'Five')");

//得到另一个Statement对象
  stmt = con.createStatement();

//查询数据库中的表DemoTable,得到以test_id排序后的所有记录,
//并存储在ResultSet对象rs中
rs = stmt.executeQuery("SELECT * from DemoTable ORDER BY test_id");

//显示表DemoTable中的所有记录
System.out.println("Display all results:");
while(rs.next())
{
int theInt= rs.getInt("test_id");
String str = rs.getString("test_val");
System.out.println("\ttest_id= " + theInt + "\tstr = " + str);
}

// 创建已准备好的语句,更新“DemoTable”表中
// 某条记录的test_val字段。
// 已准备好的语句接受两个参数。
pstmt = con.prepareStatement("UPDATE DemoTable SET test_val = ? WHERE test_id = ?");

//更改表DemoTable中的第2条记录的test_val字段的值
// 充填UPDATE语句中的“?”,并执行UPDATE语句
  pstmt.setString(1, "Hello!");//就是说第一个参数test_val为Hello!
  pstmt.setInt(2, 2);//就是说第二个参数test_id为2
  pstmt.executeUpdate();
 System.out.println("Update row number 2: OK.");

//显示表DemoTable中更新后的第2条记录
 stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * from DemoTable ORDER BY test_id");
System.out.println("Display row 2:");
if (rs.next() && rs.next())
{
int theInt= rs.getInt("test_id");
String str = rs.getString("test_val");
System.out.println("\ttest_id= " + theInt + "\tstr = " + str);}

con.close(); //关闭与数据库的连接
}catch( Exception e ) {
e.printStackTrace();
}
}
}

在windows2000+jdk1.3+Visual Foxpro 6.0上通过测试。


以下小丑修正:

以上代码是正确的,我测试了一下.只有一句:
*********************************
//得到与数据库的连接
Connection con DriverManager.getConnection (url);
********************************
掉了个=;我写了个简单的测试与数据库的连接.(ODBC的建立照以上,这里我取名为OdbcJava).这里在JDK1.5.0_07下测试通过.

import java.sql.*;

public class Jdbc {
    public static void main(String args[]) {
        Connection con;
        String driver="sun.jdbc.odbc.JdbcOdbcDriver";
        String url = "jdbc:odbc:OdbcJava";
        try{
            Class.forName(driver);
        }catch(Exception e){
            System.out.println("ODBC数据源连接错误:"+e.toString());
        }
        try{
            con=DriverManager.getConnection(url);
        }catch(Exception e){
            System.out.println("VFP数据库连接错误:"+e.toString());
        }
        System.out.println("OK..VFP数据库连接成功!");
    }
}