MS Access SQL Select语句返回正确的字段但行中没有数据

时间:2013-10-03 18:24:42

标签: sql vb.net ms-access select-query

我有两个Microsoft Access数据库表。它们的名称为Historical_Stock_PricesBalance_Sheets。我需要组合每个表中的数据来创建一个名为Daily的表。我需要从Ticker获取字段[Date][Close]Historical_Stock_Prices,我需要从Common_Stocks获取字段Balance_Sheets。< / p>

我不会从Historical_Stock_PricesBalance_Sheets获取每一行。我只会在名为DateTimePicker的{​​{1}}中选择日期之前或之前的行。

现在我遇到的主要问题是dtpDateSelection每天都包含一行。虽然Historical_Stock_Prices每季度包含一行。因此,对于四分之一的每一天,来自Balance_Sheets的数字都是相同的。

这是我到目前为止的代码:

Balance_Sheets

此代码在该表格中创建表格Dim Date1 As Date = dtpDateSelection.Value Try Dim cmd As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT [H].[Ticker], [H].[Date], [H].[Close], [B].[Common_Stocks] FROM [Historical_Stock_Prices] AS [H] INNER JOIN [Balance_Sheets] AS [B] ON Int(Year([H].[Date])) = Int([B].[Year]) AND Int(Format([H].[Date],'Q')) = Int([B].[Period]) AND CStr([H].[Ticker]) = CStr([B].[Ticker]) WHERE CDate([H].[Date]) = #" & CDate(Date1) & "#", con) cmd.ExecuteNonQuery() Catch ex As Exception Finally Dim cmda As OleDbCommand = New OleDbCommand("DROP PROCEDURE Daily", con) cmda.ExecuteNonQuery() Dim cmdb As OleDbCommand = New OleDbCommand("CREATE PROC Daily AS SELECT [H].[Ticker], [H].[Date], [H].[Close], [B].[Common_Stocks] FROM [Historical_Stock_Prices] AS [H] INNER JOIN [Balance_Sheets] AS [B] ON Int(Year([H].[Date])) = Int([B].[Year]) AND Int(Format([H].[Date],'Q')) = Int([B].[Period]) AND CStr([H].[Ticker]) = CStr([B].[Ticker]) WHERE CDate([H].[Date]) = #" & CDate(Date1) & "#", con) cmdb.ExecuteNonQuery() End Try 以及字段DailyTicker[Date][Close]。但是代码不会将任何数据加载到表的行中。任何想法为什么不呢?

3 个答案:

答案 0 :(得分:1)

我不确定您的代码是否符合您的要求。我没有看到用于创建所需表的CREATE TABLE命令或用于将记录插入表中的INSERT INTO命令。

答案 1 :(得分:1)

您似乎正在创建一个存储过程,该过程实际上没有INSERT您提到的表Daily中的任何数据。

您可能希望将第一部分CREATE PROC Daily AS更改为INSERT INTO dbo.Daily。这样,数据将附加到表格中。

答案 2 :(得分:1)

您的代码尝试创建View的等效项。它本身不会返回任何数据。 您可以从SELECT语句返回数据。不确定语法是否正确但您可以直接使用MS-Access尝试cmdText并验证结果

Dim cmdText = "SELECT [H].[Ticker], [H].[Date], [H].[Close], [B].[Common_Stocks] " & _
              "FROM [Historical_Stock_Prices] AS [H] INNER JOIN [Balance_Sheets] AS [B] " & _
              "ON Year([H].[Date]) = [B].[Year] AND " & _
              "Format([H].[Date],'Q') = [B].[Period] AND " & _
              "[H].[Ticker] = [B].[Ticker] "
              "WHERE [H].[Date] = ?"
Using cmdb = New OleDbCommand(cmdText, con)
    cmdb.Parameters.AddWithValue("@1", CDate(Date1))
    Using da = new OleDbDataAdapter(cmdb)
        Dim dt = new DataTable("Daily")
        da.Fill(dt)
        ' now you have an IN MEMORY DataTable named Daiyly filled with the data '
        ' returned by the SELECT query '
    End Using
End Using