在VFP8.0中使用SPT技术对SQL数据库表进行读写操作中遇到的问题如何解决?

时间:2022-10-27 21:45:31
    在VFP8.0中使用SPT技术对服务器SQL数据库表进行读写操作,在第一步建立和服务器数据库的连接并取得连接句柄后,向服务器取数据时使用下列命令:
    SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]])
    我现在提出的问题是:其中的SQLCommand语句是否可以是较复杂的select语句?需要从多个建立关联后的SQL数据库表取数据。
    具体实例是:
    SQL数据库有4个表,4个表的表名为:表商品购进、表商品信息、表供货企业、表财务汇款,其中:表商品购进中的字段“商品编号”与表商品信息的字段“商品编号”关联,表商品购进中的字段“单据编号”与表财务汇款的字段“单据编号”关联,表财务汇款中的字段“单位编号”与表供货企业的字段“单位编号”关联。
    所使用的SQLEXEC语句是:

    SQLEXEC(nConnectionHandle, ;
    "Select 查询结果中包含的字段 from表商品购进,表商品信息,表供货企业,表财务汇款;
    where 表商品购进.商品编号=表商品信息.商品编号;
     .and. 表商品购进.单据编号=表财务汇款. 单据编号;
     .and. 表财务汇款.单位编号=表供货企业.单位编号" , cCursorName)

    但在实际运行SQLEXEC语句时,提示出错:“命令中有不能识别的短语或关键字”。
    后来我又将所使用的SQLEXEC语句改为:

     SQLEXEC(nConnectionHandle, ;
    "Select 查询结果中包含的字段 from表商品购进;
    inner join 表商品信息 on 表商品购进.商品编号=表商品信息. 商品编号;
    inner join 表财务汇款 on 表商品购进.单据编号=表财务汇款. 单据编号;
    inner join 表供货企业 on 表财务汇款.单位编号=表供货企业.单位编号" , cCursorName)

    但在实际运行SQLEXEC语句时,仍然提示出错:“命令中有不能识别的短语或关键字”。
    请电脑专家帮助分析,错在哪里?应如何正确编程?敬请指导,不胜感激!

8 个解决方案

#1


老问题了,命令太长了

#2


测试一下SQL语句长度,如果超过255,用N个变量累加,优化SQL语句,加入别名

Select * from 表商品购进 d; 
    inner join 表商品信息 a on d.商品编号=a. 商品编号; 
    inner join 表财务汇款 b on d.单据编号=b. 单据编号; 
    inner join 表供货企业 c on d.单位编号=c.单位编号


OR
用TEXT TO DD
Select * from 表商品购进 d; 
    inner join 表商品信息 a on d.商品编号=a. 商品编号; 
    inner join 表财务汇款 b on d.单据编号=b. 单据编号; 
    inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)

#3


测试SQL语句长度就明白问题所在了,
是否是 查询结果中包含的字段 这个地方内容太多了?

#4


你将语句在 SQL Server 查询分析器中运行通过后,再写到程序中。

#5


注意: SQLEXEC 发送的字符串不能超过 VFP 的限制(255),但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。

如:以下为 VFP 自带帮助中的说明:

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

lnRetVal = SQLEXEC(lnHandle, "SELECT <long list of fields> " + ;
   "FROM <several tables> " + ;
  "WHERE <complex filter expression>")

#6


你升级到VFP9SP2吧,字符变量长度几乎无限制了。
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1 
     where ...
     order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)

这样就行.

#7


还有一种解决办法,是在sql server上做一个视图,在sqlexec中查询这个视图即可,再复杂也不怕,而且方便维护,占用资源也少。

#8


每一行以;结束的,必须添加一个空格,如:
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。

#1


老问题了,命令太长了

#2


测试一下SQL语句长度,如果超过255,用N个变量累加,优化SQL语句,加入别名

Select * from 表商品购进 d; 
    inner join 表商品信息 a on d.商品编号=a. 商品编号; 
    inner join 表财务汇款 b on d.单据编号=b. 单据编号; 
    inner join 表供货企业 c on d.单位编号=c.单位编号


OR
用TEXT TO DD
Select * from 表商品购进 d; 
    inner join 表商品信息 a on d.商品编号=a. 商品编号; 
    inner join 表财务汇款 b on d.单据编号=b. 单据编号; 
    inner join 表供货企业 c on d.单位编号=c.单位编号
ENDTEXT
SQLEXEC(nConnectionHandle,DD)

#3


测试SQL语句长度就明白问题所在了,
是否是 查询结果中包含的字段 这个地方内容太多了?

#4


你将语句在 SQL Server 查询分析器中运行通过后,再写到程序中。

#5


注意: SQLEXEC 发送的字符串不能超过 VFP 的限制(255),但是, 如果你把它们分割到多个相连的串中, 你可以传递长的 SQL 语句。

如:以下为 VFP 自带帮助中的说明:

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

lnRetVal = SQLEXEC(lnHandle, "SELECT <long list of fields> " + ;
   "FROM <several tables> " + ;
  "WHERE <complex filter expression>")

#6


你升级到VFP9SP2吧,字符变量长度几乎无限制了。
另外这种SQL语法最后用TEXT TO <变量> NOSHOW来赋值
如:
TEXT TO lcSQLCommand NOSHOW
select * from table1 
     where ...
     order ...
ENDTEXT
SQLEXEC(<连接句柄>,lcSQLCommand)

这样就行.

#7


还有一种解决办法,是在sql server上做一个视图,在sqlexec中查询这个视图即可,再复杂也不怕,而且方便维护,占用资源也少。

#8


每一行以;结束的,必须添加一个空格,如:
语句1 ;
语句2
否则将自视为与下一行的字符连在一起,而报错。