当前位置:文档之家› VFP学习笔记2

VFP学习笔记2

·ReadExpression方法

返回在属性窗口中为一个属性值输入的表达式。设计和运行时可用。

Object.ReadExpression(cPropertyName)

参数

cPropertyName 指定要返回其表达式的属性的名称。

·ReadMethod 方法

返回指定方法的文本。设计时可用。

Control.ReadMethod(cMethod)

参数

cMethod 指定方法的名称。

·WriteExpression 方法

写一个表达式到一个属性。设计和运行时可用。

Object.WriteExpression[cPropertyName, cExpression]

参数

cPropertyName 指定要写入表达式的属性的名称。

cExpression 指定一个要作为表达式被写入这个属性的字符串。

·WriteMethod 方法

将指定的文本写入指定的方法。仅设计时可用。

Control.WriteMethod(cMethodName, cMethodText [, lCreateMethod [, nVisibility [, cDescription ]]] )

参数

cMethodName 指定将被写入文本的方法名。

cMethodText 指定要被写入方法的文本。

lCreateMethod

指定当方法不存在时是否要创建。由于这个方法仅在设计时可用,所以你必须在使修改生效之前先保存这个表单或类。

255 个字符。

【054】有关SQL命令、函数

·设置表或临时表的属性

CursorSetProp(“Buffering”,3|5,Alias|WorkArea)

·放弃对缓冲行、缓冲表或临时表的修改

TableRevert(.T.|.F., Alias|WorkArea)

.T.若启用表缓冲,则放弃对所有记录的修改。

.F.若启用表缓冲,则放弃当前记录的修改。

TableTpdate(0|1|2,[.T.|.F.[, Alias|WorkArea[,ErrorArray]]])

0 若启用行缓冲,只实施当前记录。

1 若启用表缓冲,则实施所有记录;若启用行缓冲,则实施当前记录。

2 方式和1的情况一样,只是不产生错误。若包含错误数组,则创建错误数组。

.T. 覆盖其它用户的修改。

·取消一条正在执行的SQL语句

SQLCancel(hsql)

Hsql 链接句柄

返回值:1 成功,-1连接级错误,-2环境级错误。

·把指定数据源表的列名及有关信息存储到VFP临时表中

SQLColumns(hsql,tblname[,FOXPRO|NATIVE][,temptbl])

返回值:1 成功,0仍在执行,-1连接级错误,-2环境级错误。

SQLCommit(hconn)

返回值: 1 成功,-1其他

·建立连接,返回连接句柄

SQLConnect()--建立对数据源的连接。有两种版本的语法。

SQLCONNECT([nStatementHandle])

SQLCONNECT([cConnectionName | cDataSourceName [, cUserID [, cPassword ]][, lShared]])

参数

nStatementHandle

指定对nStatementHandle 表示的基本共享连接要创建的新语句句柄。新语句句柄使

用nStatementHandle 提供的设置,而不是使用默认设置。

注意:

不能对不共享的连接创建新语句句柄。如果试图依靠非共享连接创建新语句句柄,Visual FoxPro 将会产生错误。

也可以使用SQLCONNECT( ) 在用SQLSTRINGCONNECT( ) 打开的共享连接上获得新语

句句柄。

cConnectionName

指定由CREATE CONNECTION 命令创建的命名连接。当使用CREATE CONNECTION 或

连接设计器(Connection Designer)创建命名连接时,可以通过指定数据源名称、用户ID

和密码来配置该连接。当在SQLCONNECT( ) 中将该命名连接用作cConnectionName

时,可以对可选参数cUserID 和cPassword 传递不同于命名连接的值。这些传递值被

用于替代cConnectionName 所指定命令连接中的用户ID 和密码。例如,假设您使用CREATE CONNECTION 或Connection Designer 创建了叫myNamedConnection 的命名

连接,并指定了命名连接的myUserID 和myPassword 值。对于SQLCONNECT( ),可

以象下列代码那样,将myNamedConnection 指定为cConnectionName,然后将myAltUserID 和myAltPassword 指定为另一个用户ID 和密码:

复制代码

SQLCONNECT("myNamedConnection", "myAltUserID", "myAltPassword")

然而,如果通过CREATE CONNECTION 或Connection Designer 使用连接串创建命名连

接,在SQLCONNECT( ) 中使用该命名连接,并试图将可选的用户ID 和密码参数传递

给SQLCONNECT( ),Visual FoxPro 会产生相应的错误信息。当创建新共享连接时,cConnectionName 参数会引用当前数据库容器(DBC)中的命名连接。当基于现有共享连

接创建新语句句柄时,cConnectionName 参数会引用前面以共享模式打开的连接。如

果使用cConnectionName 参数,而不使用lShared 参数,或使用其值为False (.F.) 的lShared 参数,将总是创建不共享的新连接。当使用cConnectionName 时,如果lShared 为True (.T.),而命名连接已经以共享模式打开,则所提供的用户名和密码应

当匹配先前使用的值。否则,Visual FoxPro 会产生相应的信息。

cDataSourceName

指定Odbc.ini 文件中定义的数据源名。也可以从选择连接或数据源对话框中选择数

据源,该对话框在调用不带任何其他参数或只带lShared 参数的SQLCONNECT( ) 时出

现。

cUserID

指定用于登录数据源的用户标识。

cPassword

指定获得对数据源访问的密码。

lShared

数值型数据类型。如果成功连接到数据源,SQLCONNECT( ) 会返回作为语句句柄的正的非零数字值。如果不能产生连接,SQLCONNECT( ) 会返回–1。

提示:

应当将该语句句柄存储在内存变量中,并在后来需要连接句柄的函数调用中使用该变量。

说明

SQLCONNECT( ) 和SQLSTRINGCONNECT( ) 函数返回的是作为语句句柄而不是连接句柄的数字值。虽然不能直接获得连接句柄,但仍然可以通过将连接语句句柄和串("Shared")作为参数传递,使用SQLSETPROP( ) 和SQLGETPROP( ) 函数设置和获得连接属性。所有其他的SQL 函数都使用语句句柄来代替连接句柄。

如果发出了象SQLCONNECT(cConnectionName, .T.) 这样的语句,而带有同样名称的共享连接已经打开,那么该连接的设置不会被更改为数据库容器(DBC)中该连接所存储的设置。然而,新语句句柄将会使用DBC 中已声明的设置。

注意:

必须要废止Open Database Connectivity (ODBC) 登录对话框以支持SQL pass through 和Microsoft Transaction Server。要废止ODBC login 对话框,请使用SQLSETPROP(nStatementHandle, 'DispLogin', 3) 语句,cStatementHandle 是SQLCONNECT( ) 返回的语句句柄。也可以在连接设计器中废止ODBC login 对话框。示例

示例 1

下面示例假定叫MyFoxSQLNT 的ODBC 数据源存在并且可用。SQLCONNECT( ) 返回的数字值被存储在名为gnConnHandle 的变量中。

如果成功连接到数据源,SQLCONNECT( ) 会返回正数,显示对话框,并调用SQLDISCONNECT( ) 断开与数据源的连接。

如果不能连接到数据源,SQLCONNECT( ) 会返回负数并显示信息。

复制代码

STORE SQLCONNECT('MyFoxSQLNT', 'myUserID', 'myPassword') TO gnConnHandle

IF gnConnHandle <= 0

= MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error')

ELSE

= MESSAGEBOX('Connection made', 48, 'SQL Connect Message')

= SQLDISCONNECT(gnHandle)

ENDIF

示例 2

并且SQLCONNECT( ) 会创建作为共享的连接。

复制代码

SQLCONNECT(.T.)

SQLCONNECT( myConnectionName, .T. )

SQLCONNECT( myDataSourceName, myUserID, myPassword, .T. )

示例 3

下面示例中的每条语句都创建了基于现有共享连接的新语句句柄。

复制代码

SQLCONNECT( nStatementHandleValue )

SQLCONNECT( myConnectionName, .T. )

·终止连接

SQLDisconnect(hconn)

返回值: 1 成功,-1连接级错误,-2环境级错误。

·SQL语句送入数据源处理

SQLExec()

发送一个处理过的SQL 语句到数据源。

SQLEXEC(nStatementHandle [, cSQLCommand [, cCursorName[, aCountInfo]]])

参数

nStatementHandle

指定由SQLCONNECT( ) 函数返回的、要发送到到数据源的语句句柄。更多的信息,请参见SQLCONNECT( ) 函数。

cSQLCommand

指定送入数据源的SQL 语句。SQL 语句中可以包含一个参数化的WHERE 子句,该子句创建一个参数化的视图。所有WHERE 子句中的参数必须在发出SQLEXEC() 之前定义。例如,如果参数是内存变量,那么该内存变量必须在SQLEXEC() 发出之前创建并初始化。有关创建参数化视图的详细内容,请参阅如何创建参数化视图。可以在SQL 语句中包含表达式。Visual FoxPro 在发送它们到数据源之前求值所有的SQL 语句中的表达式。Visual FoxPro 可以求值内存变量名, 函数调用, 和参数中用括号括起来的表达式。

cCursorName

指定Visual FoxPro 临时表的名称,结果集合将送入该临时表中。如果不包含临时表名,Visual FoxPro 使用默认名SQLRESULT。对于多个结果集合,通过在第一个临时表的名称后追加一个递增的数值构成新临时表名。

aCountInfo

指定由行数信息装配的数组名。如果数组不存在, 就创建它。数组有两列: 1 –别名, 2 –

数值型。如果存在多个结果集合,SQLEXEC( ) 返回结果集合的数目。如果SQLEXEC( ) 仍在执行,SQLEXEC( ) 返回0;当SQLEXEC() 结束时,返回1;如果发生连接级错误,SQLEXEC( ) 返回-1。

说明

如果你要传递的SQL 语句太长, 检查它是否超过了Visual FoxPro 串长的最大限度255 字符。太长的串会产生"命令中含有不能识别的短语或关键字。" 错误。但是, 如果你把它们分割到多个相连的串中, 你可以传递长的SQL 语句。例如: 复制代码

lnRetVal = SQLEXEC(lnHandle, "SELECT " + ;

"FROM " + ;

"WHERE ")

如果SQLEXEC( ) 用于执行一个用SQLPREPARE( ) 准备的SQL 语句, 只需要连接句柄参数nStatementHandle。cSQLCommand 和CursorName 参数可以省略。更多的信息,请参见SQLPREPARE( ) 函数。

如果SQL 语句产生一个结果集合,那么SQLEXEC() 将该结果集合存入指定的Visual FoxPro 临时表中;如果SQL 语句产生两个或多个结果集合,同时SQLSETPROP() 设置为 1 (批处理方式),可以通过SQLSETPROP( )函数设置BatchMode 选项为0,并且在每次调用SQLMORERESULTS( )函数时更改临时表的名称来命名每个结果集合。SQLEXEC() 是既能同步执行又能异步执行的四个函数之一。SQLSETPROP() 异步设置决定它们是同步执行还是异步执行。在异步方式下,必须重复调用SQLEXEC() 直到返回一个非零值( 0 表示仍在执行)。

示例

以下示例展示不同的方法使用SQLEXEC( ) 来执行ad-hoc 查询并调用或创建存储过程:

CLEAR

LOCAL lnConn

LOCAL lnPercent AS Int && Input parameters must be typed.

LOCAL lnOutput

lnPercent = 50

lnOutput = 0

* Make connection, assuming a local trusted connection.

lnConn = SQLCONNECT('local')

IF m.lnConn > 0 && Success.

* Set the active database to PUBS.

SQLEXEC(m.lnConn, 'use pubs')

* Execute SELECT statement.

SQLEXEC(m.lnConn, 'SELECT * FROM authors', 'PubAuthors')

BROWSE

* Execute INSERT statement, get value of identity field.

SQLEXEC(m.lnConn, "INSERT INTO JOBS (job_desc, min_lvl, max_lvl);

VALUES ('Developer',75,150)")

SQLEXEC(m.lnConn, "SELECT SCOPE_IDENTITY()", "job_id")

? "ID for added Job is " + LTRIM(STR(job_id.exp))

* Execute DELETE statement. Get number of records affected.

SQLEXEC(m.lnConn, "DELETE FROM JOBS WHERE job_desc ='Developer'")

SQLEXEC(m.lnConn, "SELECT @@ROWCOUNT", 'rowcount')

? rowcount.exp, "record(s) deleted"

* Call a stored procedure with no parameters.

SQLEXEC(m.lnConn, 'sp_who', 'activeusers')

BROWSE

* Execute stored procedure with an INPUT parameter.

SQLEXEC(m.lnConn, 'exec byroyalty ?lnPercent','HalfOffAuthors')

* Create temp stored procedure with OUTPUT parameter and call it.

SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc @outparam int OUTPUT AS;

SELECT @outparam=100")

SQLEXEC(m.lnConn, "exec #myProc ?@lnOutput")

? m.lnOutput

* Create a temp stored procedure with INPUT and OUTPUT parameters

* and call it.

SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc2 " + ;

"@inputparam INT, " + ;

"AS SET @outparam=@inputparam*10")

SQLEXEC(m.lnConn, "exec #myProc2 ?lnPercent, ?@lnOutput")

? m.lnOutput

* Get version information.

SQLEXEC(m.lnConn, 'SELECT @@VERSION','SQLVersion1')

? STRTRAN(SQLVersion1.Exp,CHR(0))

* Disconnect.

SQLDISCONNECT(m.lnConn)

ELSE

? "Unable to connect to SQL Server"

ENDIF

RETURN

·返回活动链接的当前设置

SQLGETPROP( ) 函数

返回一个活动连接的当前设置或默认设置。

SQLGETPROP(nStatementHandle, cSetting)

参数

nStatementHandle

指定由SQLCONNECT( ) 返回的数据源语句句柄。如果指定nStatementHandle 为0, SQLGETPROP( ) 则返回环境设置。

cSetting

指定设置。关于你可以指定设置的一个列表,请参见SQLSETPROP( ) 函数。

返回值

字符、数值或逻辑型数据类型。SQLGETPROP( ) 返回一个活动连接的当前或默认设置。如果发生连接级别错误SQLGETPROP( ) 则返回-1, 如果发生环境级别错误则返回-2。示例

下面示例用SQLCONNECT( ) 来显示选择连接或数据源对话框。选择一个数据源, 测试该数据源连接。然后该示例使用SQLGETPROP( ) 和数据源的cSetting 显示结果。

复制代码

CLOSE ALL

CLEAR ALL

CLEAR

nHandle=SQLCONNECT()

IF nHandle > 0

cSource= SQLGETPROP(nHandle, "datasource")

=MESSAGEBOX("Current Data Source = "+cSource,0,"Connection Results")

ELSE

=MESSAGEBOX("Connection Error = " + ;

ALLTRIM(STR(nHandle)),0,"Connection Results")

ENDIF

·如果存在多个结果集合,则将另一个结果集合复制到Visual FoxPro 临时表中。

SQLMORERESULTS( ) 函数

SQLMORERESULTS(nStatementHandle [, cCursorName [, aCountInfo]]))

参数

nStatementHandle

指定由SQLCONNECT( ) 返回的数据源的语句句柄。

cCursorName

指定结果集要发送至的Visual FoxPro 临时表名。如果未指定临时表名, Visual FoxPro 使用默认的名字SQLRESULT。对于多个结果集, 新的临时表名是在第一个临时表名后添加递增的顺序数。

aCountInfo

指定要用行数信息填充的数组名。如果数组不存在就创建它。数组有两列: 1 – Alias, 2

数值型。如果SQL 语句仍在执行SQLMORERESULTS( ) 返回0, 执行结束返回1, 如果未找到更多的数据返回2。在非批处理模式中, SQLMORERESULTS( ) 会在各成功调用SQLEXEC( ) 后被调用, 直到SQLMORERESULTS( ) 返回 2 (未找更多数据)。SQLSETPROP( ) 批模式选项设置确定SQLEXEC( ) 是否在批模式执行了一条SQL 语句。如果发生连接级错误SQLMORERESULTS( ) 返回– 1, 如果发生环境级错误返回– 2。

说明

SQLMORERESULTS( ) 确定在非处理模式下用SQLEXEC( ) 执行一条SQL 语句时是否有多个结果集。如果有多个结果集, 它们被复制到一个Visual FoxPro 临时表, 一次一个结果集。

SQLMORERESULTS( ) 是既能同步执行又能异步执行的四个函数之一。SQLSETPROP() 异步设置决定它们是同步执行还是异步执行。在异步方式下,必须重复调用SQLMORERESULTS( ) 直到返回一个非零值( 0 表示仍在执行)。

示例

以下示例假定SQLCONNECT( ) 成功发布了, 且它的返回值保存在一个名为gnHandle 的变量中。用SQLSETPROP( ) 来设置BatchMode 属性为False (.F.), 这样可以获取单独的结果集。

SQLMORERESULTS( ) 运行了两次来创建两个包含SQLEXEC( ) 查询结果的临时表。SET 用于显示视图窗口和SQLEXEC( ) 创建的临时表。

复制代码

= SQLSETPROP(gnHandle, 'BatchMode', .F.) && Individual result sets

= SQLEXEC(gnHandle, 'SELECT * FROM authors;

SELECT * FROM titles')

= SQLMORERES(gnHandle) && First result set

= SQLMORERES(gnHandle) && Second result set

·执行前的准备

SQLPREPARE( ) 函数

用SQLEXEC( ) 为执行远程数据准备一个SQL 语句。

SQLPREPARE(nStatementHandle, cSQLCommand, [cCursorName])

参数

nStatementHandle

指定由SQLCONNECT( ) 返回的数据源的语句句柄。

cSQLCommand

指定传递到数据源的SQL 语句。

该SQL 语句可以包含一个参数化的WHERE 子句,创建一个参数化视图。WHERE 子句中的所有参数必须在SQLPREPARE( ) 执行前事先定义。例如,如果该参数是一个变量,那么该变量必须在SQLPREPARE( ) 执行前被创建和初始化。关于参数化视图的更多信息, 请参见如何创建参数化视图。

cCursorName

指定发送到结果集中的Visual FoxPro 临时表名。SQL 语句执行后返回的查询结果将被保存在这个表中。如果不包含临时表名,Visual FoxPro 将用SQLRESULT 作为默认表名。对于多个结果集,新建的临时表名可由通过添加一个递增的数字到第一个临时表名中产生。

返回值

数值型

说明

编译后,可被SQLEXEC( ) 执行。如果SQLEXEC( ) 用来执行一个用SQLPREPARE( ) 准备的SQL 语句,只需SQLEXEC( ) 中的语句句柄。

示例

复制代码

gcAuthor = 'Smith'

= SQLPREPARE(gnHandle, 'SELECT * FROM authors; WHERE au_lname = ?gcAuthor')

= SQLEXEC(gnHandle)

...

gcAuthor = 'Jones'

= SQLEXEC(gnHandle)

·取消当前事务所做的更改

SQLROLLBACK( ) 函数

取消当前事务处理期间所做的任何更改。

SQLROLLBACK(nStatementHandle)

参数

nStatementHandle

指定由SQLCONNECT( ) 返回的数据源语句句柄。

返回值

数值型。如果事务回滚成功,SQLROLLBACK() 返回1;否则,返回-1。如果SQLROLLBACK( ) 返回-1,可以使用AERROR( ) 确定该事务不能回滚的原因。

说明

如果人工事务处理有效(SQLSETPROP( ) 的Transactions 属性设置成“人工”),就可以将多个更新发送到远程表中,这些更新可以用SQLROLLBACK( ) 全部回滚。

可以用SQLCOMMIT( ) 提交更新。

示例

下面的示例假定已经成功发出SQLCONNECT( ),并且其返回值存入一个名为gnHandle 的内存变量。SQLSETPROP( ) 将Transactions 属性设置成 2 (人工),以允许使用SQLCOMMIT( ) 和SQLROLLBACK( )。

示例中用SQLEXEC( ) 修改了表authors,并用SQLROLLBACK( ) 取消对该表的更改。

复制代码

= SQLSETPROP(gnHandle, 'Transactions', 2) && manual

= SQLEXEC(gnHandle, "INSERT INTO authors (au_id, au_lname);

VALUES ('aupoe', 'Poe')")

= SQLROLLBACK(gnHandle)

·指定一个活动链接的设置

SQLSETPROP( ) 函数

指定一个活动连接的设置。使用SQLSETPROP( ) 在连接级别上指定设置。若要在环境级别指定Visual FoxPro 默认设置,用0 作为连接语句句柄。

SQLSETPROP(nStatementHandle, cSetting [, eExpression])

nStatementHandle

指定由SQLCONNECT( ) 返回的指向数据源的语句句柄。cSetting

对cSetting 标明的设置指定值。如果省略了eExpression 参数,则还原成设置的默认值。

返回值

数值型。如果调用成功,SQLSETPROP() 返回1;否则,如果发生连接级别错误则返回-1,发生环境级错误则返回-2。

说明

可用SQLGETPROP() 返回指定设置的当前值。

注意:

必须使Open Database Connectivity (ODBC) 登录对话框失效来支持SQL pass through 和Microsoft Transaction Server。若要使ODBC 登录对话框失效,可使用SQLSETPROP 语句(cStatementHandle, 'DispLogin', 3),此处cStatementHandle 是用SQLCONNECT( ) 返回的语句句柄。ODBC 登录对话框也可以在连接设计器中禁止。ConnectTimeOut 选项只能在Visual FoxPro 级别上设置,而不能在连接级别上使用。

所有其他选项既可在连接级别,也可在Visual FoxPro 级别上进行设置,每个在Visual FoxPro 级别的设置作为随后连接的默认值。

示例

以下示例展示如何用SQLSETPROP( ) 来设置当前连接包的大小。SQLCONNECT( ) 显示

选择连接或数据源对话框来选择一个连接, 然后测试连接。设置包大小; 测试设置; 并且显示结果。

复制代码

CLOSE ALL

CLEAR ALL

CLEAR

nHandle=SQLCONNECT()

IF nHandle > 0

nSet=SQLSETPROP(nHandle, "PacketSize", 2048 )

IF nSet > 0

=MESSAGEBOX("PacketSize was set to 2048",0,"Connection Results") ELSE

=MESSAGEBOX("Error setting PacketSize",0,"Connection Results") ENDIF

ELSE

=MESSAGEBOX("No Connection",0,"Connection Results")

ENDIF

=SQLDISCONNECT(nHandle)

·连接串建立连接

SQLSTRINGCONNECT( ) 函数

用连接串建立和数据源的连接。

SQLSTRINGCONNECT([lShared] | [cConnectString [, lSharable]])

参数

lShared

指定一些ODBC 驱动程序需要的数据源连接字符串,Visual FoxPro 将该连接字符串传递给ODBC 驱动程序。有关数据源连接字符串的详细内容,请参阅ODBC 驱动程序的文档。也可以从选择连接或数据源对话框选择一个数据源, 它在你不带cConnectString 参数调用SQLSTRINGCONNECT( ) 时出现。

lSharable

指定cConnectString 中指定的数据源是否有一个共享连接。

返回值

数值型。如果成功连接到数据源上,SQLSTRINGCONNECT() 返回一个正的、非零的语句句柄。如果不能连接SQLSTRINGCONNECT( ) 返回-1。

提示:

应该将这个语句句柄存入一个内存变量,在随后需要连接句柄的函数调用中使用该变

说明

SQLCONNECT( ) 和SQLSTRINGCONNECT( ) 函数返回一个数值型的语句句柄值而不是连接句柄。不能直接获取一个连接句柄。仍然可以为此连接传递语句句柄和串"Shared" 为表达式而用SQLSETPROP( ) 和SQLGETPROP( ) 函数设置和获取连接属性。所有其它的SQL 函数用语句句柄代替连接句柄。

SQLSTRINGCONNECT( ) 总是在它成功连接后创建一个新的连接。但是, 设置lShared 参数来确定你是否可以在稍后共享此连接。如果你设置lShared 为True (.T.) 来指定连接为可共享的, 你可以有稍后调用SQLCONNECT( ) 并传递数值型的连接句柄值为第一个参数来共享此连接。更详细的信息,请参见SQLCONNECT( ) 函数。

可以用SQLCONNECT( ) 在一个用SQLSTRINGCONNECT( ) 打开的共享的连接上来获取一个新的语句句柄。

示例

示例 1

以下示例假定名为MyFoxSQLNT 的ODBC 数据源存在并可用。SQLSTRINGCONNECT( ) 返回一个数值型的值, 它保存在名为gnHandle 的变量中。

如果成功地连接到了数据源, SQLSTRINGCONNECT( ) 返回一个正的数值, 一个对话框显示出来, 并且SQLDISCONNECT( ) 被调用来从数据源断开。

如果不能连接到数据源, SQLSTRINGCONNECT( ) 返回一个负数并显示信息。

复制代码

STORE SQLSTRINGCONNECT('dsn=MyFoxSQLNT;uid=myUserID;pwd=myPassword') TO gnConnHandle

IF gnConnHandle < 0

= MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error')

ELSE

= MESSAGEBOX('Connection made', 48, 'SQL Connect Message')

= SQLDISCONNECT(gnHandle)

ENDIF

示例 2

以下示例展示如何不带数据源名地调用SQLSTRINGCONNECT( ) 函数。

复制代码

lcDSNLess="driver = SQL Server;server=;uid=;pwd="

-或者-

复制代码

lcDSNLess="driver = {SQL Server};server=;uid=;pwd="

-或者-

复制代码

lcDSNLess="DRIVER = {SQL Server};" ;

+ "SERVER=;" ;

+ "UID=;" ;

+ "DATABASE=PUBS;" ;

+ "WSID=;" ;

+ "APP=MicroX(R) Sample App"

lnConnHandle=SQLSTRINGCONNECT(m.lcDSNLess)

·将数据源的表名存储到Visual FoxPro 的临时表中。

SQLTABLES( ) 函数

SQLTABLES(nStatementHandle [, cTableTypes] [, cCursorName])

参数

nStatementHandle

指定用SQLCONNECT( ) 返回的、指向数据源的语句句柄。

cTableTypes

指定一个或多个表类型。有效的表类型是“TABLE”、“VIEW”、“SYSTEM TABLE”或任何有效的数据源特定表类型的标识符。如果包含一个表类型的列表,则要用逗号将表类型分开。如果省略cTableTypes 或cTableTypes 是空字符串,则选定数据源中所有的表名。指定的表类型必须用单引号括起来。下面的示例示范了如何用一行文字来指定“VIEW”和“SYSTEM TABLE”表类型。

复制代码

? SQLTABLES(handle, "'VIEW', 'SYSTEM TABLE'", "mydbresult")

cCursorName

指定结果集发送到Visual FoxPro 临时表的名称。如果不包含临时表名,Visual FoxPro 将使用默认名“SQLRESULT”。该结果的结构取决于ODBC 句柄的内部SQLTABLES( ) 函数。

返回值

数值型。如果临时表创建成功,SQLTABLES( ) 返回1;如果SQLTABLES( ) 仍在执行中,返回0;如果发生连接级别的错误,则返回-1;如果发生环境级别的错误,则返回-2。说明

SQLTABLES( ) 是既可同步执行又可异步执行的四个函数之一。SQLSETPROP( ) 的异步选项设置决定这些函数是同步还是异步执行。在异步方式中,你必须重复调用SQLTABLES( ),直到返回一个非“假”(.F.) 值,否则表示函数仍在执行中。

示例

下面的示例假定一个调用MyFoxSQLNT 的ODBC 数据源是可用的。发出SQLCONNECT( ),并将返回值存入名为gnConnHandle 的变量中。

如果不能连接到该数据源,SQLCONNECT( ) 则返回一个负数,并显示一条信息。

如果成功地连接到该数据源,SQLCONNECT( ) 则返回一个正数,并显示一个对话框。SQLTABLES( ) 用来创建一个名为mycursor 的临时表,该临时表包含有关数据源中表的信息。LIST 被用来显示关于表的有关信息。

复制代码

STORE SQLCONNECT('MyFoxSQLNT', '', '') TO gnConnHandle

IF gnConnHandle < 0

= MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error')

= MESSAGEBOX('Connection made', 48, 'SQL Connect Message')

STORE SQLTABLES(gnConnHandle, 'TABLE', 'mycursor') TO nTables

IF nTables = 1

SELECT mycursor

LIST

ENDIF

ENDIF

【055】有关数据库和表的操作命令和函数

·在当前库中添加表

Add Table tblname [Name longName]

·在表尾部添加一条空记录

Append [Balnk] [In WorkArea|Alias]

·从临时表添加数据

Append From Dbf(‘tempTable’)

tempTable –由SQL-Select 创建

·将文本文件的内容复制到备注字段中

Append Memo memField From textFile.txt [Overwrite]

Overwrite –覆盖原内容。

·文本文件的内容追加到当前数据库

Append Procedure From textFile.txt [Overwrite]

·清空当前记录中的数据

Balnk [Field fldList] [范围] [For condition|While condition] ·编译库中的存储过程

Compile Database dbname

·当前记录备注字段内容复制到文本文件

Copy Memo memFld To textFile.txt [Additive]

·当前库中的存储过程复制到文本文件

Copy Procedure To textFile.txt [Additive]

·用当前选定的表创建新表

Copy To tblname

·创建一个命名连接,并存储到当前数据库中。

CREATE CONNECTION [ConnectionName | ?] [DATASOURCE cDataSourceName] [USERID cUserID] [PASSWORD cPassWord] [DATABASE cDatabaseName]

| CONNSTRING cConnectionString]

参数

ConnectionName

指定要创建的连接名。

显示连接设计器,通过它可以建立并保存一个连接。

指定连接的ODBC 数据源名称。

USERID cUserID

指定ODBC 数据源的用户标识。

PASSWORD cPassWord

指定ODBC 数据源的密码。

DATABASE cDatabaseName

指定能成功连接的服务器上的数据库。

CONNSTRING cConnectionString

指定ODBC 数据源的连接字符串。连接字符串可以用于代替ODBC 数据源, 用户标识, 及密码。

说明

如果忽略可选参数,将出现连接设计器,允许用于以交互方式创建连接。

示例

下例假设一个名为MyFoxSQLNT 的ODBC 数据源是可用的。先打开testdata 数据库,然后建立一个名为Myconn 的连接。DISPLAY CONNECTIONS 用于显示数据库中的命名连接。最后使用DELETE CONNECTION 从数据库中移去连接。

复制代码

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')

CREATE CONNECTION Myconn DATASOURCE "MyFoxSQLNT" USERID "" PASSWORD ""

CLEAR

DISPLAY CONNECTIONS && 显示数据库中的命名连接

DELETE CONNECTION Myconn && 移去刚创建的连接

·建立打开表之间的关系,从而在父表中移动记录指定时移动子表中的记录指针。SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1

[, eExpression2 INTO nWorkArea2 | cTableAlias2 ...]

[IN nWorkArea | cTableAlias] [ADDITIVE]]

参数

eExpression1

指定创建父表和子表间关系的关系表达式。该关系表达式通常是子表主控索引的索引表达式。如果eExpression1 是数字,则当记录指针在父表中移动时计算它。然后,子表的记录指针移动到记录编号为eExpression1 的记录上。忽略SET RELATION 命令的所有参数,将移去当前选定工作区中所有关系。可以使用SET RELATION OFF 命令移去一个特定的父子关系。更多的信息,请参见SET RELATION OFF 命令。

INTO nWorkArea1| cTableAlias1

指定子表的工作区编号或表别名。

eExpression2INTO nWorkArea2| cTableAlias2...

指定一个关系表达式,以及工作区编号或子表别名,从而可以在父表和子表之间创建

IN nWorkArea

指定父表的工作区。

IN cTableAlias

指定父表的别名。IN 子句允许创建关系时不必首先选择父表的工作区。如果省略nWorkArea 和cTableAlias,则父表必须在当前选定工作区中打开。

ADDITIVE

保留当前工作区中所有已存在的关系,并创建指定的关系。省略ADDITIVE 将断开当前工作区中的任何关系,并创建指定的关系。

说明

在创建一个关系之前,表必须在不同工作区中打开。除非关系表达式是数字,否则子表必须建立基于公共字段的索引。子表的索引可以是单项(.idx)索引、结构复合(.cdx)索引,或非结构符合索引。如果索引是一个复合索引,则应使用SET ORDER 命令指定适当的索引标识来排序子表中的记录。

注意:

如果调用带有非数值关系表达式的SET RELATION 命令,且子表没有使用索引进行排序,则Visual FoxPro 将产生一条错误信息。

可以创建存在公共字段的表间关系。使用单条SET RELATION 命令可以创建单个父表与多个子表间的多重关系。

注意:

如果在子表中找不到匹配记录,则子表中的记录指针被放在表尾。

如果子表存在一个活动索引,则eExpression1 的数据类型必须与子表的活动索引关键字相同。如果子表不存在活动索引,则eExpression1 必须是数值型,在此情况下它表示要在子表中移动的记录数。

示例

示例 1

下例创建customer 表和orders 表间的关系,其中customer 表中一条消费者记录可以对应orders 表中的多个订购单记录。通过使用公共字段创建关系,您可以浏览到任何消费者的所有订购单。该例使用customer 表中的Cust_ID 字段和orders 表中的Cust_ID 索引标识创建关系。orders 表中的索引通过消费者组织记录。

以下代码使用USE 命令在 1 号工作区中打开customer 表作为父表,然后在 2 号工作区中打开orders 表作为子表。SELECT 命令选择orders 表的工作区。SET ORDER 命令使用Cust_ID 索引标识指定orders 表的订购单。

复制代码

USE Customer IN 1

USE Orders IN 2

SET ORDER TO TAG Cust_ID

以下代码使用SELECT 命令选择customer 表的工作区。SET RELATION 命令创建父表和子表中主控索引间的关系:

复制代码

SELECT Customer

SET RELATION TO Cust_ID INTO Orders

以下代码在“浏览”窗口中打开customer 表,选择orders 表的工作区,然后为orders 表打开“浏览”窗口:

复制代码

BROWSE NOWAIT

SELECT Orders

BROWSE NOWAIT

当您移动customer 表中的记录指针时,orders 表中的记录指针随之移动。打开数据工作期窗口可以显示两表间创建的关系。

示例 2

下例创建一个单表内部的关系,或称为自我引用(self-referential)关系。通过在不同的工作区中以不同的别名打开相同的表,就可以通过使用两个别名创建相同表中的关系。以下代码首先使用SELECT 命令选择表的工作区,并通过USE 命令以Manager 为别名打开表。然后使用SELECT 命令选择相同的工作区,并通过USE 命令和AGAIN 关键字以Employee 为别名再次打开表。表在两个不同的工作区中打开:

复制代码

SELECT 0

USE Employees ALIAS Manager

SELECT 0

USE Employees AGAIN ALIAS Employee

以下代码使用INDEX 命令创建一个基于Reports_To 字段带有Mgr_ID 索引标识的索引,然后使用SET ORDER 命令设置表中索引顺序。创建的索引通过管理人员组织记录。

复制代码

INDEX ON Reports_To TAG Mgr_ID

SET ORDER TO Mgr_ID

以下代码使用SELECT 命令选择Manager 别名作为父表。

SET RELATION 创建父表和子表中主控索引标识间的关系。子表中的主控索引通过员工组织记录。

复制代码

相关主题
文本预览
相关文档 最新文档