Visual Foxpro有那些经典例题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual Foxpro有那些经典例题相关的知识,希望对你有一定的参考价值。

求几个vf的经典例题 最好有解决方法 没有不要紧 我另外去搜 谢谢了 ~~~
就是像 鸡兔同笼 水仙花数之类的

我先给你一些VF的例题看看吧!
Vfp--程序设计典型例题
Vfp题库:程序设计基础 典型例题

[例1] 在( )窗口中可以控制列表框内显示的变量种类。
A.跟踪窗口 B.监视窗口
C.局部窗口 D.调动堆栈窗口
分析:局部窗口用于显示模板程序中的内存变量,并显示它们的名称.当前取值的类型。它可以控制在列表内显示的变量类型。
答案c
例2下面选项中关于ACCEPT命令说法错误的是()
A.ACCEPT命令格式是:ACCEPT[<字符表达式>] TO<内存变量>
B.该命令只接收字符串,但是用户在输入字符串时,必须要加上定界符
C如果不输入任何内容直接按回车键,系统就会把空串赋给指定的内存变量
D如果选用<字符表达式>,那么系统就会首先显该表达式的值,作为提示信息
分析:该命令只接收字符串,但用户在输入时不需要加定界符;否则,系统会把定界符当作字符串的一部分输出.
答案:B
例3下列关于过程的说法中不正确的是
A.过程文件可以放在任何程序文件代码的后面,也可以保存在称为过程文件的单独文件里
B.过程文件只包含过程,这些过程只能被过程文件调用
C.如果需要打开多个过程文件,可以在调用过程语句中加ADDITVE,那么在打开过程文件时,
并不关闭原先已打开的过程文件
D.关闭个别过程文件的命令格式是:RELESE PROCEDURE<过程文件>
分析:过程文件只包含过程,这些过程可以被任何其它程序调用.命令格式SETPOCEDURE TO[<过程文件>][ADDITIVE]就可以打开多个过程文件.当使用不带任何文件名的SET PROCEDURE TO命令时,将会关闭所有的过程文件,使用命令RELEASE PROCEDURE<过程文件>时,将关闭指定的过程文件.
答案:B
例4 在一个程序定义了的一些变量,选出局部变量 ( )
1.PRG
PUBLIC aI
LOCAL a2,a3
SCORE'B'TO a4
LOCATE a5
A.a1 B.a2,a3
C.a4 D.a5
分析:A是公共变量,C是私有变量,D的命令和LOCATE相似,但不存在这样定义变量的命令.只有B才是定义了两个局部变量.
答案:B
例5 不需要先建立就可以使用的变量是 ( )
A.局部变量 B.公共变量
C.私有变量 D.数组
分析:私有变量是指在程序中直接使用,由系统自动隐含建立的变量.即没有通过PUBLIC 或LOCAL定义的变量.它的作用域是建立它的模块及其下属的各层模块.私有变量随着建立它的模块运行结束自动清除,不需要先建立就可以使用.
答案:C
「例6」可以设置表达式类型的断点窗口是 ( )
A.跟踪窗口 B.监视窗口 C.局部窗口 D.调用堆栈窗口
分析:监视窗口主要就是用来指定表达式在程序调试执行过程中的变化。要设置一个监视表达式,只需单击窗口中的“监视”文本框,然后输入表达式的内容,按回车键后表达式便添入文本框下方的列表框中。
答案:B
「例7」下列命令语句正确的是 ( )
A.INPUT〃请输入账号〃TO zh B.INPUT〔2001-03-01〕TO rq
C.INPUT〃T〃TO sa D.INPUT〃∧2001-03-01〃TO zh
分析:B的正确写法是:INPUT〔∧2001-03-01〕TO rq;C的正确写法是:INPUT.T.TO sa。
答案:A
「例8」阅读下列程序,该程序的运行结果是 ( )
SET TALK OFF
INPUT〃请输入A,B:〃TO A,B
IF A〈 B
T = A
A = B
B = T
ENDIF
DO WHILE B〈 〉0
T = MOD(A,B)
A = B
B = T
ENDDO
?A
SET TALK ON
RETURN
运行时输入:12,8
A.2 B.4 C.12 D.8
分析:本程序的功能是求两个数的最大公约数。方法是用两个数中较小的去除较大的,然后将除数作为一次除的被除数,余数作为下一次除的除数,反复进行这样的操作,直到余数为零时为止。则最后一次除的除数,即为所给两个数的最大公约数。
答案:B
「例9」用于说明程序中所有内存变量都是局部变量的命令是 ( )
A.PRIVATE ALL B.PUBLIC ALL
C.ALL=PRIVATE D.STORE PRIVATE TO ALL
分析:定义局部变量的语句有PRIVATE<内存变量名表>和PRIVATE ALL(LIKE/EXCEPT<通配符>)。在使用PRIVATE ALL本程序中所有内存变量都说明为局部变量。
答案:A
(例10)在Visual FoxPro中,用于建立过程文件PROGI的命令是 ( )
A. CREATE PORGI B. MODIFY COMMAND PROGI
C. MODIFY PROGI D. EDIT PROGI
分析: 在Visual FoxPro中,建立程序的命令是MODIFY COMMAND
答案:B
例11:一个过程文件最多可以包含128个过程,其文件扩展名是 ( )
A. PRG B. FOX
C. DBT D. TXT
分析: 过程文件也是一种命令文件,扩展名为.PRG
答案:A
例12:有Visual FoxPro程序如下:
SET TALK OFF
USE CJ
M - >ZF=0
DO WHILE.NOT.EOF()
M - >ZF=M - >ZF+ZF
SKIP
ENDDO
?M - >ZF
RETURN
其中数据库文件CJ.DBF中有2条记录,内容如下:
XM ZF
1 李四 500.00
2 张三 600.00
运行该程序的结果应当是
A.1100 B.1000
C.1600 D.1200
分析:分析该程序的结果时,只要理解“M - >ZF”的含义,程序就没有社么难度了。
答案:A
例13:在命令文件中,调用另一个命令文件。应使用命令
分析:在FoxPro系统中,LOAD命令用于将一个二进制文件调人内存,CALL命令执行一个已调人内存的二进制文件。PROCEDURE仅在程序中说明过程名,每个过程以PROCEDURE<过程名>开始,用PETURN结束,不是调用程序。要在命令文件中调用另一个命令文件应该使用命令DO<命令文件名>.
答案: DO〈命令文件名〉
[例14]有下列程序:
PARAMETER A,B,C,D
D=B* B-4*A*C
DO CASE
CASE D=O
CASE D〈O
D=O
CASE D〉O
D=2
CASE D=O
D=1
ENDCASE
在主程序中执行如下命令:
STORE 2 TO A,C
DO SUB WITH A,B,C,D
?D
D的值为—————
分析:执行主程序DO SUB WITH A,B,C,D时,把实参1,2,1,2传递给形参A,B,C,D。在执行过程
SUB中语句D=B*B-4*A*C后的D值为O,然后执行DO CASE/ENDCASE语句,条件CASE D=O成立,重新赋值D=1,
最后返回主程序时,把形参A,B,C,D的值1,2,1,1传给对应实参A,B,C,D此时D的值为1。
答案: 1
[例15]有如下程序:
STORE O TO N,S
DO WHILE.T.
N=N+1
S=S+N
IF N>=1O
EXIT
ENDIF
ENDDO
?”S=“+STR(S,2)
本程序的运行结果是—————
分析:本程序是无限次循环程序,有N的值来决定何时停止循环。程序的功能是求1到1O之间的所有整数之
和。可得程序运行的结果为S=55
答案:S=55
[例16]有如下程序:
*主程序:MAIN。PRG
SET TALK OFF
CLEAR
S=0
DO SUB WITH 10,S
?S
RETU
*子程序SUB。PRG
PARAMETERS D1,D2
D1=D1+D1
D2=D1*2
RETURN
执行主程序后S的值是__________。

分析:DO...WITH语句中的实在参数除了可以是变量外,还可以是任意有数或表达式。当为常数时,
直接把值传给对应的形参;当为表达式时,先求其值后把其值传给形参。主程序中变量S的初值为0,
S调用子程序SUB,将数值10和0对应传给子程序中的参数D1和D2,执行D1=D1+D1后,D1=20,再执行D2
=D1*2,D2=40,返回到主程序时D2将值回传给S。因此,在主程序执行?S时,屏幕显示40。

答案:40

[例17]设成绩库CJK.DBF中“数学”(数值型字段)这门课程的学分为4,其学分计算的方法如下:
数学>=90,学分值为4
80<=数学<90,学分值为3
70<=数学<80,学分值为2
60<=数学<70,学分值为1
数学<60,学分值为0
计算任一学生数学这门课程的学分值的程序如下:
SET TALK OFF
USE CJK
ACCEPT "输入学号:" TO XH
XF=0
LOCATE FOR学号=XH
DO CASE
CASE______
XH=40
CASE______
XH=3
CASE__________
XF=2
CASE__________
XF=1
OTHERWISE
XF=0
ENDCASE
?"学号:",XH
?"数学的学分值:",XF
USE
RETURN
分析:本程序的考核要点是DO CASE分支语句
答案:数学>=90 数学>=80 数学>=70 数学>=60
【例18】参数的两种传递方法是_______和_______。
分析:调用程序模块时,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值
给相应的形参变量。这种情形称为按值传递。如果实参是变量,那么传递的将不是变量的值,而是变量
的地址。这时形参和实参实际上是同一个变量,在模块程序中对形参变量值的改变,同样是对实参变量
值的改变,这种情形称为引用传递。
答案:TO VALUE(按值传递),REFERENCE(按引用传递)
【例19】填空完成下列程序,要求该程序能够三次从右向左显示变量S内容的字幕程序。
CLEAR
S=SPACE(80)+"关系数据库语言VFP计算机2级教程。关系数据库."
+SPACE(60)
N=0
______
I=1
DO WHILE I<160
@20,0SAY SUBSTR(S,I,80)
H=INKEY(0.1,"h")
I=I+2
_____
_____
ENDDO
分析:表达式(1)是给出循环的条件,表达试(3)给出循环体的递增形式。
答案:(1)DO WHILE N<3,(2)ENDDO,(3)N=N+1
【例20】用两种循环步长值来求1+2+3+...50的值,请将程序填写完整。
程序一:
S=0
FOR__(1)___
S=S+N
ENDFOR
? S
RETURN
程序二:
S=0
FOR__(2)___
S=S+N
ENDFOR
?S
RETURN
分析:这是一个计数循环的例子,由以上两种方法可以看出,初值和终值的设定是随步长值不同而变化
的,在程序一中,由于步长为1,所以省略了。缺省时,步长值默认为1。
答案:(1)N=1 TO 50,(2)N=50 TO 1 STEP -1
[例21] 求30!,请将程序填写完整。
程序:N=1
I=I*N
N=N+1
ENDDO
?I
分析:在进入循环前,必须组织好循环使累加器先赋初值勤,循环条件表达式中的控制变量也要根据
不同情况赋初值,因为循环的次数是和条件表达式中的控制变量所赋的初值密切相关的。循环体包括了
在循环体中的书写顺序也与循环的初始赋值有关。读者可以考虑一下,如果给N赋上班,那么DO WHILE
后面的条件表达式该怎么来写?
答案:N<=30
[例22] 为了解决在子程序和主程序之间可能会出现变量的重复使用命令_______,这样可以使主程序中
的变量暂时在子程序中无效,而不改变它的值。
分析;为了避免子程序和主程序之间变量带来的问题,可以使主程序中使用命令PRIVATE隐藏主程序
中可能存在的变量,使得在子程序中暂时无效。该命令的语法格式是:
PRIVATE<内存变量表>
答案:private<内存变量表》
例23 统计银行客房关系表中,银行代码为001,并且存款金额大于1500元的客房人数,请将程序填写完整。
程序:
clear
open银行客户关系表exclusive
browse all for银行代码=“001”
count all to kh
goto top
num=0
for(1)
if(2)
num=num+1
endif
skip
endfor
@2,30 say"银行代码为001,存款金额大于1500元的人数有:“num+””
endif
use
分析:在该例中,for语句使用了循环变量1控制操作,道德计算出了数据表中所含记录个数num,
然后把它人微言轻循环变量的终值,使循环变量从1开始,多次加入循环变量步长,直到循环变量1大于
num时才结束循环。
答案:(1)I=1 to kh step1,(2)金额>“1500”and,银行代码=“001”
例24 下例是关于参数传递的程序,求出正确结果。
程序:
clear
store 3 to a,b
store 2 to c,d
do tub with a,b,c,d
?b
store 4 to t2,t1
store 1 to t4,t3
do tub with t1,t2,t3,t3
?t4
do tub with 6,6,3,b
?b
procedure tub
PARAMETER A,B,C,D
B=A* A-4 *C* D
DO CASE
CASE B<0
B=120
CASE B>0
B=210
CASE B=0
B=100
ENDCASE
RETURN
分析: 在程序开始对A,B赋值为3,对C,D赋值为2。然后把实参A、B、C、D传递给予程序TUB,根据表达式B=A*A-4*c*D
计算出结果为-7,所以输出结果为120,同样,以下程序执行时,根据表达式的计算结果,输出依次为1和6。
答案:结果显示在3行上,依欠为120,1,6
[例25] 根据输入的半和径值,计算圆的面积,请将程序填写完整。
程序:
CLEAR
R=0
SM=0
@12,15 SAY “输入圆半径” CET R
READ
IF R=0
EXIT
ENDIF
————
@16,16 SAY“圆的面积为:”+ ALLTRIM(STR(SM))
ENDDO
RETURN
计算圆面积的函数:
FUNCTION AREA
PARAMETERS A
S=3.1415926*A*A
RETURN
分析:该语句是实现对计算圆面积函数的调用,返回值赋给变量SM。这个程序所使用的是一个自定义函数,自定义函数和
子程序的区别就是自定义函数必须返回一个函数值,而子程序没有这个限制。自定义函数的编辑方法和子程序的编辑方法相同,只是要把子程序文件名改为自定义函数名。
需要注意的几点是:自定义函数能以独立的文件存储,也可包含在调用程序中作为它的一部分。如果[FUNCTION<函数名>]缺省,这表示该函数是一个独立的文件。另外,自定义函数不能与系统函数同名,也不能与内存变量同名。
答案:SM=AREA(R)
例26 当变量I在奇偶之间变化时,求出下面程序的输出结果。
程序:
CLEAR
I=O
DO WHILE I<10
IF INT(I/2)=I/2
?"W"
ENDIF
?"T"
I=I+1
ENDDO
分析:该程序应用的是循环和条件嵌套的结构。
答案:W,T,T连续显示5次
[例27] 填空完成下列程序,仅接受输入Y和N的程序,否则程序结束。
DO WHILE .T.
WAIT "请输入Y/N" TO AS
IF UPPER(AS)< >"Y"AND UPPER(AS) < >"N"
(1)
ELSE
(1)
ENDIF
ENDDO
分析:该例是一个条件循环,选用EXIT是强制推出循环条件,执行它能够立即跳出循环,执行ENDDO
后面的语句。选用LOOP则是一种强制缩短循环的语句,其功能是终止本次循环体语句的执行,把控制转到
循环结构的开始。
答案: (1)EXIT,(2)LOOP
[例28] 当变量X的值变化时,依次显示其结果,注意循环体内的LOOP和EXIT语句。
程序:
CLEAR
X=3
DO WHILE .T.
X=X+1
IF X=INT(X/3)*3
?x
ELSE
LOOP
ENDIF
IF X>10
EXIT
ENDIF
ENDDO
RETURN
分析:INT()是取整数函数
如果循环体内有LOOP命令,那么当晕到LOOP时,就结束循环的本次执行,不再执行其后的语句,而是转回DO WHILE
处重新判断条件。
如果循环体包括EXIT命令,那么当遇到EXIT时,就结束该循环语句的执行,转去执行ENDDO后面的语句。
通常LOOP或EXIT出现在循环体内嵌套的选择语句时,根据条件来决定是LOOP回去,还是EXIT出去。
答案:依次显示为:6,9,12
[例29] 填空完成下列程序,求数绝对值的程序。
INPTU’请输入一个数:‘TO X
?STR(X)+“它的绝对值是:’+STR(f(x))
FUNCTION F
(1)
———
IF T>=0
T=T
ELSE
T=-T
ENDIF
RETURN T
分析:FUNCTION 是一个子函数,语句PARAMETERS是定义子函数里面的变量。
[例30] 如果说用DO命令来执行查询文件、菜单文件、那么<文件名>中必须名含——————。
分析:VISUAL FOXPRO 程序文件通过编辑、连接,可以产生不同的目标代码文件,这些文件具有不同的文件名。
当用DO 命令执行程序文件时,如果没有指定扩展名,系统将按下列顺序寻找程序文件的源代码或某种目标代码文件
执行:.EXE->.APP->.FXP->.PRG;但是用DO命令来执行查询文件、菜单文件时,那么<文件名>中必须包括扩展名。
答案:扩展名(.QBR或.MPR)
[例31]打开银行客户关系表,输入一个控制口令控制程序的执行,若口令为1,则把
“银行代码”为“001”的所有记录加上删除标记;若口令为2,把“银行代码”为“002”的所有记录
加上删除标记;若口令为3,把“银行代码”为“003”的所有记录加上删除标记。请将程序填写完
整。
程序:
CLEAR
USE银行客户关系表EXCLUSIVE
BROWSE LAST
WATT“请输入你的选择:(1-3)”TO yhdm
DO CASE
CASE (1)
DELETE ALL FOR 银行代码=“001”
BROWSE ALL FOR银行代码=“001”
RECALL
CASE (2)
DELETE ALL FOR 银行代码=“002”
BROWSE ALL FOR 银行代码=“002”
RECALL
CASE (3)
DELETE ALL FOR 银行代码=“003”
BROWSE ALL FOR 银行代码=“003”
RECALL
ENDCASE
BROWSE
USE
分析:该程序执行时,依次判断语句中列出的条件,当碰到取值为真时就执行该条件下的语句序列。
答案:(1)yhdm=“1”,(2)yhdm=“2”,(3)yhdm=“3”
例32 按银行帐号显示存款记录,如果该帐号不存在,则会显示空记录,请将该程序
填写完整。
程序:
CLEAR
USE KH
帐号=SPASE(5)
@10.4 SAY "请出入要查循学生的学号:” CET帐号
READ
----------------
USE
分析:该程序可以实现查询功能,但是它显示不出客户信息的异常情况,也不能向用户显示错误提示信息,而且每调用一次程序只能查询一个客户的情况。
答案:disp for 帐号=ALLTRIM(KH)
例 34 查询客户情况,如果查到了就显示客户的存款信息,查不到就什么都不显示,请将程序填写完整。
程序:
CLEAR
USE KH
帐号=SPACE(15)
@ 10,4 SAY"请输入要查询的客户信息:" GET帐号
READ
LOCATE FOR 帐号=ALLTRIM(帐号)
IF (1)
@ 6,10 SAY"帐号是"+帐号+"的客户存款情况为:"
?金额,存款类型
ENDIF
USE
分析: 这是一个单边选择的程序,如果不满足条件,就自动执行下一条语句。
答案: NOT EOF()
参考技术A VFP的参照完整性规则不包括(B )
A更新规则
B查询规则
C删除规则
D插入规则

在VFP中,学生表STUDENT中包含有通用型字段,表中通用型字段中的数据均存储到另一个文件中,该文件名为(D )
ASTUDENT.DOC B STUDENT.MEN C STUDENT.DBT D.STUDENT.PFT

在VFP中,可以对字段设置默认值的表(A)
A必须是数据库表
B必须是自由表
C自由表或数据库表
D不能设置字段的默认值

用命令“INDEX ON姓名TAG INDEX_NAME”建立索引,其索引类型是(C)
A 主索引 B 候选索引 C普通索引 D 唯一索引

VFP的字段名不能超过( B)个字符
A256 B254 C10 D255

不知道你的经典例题指的是这种题目了,还是说VFP经典系统名。
参考技术B 好多种~~你需要是关于哪一方面的?

使用 ODBC 从 Java 读取 Visual Foxpro 数据

【中文标题】使用 ODBC 从 Java 读取 Visual Foxpro 数据【英文标题】:Reading Visual Foxpro Data From Java using ODBC 【发布时间】:2013-05-05 01:30:21 【问题描述】:

我正在尝试从我的 Java 应用程序中查询一个 dbf 表。我参考了这个thread

我使用 ODBC 数据源管理器创建了一个系统数据源,我将数据源名称设置为 VFPDS,并将数据库类型设置为 .DBC,最后我将路径设置为 .dbc 文件。

以下是我的java代码:

import javax.swing.* ;
import java.awt.* ;
import java.awt.event.* ;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
// Import custom library containing myRadioListener
import java.sql.DriverManager;

public class testodbc 

public static void main( String args[] )

    try
    
        // Load the database driver
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ) ;

        // Get a connection to the database
        Connection conn = DriverManager.getConnection( "jdbc:odbc:VFPDS" ) ;

        // Print all warnings
        for( SQLWarning warn = conn.getWarnings(); warn != null; warn = warn.getNextWarning() )
        
            System.out.println( "SQL Warning:" ) ;
            System.out.println( "State  : " + warn.getSQLState()  ) ;
            System.out.println( "Message: " + warn.getMessage()   ) ;
            System.out.println( "Error  : " + warn.getErrorCode() ) ;
        

        // Get a statement from the connection
        Statement stmt = conn.createStatement() ;

        // Execute the query
        ResultSet rs = stmt.executeQuery( "SELECT * FROM pmsquoteh" ) ;//code crashes here

        // Loop through the result set
        while( rs.next() )
            System.out.println( rs.getString(1) ) ;

        // Close the result set, statement and the connection
        rs.close() ;
        stmt.close() ;
        conn.close() ;
    
    catch( SQLException se )
       se.printStackTrace();
        System.out.println( "SQL Exception:" ) ;

        // Loop through the SQL Exceptions
        while( se != null )
           se.printStackTrace();
            System.out.println( "State  : " + se.getSQLState()  ) ;
            System.out.println( "Message: " + se.getMessage()   ) ;
            System.out.println( "Error  : " + se.getErrorCode() ) ;

            se = se.getNextException() ;
        
    
    catch( Exception e )
    
        System.out.println( e ) ;
    


我遇到了这个异常:

java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Not a table.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
at UsingButtons.main(testodbc.java:38)

SQL Exception:
State  : S0002
Message: [Microsoft][ODBC Visual FoxPro Driver]Not a table.
Error  : 123

我确定数据库中存在表 pmsquoteh,并且我的机器是 64 位机器。 我究竟做错了什么 ?我将不胜感激具体的答案。

【问题讨论】:

VFP 错误“不是表格”可能意味着很多不同的事情。这可能意味着表已损坏。这也可能意味着该表已被加密。您有可用的 VFP 副本吗?如果是这样,你能打开那里的桌子吗?如果是这样,您就知道问题出在您的连接代码上。如果不是,那就是桌子。 @TamarE.Granor,我可以打开表格并查看其中的记录。所以它不是桌子 【参考方案1】:

我能够在 Windows 7 上使用 jdbc-odbc 桥访问 FoxPro 表,但需要执行一些步骤。我已经安装了 VFP 驱动程序,但我不记得我是从哪里下载的,所以我没有那个链接。

我在这里复制了 jbdc:odbc 示例中的代码:http://www.java2s.com/Code/Java/Database-SQL-JDBC/SimpleexampleofJDBCODBCfunctionality.htm。

DriverManager.getConnection 方法采用数据库 URL。要创建 URL,您需要使用 ODBC 管理器。对我来说不幸的是,我可以通过控制面板访问的 ODBC 管理器仅适用于 64 位数据源。我不知道 64 位 foxpro 驱动程序。

要生成 32 位 DSN,您需要运行 32 位 ODBC 管理器:odbcad32.exe。我的机器有几个副本。我从 C:\Windows\SysWOW64 运行了一个。转到系统 DSN 选项卡并选择 Microsoft Visual Foxpro 驱动程序。当您单击完成时,您将看到一个对话框,询问数据源名称、描述和 FoxPro 数据库或表的路径。您还必须指定是要连接到 .dbc 还是空闲表目录。您的错误消息让我怀疑您是否在 DSN 上选择了错误的选项。

我传递给 getConnection 方法的数据库 URL 是“jdbc:odbc:mydsnname”。

运行后,我收到一个错误:

[Microsoft][ODBC Driver Manager] 指定的 DSN 包含一个 驱动程序和应用程序之间的架构不匹配

这是因为我使用的是 64 位 JVM 和 32 位 DSN。我下载了一个 32 位 JVM,并且能够使用它来运行我的示例类。

我不知道你是否可以在 64 位 JVM 上设置一个开关来告诉它以 32 位运行。

【讨论】:

【参考方案2】:

我从这里使用了 JDBC 驱动程序:

http://www.csv-jdbc.com/relational-junction/jdbc-database-drivers-products/new-relational-junction-dbf-jdbc-driver/

对我来说很好用。到目前为止(大约一个小时)的测试中,它读取 MEMO 文件,并且似乎对包含 DBC 的表或空闲 DBF 没有任何问题。

不确定这个驱动程序的成本是多少。由于 VFP 已经过时,客户可能最多只支付 100 美元。

【讨论】:

【参考方案3】:

过去六个月我使用 javadbf-0.4.0.jar 没有问题。我将发布我的 Java 类和主程序。

package foxtablereader.src;

import java.sql.Connection;
import java.sql.SQLException;
import sun.jdbc.rowset.CachedRowSet;

/**
 *
 * @author kalimk
 */
public class DbfMain 

    static CachedRowSet crs;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws SQLException 

       
        DbfConnection foxconn = new DbfConnection();
        Connection connection = null;
                
        String inputTablePath = "c:\\vfp_table\\";
        connection = foxconn.connection(inputTablePath);

        String query = "SELECT * FROM TrigExport2.dbf ";

        crs = foxconn.select(query, connection);
        //crs = ft.query(query, inputTablePath);
        System.out.println(" Size " + crs.size());
        while (crs.next()) 
            System.out.println("DESC " + crs.getString("Serialnum") + " " + crs.getString("cmailcode"));
        

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        query = "SELECT * FROM TrigExports.dbf ";
        crs = foxconn.select(query, connection);

        System.out.println(" Size " + crs.size());

        int z = 1;
        while (crs.next()) 
            System.out.println(z++ + "  " + crs.getString("Serialnum") + " " + crs.getString("cmailcode"));
        

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        String queryinsert = "insert into Mcdesc (Desc,Mailcode,Del_type,Column1) values ('Kalim','KHAN', 'ERUM','KHAN')";
        foxconn.insertUpdate(queryinsert, connection);

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        String queryupdate = "update  Mcdesc set  Column1= 'Sadiqquie'  where Desc = 'Kalim'";
        foxconn.insertUpdate(queryupdate, connection);
    




package foxtablereader.src;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.jdbc.rowset.CachedRowSet;

/**
 *
 * @author kalimk
 */
public class DbfConnection 

    public Connection connection(String inputTablePath) throws SQLException 

        Connection con = null;
        //String jdbURL = "jdbc:DBF:/C:\\vfp_table\\";
        String jdbURL = "jdbc:DBF:/" + inputTablePath;
        Properties props = new Properties();
        props.setProperty("delayedClose", "0");

        try 

            Class.forName("com.caigen.sql.dbf.DBFDriver");

            try 

                con = DriverManager.getConnection(jdbURL, props);

             catch (SQLException ex) 
                Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
            

         catch (ClassNotFoundException ex) 
            Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
        

        return con;
    

    public CachedRowSet select(String cQuery, Connection con) 
        CachedRowSet crs = null;
        try 

            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(cQuery);
            crs = new CachedRowSet();
            crs.populate(rs);
            stmt.close();
         catch (Exception e) 
            System.out.println(e.getMessage());
            e.printStackTrace();
        
        return crs;
    

    public boolean insertUpdate(String cQuery, Connection con) 
        boolean crs = false;
        try 

            PreparedStatement pStmnt = con.prepareStatement(cQuery);
            crs = pStmnt.execute();
            pStmnt.close();
         catch (Exception e) 
            System.out.println(e.getMessage());
            e.printStackTrace();
        
        return crs;
    

    public int insertUpdateCount(String cQuery, Connection con) 

        int count = 0;
        try 

            Statement stmt = con.createStatement();
            count = stmt.executeUpdate(cQuery);
            System.out.println("Number of rows updated in database =  " + count);
            stmt.close();
         catch (Exception e) 
            System.out.println(e.getMessage());
            e.printStackTrace();
        
        return count;
    

    public int insertUpdateCount2(String cQuery, Connection con) 

        int count = 0;
        boolean crs = false;
        try 

            PreparedStatement pStmnt = con.prepareStatement(cQuery);
            count = pStmnt.executeUpdate(cQuery);
            pStmnt.close();
         catch (Exception e) 
            System.out.println(e.getMessage());
            e.printStackTrace();
        
        return count;
    

    public static void DBDisconnect(Connection DBCon) 
        try 

            if (DBCon != null) 
                DBCon.close();
            
         catch (SQLException e) 
            System.out.println(e.toString());
         finally 
            try 

                DBCon.close();
                //System.err.println("Fimally is always executed");
             catch (SQLException ex) 
                Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
            
        
    


【讨论】:

没有关于您从何处获得此驱动程序的信息?

以上是关于Visual Foxpro有那些经典例题的主要内容,如果未能解决你的问题,请参考以下文章

python经典例题

python经典例题

数据库与信息系统经典例题

贪心法(经典例题篇)

《数组与循环》第8节:数组与循环经典例题

分享100个经典例题(C语言)