我有两个Microsoft Access数据库表。它们的名称为Historical_Stock_Prices
和Balance_Sheets
。我需要组合每个表中的数据来创建一个名为Daily
的表。我需要从Ticker
获取字段[Date]
,[Close]
和Historical_Stock_Prices
,我需要从Common_Stocks
获取字段Balance_Sheets
。< / p>
我不会从Historical_Stock_Prices
和Balance_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
以及字段Daily
,Ticker
,[Date]
和[Close]
。但是代码不会将任何数据加载到表的行中。任何想法为什么不呢?
答案 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