【问题标题】:How to insert a query into another query in C# using Microsoft Visual Studio?如何使用 Microsoft Visual Studio 将查询插入到 C# 中的另一个查询中?
【发布时间】:2015-06-08 02:16:55
【问题描述】:

是否可以在 C# 中将查询插入到另一个查询中?目前我正在连接到一个访问数据库,当我将查询插入到 Microsoft Access 上 SQL 视图中的另一个查询中时,会显示我想要的数据。但是,当我将相同的代码插入 C# 时,查询带有下划线。基本上,此查询是将“日”视图中生成的查询中的数据包含到“月”视图的查询中的 FROM 部分。

如何修改查询以便能够在 C# 中运行?

Microsoft Access 上 SQL 视图中“日视图”的查询是:

SELECT outbound.[Receipt date], outbound.[Receive plant], Avg(outbound.[Aging Days]) AS [AvgOfAging Days] FROM outbound GROUP BY outbound.[Receipt date], outbound.[Receive plant] HAVING (((outbound.[Receipt date]) Is Not Null));

Microsoft Access 上 SQL 视图中“月视图”的查询是:

SELECT Format([Receipt date],"mm/yyyy") AS [Month], Avg(Day.[AvgOfAging Days]) AS [AvgOfAvgOfAging Days] FROM  (SELECT outbound.[Receipt date], outbound.[Receive plant], Avg(outbound.[Aging Days]) AS [AvgOfAging Days] FROM outbound WHERE (outbound.[Receipt date] > #4/1/2015#) GROUP BY outbound.[Receipt date], outbound.[Receive plant] HAVING (((outbound.[Receipt date]) Is Not Null))) AS [Day] WHERE Day.[Receive plant] = "2300" GROUP BY Format([Receipt date],"mm/yyyy"), Day.[Receive plant] HAVING (((Format([Receipt date],"mm/yyyy")) Is Not Null));

(对于日期和工厂,我有硬编码值来测试查询,但我的实际程序应该读取用户选择)

为适应“月”视图的 C# 应用程序而修改的代码是:

string cmdQuery = "SELECT Format([Receipt date],\"mm/yyyy\") AS [Month], Avg(Day.[AvgOfAging Days]) AS [AvgOfAvgOfAging Days] "
                                + "FROM ("SELECT outbound.[Receipt date], outbound.[Receive plant], Avg(outbound.[Aging Days]) AS [AvgOfAging Days] " + "FROM outbound " + "WHERE ([Receipt date] >= #" + dateFrom + "#) AND ([Receipt date] <= #" + dateTo + "#) AND ((outbound.[Receive plant]) ='" + plant[i] + "')" + "GROUP BY outbound.[Receipt date], outbound.[Receive plant] " + "HAVING (((outbound.[Receipt date]) Is Not Null)); ) AS [Day] "

                                + "WHERE ((Day.[Receive plant]) ='" + plant[i] + "') "
                                + "GROUP BY Format([Receipt date],\"mm/yyyy\"), Day.[Receive plant] "
                                + "HAVING (((Format([Receipt date],\"mm/yyyy\")) Is Not Null)) ";

如何编辑上面的查询以使该查询能够在 C# 中运行?

谢谢。

【问题讨论】:

    标签: c# sql ms-access subquery


    【解决方案1】:
    1. 切换到参数化值/占位符(SQL 命令参数);然后

    2. 使用string.Format插入子查询,子查询本身应该是一个有效查询。

    只需将内部参数添加到最终 SQL 命令对象,以及外部查询的任何参数。也就是说,字符串构建针对查询体,不针对任何数据。

    为了让生活更轻松,内部查询也应该位于一个用括号括起来的派生表位置,并给定一个别名。

    例如:

    var innerQuery = "SELECT .. WHERE name = @name";
    var finalQuery = string.Format("SELECT * FROM ({0}) AS T ..", innerQuery);
    
    var cmd = conn.NewCommand();
    cmd.CommandText = finalQuery;
    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = "Fred";
    

    如果遵循这种方法,那么唯一需要注意的是避免名称冲突,如果定义(并遵循)相关规则,这很容易。


    或者,使用允许以类型安全的方式构造查询(包括嵌入式查询)的众多 ORM/Mappers/LINQ 提供程序之一。

    如果继续以这种方式编写原始 SQL,还可以考虑使用verbatim string literals

    【讨论】:

      【解决方案2】:

      我认为这会起作用 - 但我强烈建议使用更易于维护的方式...

        string cmdQuery = "SELECT Format([Receipt date],\"mm/yyyy\") AS [Month], Avg(Day.[AvgOfAging Days]) AS [AvgOfAvgOfAging Days] "
                                  + "FROM ( "+ "SELECT outbound.[Receipt date], outbound.[Receive plant], Avg(outbound.[Aging Days]) AS [AvgOfAging Days] " + "FROM outbound " + "WHERE ([Receipt date] >= #" + dateFrom + "#) AND ([Receipt date] <= #" + dateTo + "#) AND ((outbound.[Receive plant]) ='" + plant[i] + "')" + "GROUP BY outbound.[Receipt date], outbound.[Receive plant] " + "HAVING (((outbound.[Receipt date]) Is Not Null)); ) AS [Day] "
      
                                  + "WHERE ((Day.[Receive plant]) ='" + plant[i] + "') "
                                  + "GROUP BY Format([Receipt date],\"mm/yyyy\"), Day.[Receive plant] "
                                  + "HAVING (((Format([Receipt date],\"mm/yyyy\")) Is Not Null)) ";
      

      【讨论】:

      • 上面的查询不再加下划线,但是,当我运行应用程序时,FROM 子句中似乎存在语法错误。
      • 查看@user2864740 的回答 - 你拥有的东西太难以管理了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2022-08-17
      • 2020-09-03
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多