繁体   English   中英

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

[英]MS Access SQL Select Statement Returns Correct Fields but No Data in the Rows

我有两个Microsoft Access数据库表。 它们分别命名为Historical_Stock_PricesBalance_Sheets 我需要合并每个表中的数据以创建一个名为Daily的表。 我需要的字段Ticker[Date][Close]Historical_Stock_Prices ,我需要采取实地Common_StocksBalance_Sheets

不过,我不会从Historical_Stock_PricesBalance_Sheets获取每一行。 我将只使用在名为dtpDateSelectionDateTimePicker选择的日期上或之前的行。

现在,我遇到的主要问题是, Historical_Stock_Prices每天都包含一行。 Balance_Sheets每个季度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

此代码创建表Daily以及该表中的字段Ticker[Date][Close]Common_Stocks 但是该代码不会将任何数据加载到表的行中。 任何想法为什么不呢?

我不确定您的代码是否执行了您需要执行的操作。 我看不到会创建所需表的CREATE TABLE命令或将记录插入表中的INSERT INTO命令。

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

您可能需要将CREATE PROC Daily AS的第一部分更改为INSERT INTO dbo.Daily 这样,数据将被追加到表中。

您的代码尝试创建等效的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

暂无
暂无

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

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