【问题标题】:Visual FoxPro-query with parameters带参数的 Visual FoxPro 查询
【发布时间】:2018-07-02 15:15:59
【问题描述】:

有人知道我如何在 Visual FoxPro 中用 SQL 语言编写带参数的查询吗?它不像在 Access 中那样工作,我在这里有点迷失了。 提前谢谢!

【问题讨论】:

    标签: sql visual-foxpro


    【解决方案1】:

    很遗憾,您的问题过于宽泛,无法提供简单的答案。
    一个查询的语法与执行不同查询的语法不同。

    是的,SQL 查询语法可能与 M$ Access 略有不同。

    但是,您始终可以通过 Google 搜索:vfp sql 查询语法 来查找特定的语法等价物。

    注意:“WITH”参数将位于一个简单的 WHERE 子句中,类似于大多数其他 SQL 查询语言,
    WHERE Field1 = "ABC" AND Field2 = 235
    但它将使用 VFP 语言语法。

    您还可能想花一些时间观看免费的在线 VFP 教程视频:free on-line VFP tutorial videos
    特别是标记为:FoxPro 和 SQL 语言

    【讨论】:

    • 这没有回答问题,甚至没有显示参数化查询的示例。
    【解决方案2】:

    您可以访问 w3schools.com 查看 SQL 基础知识。它不像access,这是真的,因为access,即所谓的SQL数据库引擎,对SQL有自己的理解。 VFP OTOH 更接近 ANSI SQL(IOW 更接近 SQL Server)。

    你没有指定你使用的语言,但是说访问,我假设你正在尝试使用 VBA。这是使用参数的 VBA (excel) 示例:

    Sub Macro1()
       Dim oRecordset1 As ADODB.Recordset
       Dim oConnection As ADODB.Connection
       Dim oCommand As ADODB.Command
       Dim oParameter1 As ADODB.Parameter
       Dim oParameter2 As ADODB.Parameter
    
    
      Set oConnection = New ADODB.Connection
      Set oCommand = New ADODB.Command
    
      oConnection.ConnectionString = "Provider=VFPOLEDB;Data Source=C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Northwind"
    
      oConnection.Open
      oCommand.ActiveConnection = oConnection
      oCommand.CommandText = "select * from Orders where OrderDate >= ? and OrderDate < ?"
    
      Set oParameter1 = oCommand.CreateParameter("start")
      oParameter1.Type = adDate
      oParameter1.Value = CDate("1996-08-01")
      oCommand.Parameters.Append oParameter1
    
      Set oParameter2 = oCommand.CreateParameter("end")
      oParameter2.Type = adDate
      oParameter2.Value = CDate("1996-10-01")
      oCommand.Parameters.Append oParameter2
    
      Set oRecordset = oCommand.Execute()
      Sheet1.Range("A1").CopyFromRecordset (oRecordset)
    End Sub
    

    注意:参数是位置的,不是命名的。

    【讨论】:

    • 这看起来像 Visual Basic,但问题是关于 FoxPro。
    • @Alejandro,不清楚问题是关于 VBA 还是 VFP。我知道 OP 在询问如何使用 VBA 中的参数查询 VFP 数据库。否则问起来太简单了。
    • 也许,我知道他编写 VFP 代码主要是因为标签,并以 Access 为例。 OP 需要澄清他的意思。
    • @Alejandro,以访问为例表明问题与 VBA 有关。否则 VFP 的 SQL 比什么访问的专有 SQL 更接近 ANSI SQL。
    【解决方案3】:

    这取决于您使用的查询类型,是使用查询本机 FoxPro 表的内置 SQL 引擎,还是使用外部数据源的查询。

    首先对于本机查询,它非常简单。由于它是原生 FoxPro 指令,因此您可以访问其中的每一个功能,包括变量,您可以轻松地将用户提供的数据放入其中:

    LOCAL data                                   &&This could come from user input
    data = "hello world"
    SELECT * FROM SomeTable WHERE Column = data  &&Filtered parametrized query
    

    另一种选择是提交 SQL 查询以供外部服务器处理,其中查询作为文本字符串发送。在这种情况下,可以使用特殊的参数标记,匹配 FoxPro 变量,然后将参数化查询发送到服务器:

    LOCAL data
    data = "hello world"
    
    LOCAL hConn = SQLSTRINGCONNECT(connectionString)
    SQLEXEC(hConn, "SELECT * FROM SomeTable WHERE Column = ?data", "SomeTable")    &&The "?data" parametrizes the query, sending the value separate from the query itself
    SQLDISCONNECT(hConn)
    

    【讨论】:

    • 准确地说是m.data。
    • @CetinBasoz 只要data 就足够了,而且效果很好。 m. 前缀根本不需要,只会产生噪音。但在任何一种情况下都可以使用。
    • 我不会进行讨论。您可以阅读有关 m 的信息。 (又名点)在文档和论坛上,或者作为一个问题询问为什么它是必要的。
    • 这是这里最正确的答案。在参数化 vfp 查询的情况下,只需在查询中直接使用变量*;如果参数化 SQL 直通查询,则使用 ?&lt;variable*&gt; 语法。这会导致 FoxPro 从当前作用域中提取 data 的值。 *注意:这也是@CetinBasoz 添加m.data 注释的原因,因为如果选择了另一个具有data 列的工作区,Foxpro 将始终选择它而不是内存变量
    • @nqramjets,虽然我同意 m.data,但我不明白您为什么认为这是“最”正确的答案。您声称您确实了解 OP 的要求,但 OP 从未明确表示过。没有 OP 说问题是关于 SQL 直通或本机 VFP 查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多