将 Access 查询转换为 VB.net SQL 语句

Posted

技术标签:

【中文标题】将 Access 查询转换为 VB.net SQL 语句【英文标题】:Convert Access Query to VB.net SQL Statement 【发布时间】:2013-08-23 18:37:12 【问题描述】:

我的 Access 数据库中有一个名为 Historical_Stock_Prices 的表,其中包含各种公司的历史股票价格。我需要运行一个查询,将原始数据(股票价格)转换为季度增长率,并在DataGridView 中显示季度增长率。

我已经在我的 Access 数据库的 SQL 视图中编写了以下查询,它可以在 Access 中运行。

SELECT MinMaxYrQtrDates.YrQtr, MinMaxYrQtrDates.Ticker, MinMaxYrQtrDates.MaxDate, [Historical Prices].Close, MinMaxYrQtrDates.MinDate, [Historical Prices_1].Open, ([Historical Prices].[Close]/[Historical Prices_1].[Open]-1)*100 AS GrowthRate FROM [Historical Prices] AS [Historical Prices_1] INNER JOIN ([Historical Prices] INNER JOIN [SELECT Year([Date]) & "-" & DatePart("q",[Date]) AS YrQtr, [Historical Prices].Ticker, Max([Historical Prices].Date) AS MaxDate, Min([Historical Prices].Date) AS MinDate FROM [Historical Prices] GROUP BY Year([Date]) & "-" & DatePart("q",[Date]), [Historical Prices].Ticker]. AS MinMaxYrQtrDates ON ([Historical Prices].Date = MinMaxYrQtrDates.MaxDate) AND ([Historical Prices].Ticker = MinMaxYrQtrDates.Ticker)) ON ([Historical Prices_1].Ticker = MinMaxYrQtrDates.Ticker) AND ([Historical Prices_1].Date = MinMaxYrQtrDates.MinDate);

我需要能够从我的程序中调用它并在DataGridView 中显示结果。我试图从 Access 复制 SQL 语句并将其用作我的代码中的 SQL 语句,但它不起作用。我没有收到任何错误,DataGridView 只是空白。到目前为止,这是我的代码:

Imports System.IO
Imports System.Data.OleDb

Public Class Historical_Growth_Rates_Annual

Public tblName As String = "Historical_Stock_Prices"

Private Sub Historical_Growth_Rates_Annual_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If (File.Exists(Nordeen_Investing_3.databaseName)) Then
        Nordeen_Investing_3.con.Open()
        Dim restrictions(3) As String
        restrictions(2) = tblName
        Dim dbTbl As DataTable = Nordeen_Investing_3.con.GetSchema("Tables", restrictions)
        If dbTbl.Rows.Count = 0 Then
            MessageBox.Show("Historical Stock Prices tables does not exist in the database.  Please Update")
        Else
            Dim da As OleDbDataAdapter = New OleDbDataAdapter("SELECT MinMaxYrQtrDates.YrQtr, MinMaxYrQtrDates.Ticker, MinMaxYrQtrDates.MaxDate, [Historical_Stock_Prices].Close1, MinMaxYrQtrDates.MinDate, [Historical_Stock_Prices_1].Open1, ([Historical_Stock_Prices].[Close1]/[Historical_Stock_Prices_1].[Open1]-1)*100 AS GrowthRate FROM [Historical_Stock_Prices] AS [Historical_Stock_Prices_1] INNER JOIN ([Historical_Stock_Prices] INNER JOIN [SELECT Year([Date1]) & " - " & DatePart('q',[Date1]) AS YrQtr, [Historical_Stock_Prices].Ticker, Max([Historical_Stock_Prices].Date) AS MaxDate, Min([Historical_Stock_Prices].Date) AS MinDate FROM [Historical_Stock_Prices] GROUP BY Year([Date1]) & " - " & DatePart('q',[Date1]), [Historical_Stock_Prices].Ticker]. AS MinMaxYrQtrDates ON ([Historical_Stock_Prices].Date = MinMaxYrQtrDates.MaxDate) AND ([Historical_Stock_Prices].Ticker = MinMaxYrQtrDates.Ticker)) ON ([Historical_Stock_Prices_1].Ticker = MinMaxYrQtrDates.Ticker) AND ([Historical_Stock_Prices_1].Date = MinMaxYrQtrDates.MinDate);", Nordeen_Investing_3.con)
            'create a new dataset
            Dim ds As New DataSet()
            'fill the datset
            da.Fill(ds)
            'attach dataset to the datagrid
            DataGridView1.DataSource = ds.Tables(0)
            ds = Nothing
            da = Nothing
            Nordeen_Investing_3.con.Close()
        End If
    Else
        MessageBox.Show("Database does not exist.  Please update.")
    End If
End Sub
End Class

我真的被困住了,需要一些帮助!谢谢!

【问题讨论】:

没有错误?唔。尝试在这样的东西上使用单引号:DatePart('q'... @LarsTech 仍然是空白。没有错误... 【参考方案1】:

您希望 VB.Net 代码重新创建在 Access 中工作的相同 SELECT 语句。然而,看看 Vim 的语法高亮显示,我认为你实际上可能正在创建其他东西。 (这可能就像创建一个字符串作为其他 2 个字符串的差异:"string 1" - "string 2")。

但无论我猜对与否,使用字符串变量来保存您的SELECT 语句。然后将该字符串打印到控制台或将其写入文本文件,以便您可以检查您提供给 db 引擎的实际语句。

或者将 Access 中的工作查询保存为命名查询对象,并使用 VB.Net 代码中的查询名称 --- 这绝对保证使用已确认在 Access 中工作的相同 SQL。

【讨论】:

无论哪种方法最好,您确实需要再看看您声称在 Access 中工作的 SQL。 db 引擎在尝试解析此段时会阻塞:INNER JOIN [SELECT Year([Date]) & "-" & DatePart("q",[Date]) AS YrQtr, [Historical Prices].Ticker, Max([Historical Prices].Date) AS MaxDate, Min([Historical Prices].Date) AS MinDate FROM [Historical Prices] GROUP BY Year([Date]) & "-" & DatePart("q",[Date]), [Historical Prices].Ticker]. AS MinMaxYrQtrDates 当您尝试以[SELECT ...]. AS alias 而非(SELECT ...) AS alias 的形式进行子查询时,Access 将被子查询的SELECT 中的任何其他[] 字符混淆。 SELECT 构建为字符串变量。将变量的内容打印到文本文件中。从文本文件中复制语句并在 Access 会话中作为新查询尝试。 @nordeen1 my code doesn't even reach this point. 你必须解释那部分。 我可以在 Access SQL 方面提供帮助。当谈到.Net时,我迷路了。但我知道的足以告诉您,如果 Access SQL 在 Access 中不起作用,则不能指望它在 .Net 中起作用。创建一个您可以验证实际在 Access 中工作的 Access 查询。然后在 .Net 中使用相同的 SQL 语句。

以上是关于将 Access 查询转换为 VB.net SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

vb.Net & Access 是/否 sql 执行错误

VB.Net/Access SQL 插入子查询问题

VB.Net 使用创建表查询将 MS Access 表中的 AllowZeroLength 属性设置为否

将 SQL 命令从 vb .net 转换为 C#

VB中多个模式的SQL查询

从 VB.NET 查询 Access 数据库中的 Yes/No 字段