简体   繁体   English

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

[英]Convert Access Query to VB.net SQL Statement

I have a table in my Access database called Historical_Stock_Prices that is filled with various companies historical stock prices. 我的Access数据库中有一个名为Historical_Stock_Prices的表,该表充满了各个公司的历史股价。 I need to run a query that will convert the raw data (the stock prices) into quarterly growth rates and display the quarterly growth rates in a DataGridView . 我需要运行一个查询,将原始数据(股票价格)转换为季度增长率,并在DataGridView显示季度增长率。

I've already written the the following query in the SQL View of my Access database and it works within Access. 我已经在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);

I need to be able to call it from within my program and display the results in a DataGridView . 我需要能够从程序中调用它并将结果显示在DataGridView I've tried to copy the SQL statement from Access and use it as the SQL statement in my code but it doesn't work. 我试图从Access复制SQL语句并将其用作代码中的SQL语句,但是它不起作用。 I don't get any errors, the DataGridView is just blank. 我没有任何错误, DataGridView只是空白。 Here is my code so far: 到目前为止,这是我的代码:

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

I'm really stuck and could use some help! 我真的很困,可以寻求帮助! Thanks! 谢谢!

数据库实例

You want that VB.Net code to recreate the same SELECT statement which works in Access. 您希望VB.Net代码重新创建可在Access中使用的相同SELECT语句。 However, looking at the syntax highlighting with Vim, I think you may actually be creating something else. 但是,看看Vim突出显示的语法,我认为您可能实际上正在创建其他东西。 (It may be like creating a string as the difference of 2 other strings: "string 1" - "string 2" ). (这可能就像创建一个字符串来区别其他两个字符串: "string 1" - "string 2" )。

But whether or not I guessed correctly, use a string variable to hold your SELECT statement. 但是,无论我是否猜对了,都使用字符串变量来保存您的SELECT语句。 Then print that string to the console or write it to a text file so that you can examine the actual statement you're giving to the db engine. 然后将该字符串打印到控制台或将其写入文本文件,以便您可以检查要提供给db引擎的实际语句。

Or save the working query in Access as a named query object and use that query name from your VB.Net code --- that would absolutely guarantee using the same SQL which is confirmed to work in Access. 或将工作查询保存为Access中的命名查询对象,并使用您的VB.Net代码中的查询名称---绝对可以保证使用与确认在Access中工作相同的SQL。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM