点击或拖拽改变大小

Functions.SqlExec 方法

X#
发送 SQL 语句到数据源,并在数据源中处理该语句。

命名空间:  XSharp.VFP
程序集:  XSharp.VFP (在 XSharp.VFP.dll 中) 版本:2.22 GA
语法
[NeedsAccessToLocalsAttribute(TRUE)]
 FUNCTION SqlExec(
	nStatementHandle AS LONG,
	 cSQLCommand AS STRING,
	 cCursorName AS STRING,
	 aCountInfo AS ARRAY
) AS LONG
查看代码

参数

nStatementHandle
类型:Int32
指定由 SqlConnect( ) 函数返回的数据源的语句句柄。
有关更多信息,请参见 SqlConnect( ) 函数。
cSQLCommand
类型:String
指定传递到数据源的 SQL 语句。
SQL 语句可以包含参数化的 Where 子句,这会创建一个参数化视图。在发出 SqlExec( ) 之前,必须定义 Where 子句中的所有参数。 例如,如果参数是变量,则必须在发出 SqlExec( ) 之前创建并初始化这些变量。
有关参数化视图的更多信息,请参见如何:创建参数化视图。
您可以在 SQL 语句中包含表达式。X# 在将 SQL 语句传递到数据源之前会评估所有表达式。 X# 可以将内存变量名、函数调用和括号中的表达式评估为参数值。
提示 提示:
X# 目前不支持参数化查询
cCursorName
类型:String
指定结果集发送到的 X# 游标的名称。如果不包含游标名称,X# 使用默认名称 SQLRESULT。
对于多个结果集,新游标名称通过在第一个游标名称后附加一个递增的数字来派生。
aCountInfo
类型:__Array
指定一个数组,用于填充行计数信息。数组会调整大小以容纳所有结果集。
数组有两列:1 – 别名,2 – 计数。

返回值

类型:Int32
数值型。SqlExec( ) 返回结果集的数量(如果有多个)。
SqlExec( ) 返回 0 表示仍在执行,返回 1 表示已完成执行。
SqlExec( ) 返回 -1 表示发生连接级别错误。
备注
如果您要传递的 SQL 语句很长,请检查它是否超过了 X# 中字符串字面量的最大长度(255 个字符)。
较长的字符串会导致“命令包含无法识别的短语/关键字”错误。但是,如果将长 SQL 语句分成几个连接的字面量,则可以传递长 SQL 语句。例如:
X#
1lnRetVal = SqlExec(lnHandle, "Select <long list of fields> " + ;
2                                "From <several tables> " + ;
3                                "Where <complex filter expression>")
如果 SqlExec( ) 用于执行用 SqlPrepare( ) 准备的 SQL 语句,则只需要连接句柄参数 nStatementHandle。应省略 cSQLCommand 和 CursorName 参数。
有关更多信息,请参见 SqlPrepare( ) 函数。
如果 SQL 语句生成一个结果集,SqlExec( ) 将结果集存储到指定的 X# 游标中。
如果 SQL 语句生成两个或更多结果集, 您可以通过使用 SqlSetProp( ) 函数将连接的 BatchMode 属性设置为 False (.F.) 并在每次调用 SqlMoreResults( ) 函数时更改游标名称来命名每个结果集。 否则,SqlExec( ) 通过在第一个结果集名称后附加顺序编号来命名每个结果集。
SqlExec( ) 是四个可以同步或异步执行的函数之一。 SqlSetProp( ) 的异步设置决定这些函数是同步还是异步执行。
在异步模式下,您必须重复调用 SqlExec( ) 直到它返回一个非 0 的值(仍在执行)。
数组内容数据类型描述
别名0字符型 表示 SQL 命令未返回任何结果。要么没有返回记录,要么 SQL 命令在返回结果之前失败。 (最终 SqlMoreResults 调用)或执行在任何结果处理之前失败。只能在第一行。 该行的计数列包含值 -1。
非空大写字符串字符型 游标的别名 – 记录获取操作的目标。该行的计数列包含获取的记录数或 -1(如果获取失败)。 如果计数为 -1,则可能未创建游标。在异步执行期间,游标的获取过程可以在多个 SqlMoreResults 或 SqlExec 调用之间拆分;每个调用返回游标的自己的获取计数。
字符型空字符串表示 SQL 命令(插入、更新或删除)未返回结果集。
计数受影响或获取的记录数。整数型表示 ODBC SQLRowCount 函数返回的受影响记录数。如果记录数不可用,则返回 -1。
示例
以下示例展示了使用 SqlExec( ) 执行临时查询以及调用或创建存储过程的各种方法:
X#
 1Clear
 2LOCAL lnConn
 3LOCAL lnPercent AS Int // 输入参数必须是类型化的。
 4LOCAL lnOutput
 5lnPercent = 50
 6lnOutput = 0
 7* 建立连接,假设是本地受信任的连接。
 8lnConn = SqlConnect('local')
 9
10IF m.lnConn > 0 // 成功。
11    * 将活动数据库设置为 PUBS。
12    SqlExec(m.lnConn, 'use pubs')
13    * 执行 Select 语句。
14    SqlExec(m.lnConn, 'Select * From authors', 'PubAuthors')
15    BROWSE
16
17    * 执行 Insert 语句,获取标识字段的值。
18    SqlExec(m.lnConn, "Insert Into JOBS (job_desc, min_lvl, max_lvl);
19                                VALUES ('Developer',75,150)")
20    SqlExec(m.lnConn, "Select SCOPE_IDENTITY()", "job_id")
21    ? "添加的工作 ID 是 " + LTRIM(STR(job_id.exp))
22    * 执行 DELETE 语句。获取受影响的记录数。
23    SqlExec(m.lnConn, "DELETE From JOBS Where job_desc ='Developer'")
24    SqlExec(m.lnConn, "Select @@ROWCOUNT", 'rowcount')
25    ? rowcount.exp, "条记录被删除"
26    * 调用无参数的存储过程。
27    SqlExec(m.lnConn, 'sp_who', 'activeusers')
28    BROWSE
29    * 执行带有输入参数的存储过程。
30    SqlExec(m.lnConn, 'exec byroyalty ?lnPercent','HalfOffAuthors')
31
32    * 创建带有输出参数的临时存储过程并调用它。
33    SqlExec(m.lnConn, "Create PROCEDURE #MyProc @outparam int OUTPUT AS Set @outparam=Select @outparam=100")
34    SqlExec(m.lnConn, "exec #myProc ?@lnOutput")
35    ? m.lnOutput
36
37    * 创建带有输入和输出参数的临时存储过程并调用它。
38    SqlExec(m.lnConn, "Create PROCEDURE #MyProc2 " + "@inputparam INT, " + "@outparam int OUTPUT " + "AS Set @outparam=@inputparam*10")
39    SqlExec(m.lnConn, "exec #myProc2 ?lnPercent, ?@lnOutput")
40    ? m.lnOutput
41    * 获取版本信息。
42    SqlExec(m.lnConn, 'Select @@VERSION','SQLVersion1')
43    ? STRTRAN(SQLVersion1.Exp,CHR(0))
44    * 断开连接。
45    SqlDisconnect(m.lnConn)
46ELSE
47    ? "无法连接到 SQL 服务器"
48ENDIF
49
50RETURN
参见