【问题标题】:Vb6 Missing OperatorVb6 缺少运算符
【发布时间】:2016-12-22 15:47:55
【问题描述】:

在我的学校项目上工作,当我在我的 sql 中添加 ORDER BY 方面时遇到了这个缺少的操作员错误,尽管其余代码运行良好。

Set rs_fav = db_kwickfix.OpenRecordset("
    SELECT Recipe.Rec_Name 
    FROM Recipe,Favourites 
    WHERE (Recipe.RecipeID = Favourites.RecipeID) 
        AND (Favourites.UserID = " & frm_login.user_id & ") 
    ORDER BY Recipe.Rec_Name DESCENDING
    ")

【问题讨论】:

  • 也许尝试将内部双引号更改为单引号(frm_login.user_id 周围的那些)
  • 我添加了 SQL-Server 标签,如果您使用其他 DBMS,请随意删除它;)
  • 闻起来像 DAO,所以很可能不是 SQL Server,而是 Jet。

标签: sql sql-server vb6


【解决方案1】:

试试 DESC 而不是 DESCENDING,检查 ORDER BY Clause (Transact-SQL) 是:

按 order_by_expression 排序
[ 整理 collat​​ion_name ]
[ 升序 | DESC ]
[ ,...n ]
[ ]

因此:

Set rs_fav = db_kwickfix.OpenRecordset("
    SELECT Recipe.Rec_Name 
    FROM Recipe,Favourites 
    WHERE (Recipe.RecipeID = Favourites.RecipeID) 
        AND (Favourites.UserID = " & frm_login.user_id & ") 
    ORDER BY Recipe.Rec_Name DESC
    ")

【讨论】:

    【解决方案2】:

    您是否考虑过使用显式 JOIN?

    Set rs_fav = db_kwickfix.OpenRecordset("
            SELECT Recipe.Rec_Name 
            FROM Recipe
            JOIN Favourites
            ON Recipe.RecipeID = Favourites.RecipeID
            AND Favourites.UserID = " & frm_login.user_id & " 
            ORDER BY Recipe.Rec_Name DESC
        ")
    

    另外,我强烈建议您研究参数化查询,以便您开始养成使用它们的习惯。阅读更多关于它的信息here

    【讨论】:

    • 这里的 Join 是没有用的,除了提高可读性。查询引擎将生成与WHEREJOIN 相同的代码
    • 你不是也通过明确 JOIN 来减少不必要的交叉连接的可能性吗?不过我明白你在说什么——这并不能解决他的特定问题。
    • 好问题...你应该使用CROSS JOIN table 明确的,隐含的方法是忘记完整的WHERE table1.field = table2.field,这可能会发生,但我不认为这是一个真正的风险......(但不要认为我反对 JOIN 语法,我总是使用它,WHERE 一个更适合遗留代码)
    猜你喜欢
    • 2013-07-07
    • 2015-05-18
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多