Functions.SqlExec 方法 | |
发送 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
[NeedsAccessToLocalsAttribute(true)]
public static int SqlExec(
int nStatementHandle,
[DefaultParameterValueAttribute("", 0)] string cSQLCommand,
[DefaultParameterValueAttribute("SQLRESULT", 0)] string cCursorName,
[DefaultParameterValueAttribute(null, 0)] __Array aCountInfo
)
查看代码参数
- 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 语句。例如:
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( ) 执行临时查询以及调用或创建存储过程的各种方法:
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
参见