簡體   English   中英

參數 @Something 沒有默認值(Access 數據庫、Visual Studio VB.NET)

[英]Parameter @Something Has No Default Value (Access Database, Visual Studio VB.NET)

我正在使用 Access 數據庫來存儲錯誤發生的記錄,以跟蹤錯誤的數量和頻率。 多虧了這個網站上一些有天賦的程序員的大力幫助,我現在離我的最終目標越來越近了,即將出現次數從數據庫中提取出來,並放入 Visual Studio 程序的圖表中。

我遇到的問題是我的 function 中的這一行拋出錯誤:

計數 = command.ExecuteScalar()

錯誤如下:

System.Data.OleDb.OleDbException:“參數 @MY_OF_LOG 沒有默認值。”

我成功地為計數返回了一個值,即 0。這是一個可能的值,但我現在想知道計數返回為零的事實是否是導致此錯誤的部分原因?

注意:每個月從這些計數中返回的值將用作圖表的 y 值。

有誰知道為什么會發生此錯誤? 我將在下面插入我的代碼片段。 謝謝您的幫助。

Private Function CountMissedParts() Handles MyBase.Load

    Dim sql = $"SELECT COUNT(*)
        FROM DataCollection
        WHERE [MISSED PART] = 'Missed Part'
        AND [M/Y OF LOG] = @MY_OF_LOG;"
    Dim JANmyOfLog = #1/1/2021#
    Dim FEBmyOfLog = #2/1/2021#
    Dim MARmyOfLog = #3/1/2021#
    Dim APRmyOfLog = #4/1/2021#
    Dim MAYmyOfLog = #5/1/2021#
    Dim JUNmyOfLog = #6/1/2021#
    Dim JULmyOfLog = #7/1/2021#
    Dim AUGmyOfLog = #8/1/2021#
    Dim SEPmyOfLog = #9/1/2021#
    Dim OCTmyOfLog = #10/1/2021#
    Dim NOVmyOfLog = #11/1/2021#
    Dim DECmyOfLog = #12/1/2021#
    Dim count As Integer
    Dim JanuaryMP As Double
    Dim FebruaryMP As Double
    Dim MarchMP As Double
    Dim AprilMP As Double
    Dim MayMP As Double
    Dim JuneMP As Double
    Dim JulyMP As Double
    Dim AugustMP As Double
    Dim SeptemberMP As Double
    Dim OctoberMP As Double
    Dim NovemberMP As Double
    Dim DecemberMP As Double

    Using connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb"),
            command As New OleDbCommand(sql, connection)
        JanuaryMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = JANmyOfLog
        FebruaryMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = FEBmyOfLog
        MarchMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = MARmyOfLog
        AprilMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = APRmyOfLog
        MayMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = MAYmyOfLog
        JuneMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = JUNmyOfLog
        JulyMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = JULmyOfLog
        AugustMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = AUGmyOfLog
        SeptemberMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = SEPmyOfLog
        OctoberMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = OCTmyOfLog
        NovemberMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = NOVmyOfLog
        DecemberMP = command.Parameters.Add("@MY_OF_LOG", OleDbType.Date).Value = DECmyOfLog
        connection.Open()
        count = command.ExecuteScalar()

        ' set 0,0
        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(0, 0)
        ' other points
        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(1, JanuaryMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(2, FebruaryMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(3, MarchMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(4, AprilMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(5, MayMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(6, JuneMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(7, JulyMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(8, AugustMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(9, SeptemberMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(10, OctoberMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(11, NovemberMP)

        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(12, DecemberMP)

    End Using
    NotInEpicorCHRT.ChartAreas(0).AxisX.Minimum = 0.0
    NotInEpicorCHRT.ChartAreas(0).AxisX.Maximum = 12
    NotInEpicorCHRT.ChartAreas(0).AxisX.Interval = 1
    NotInEpicorCHRT.ChartAreas(0).AxisY.Minimum = 0.0
    NotInEpicorCHRT.ChartAreas(0).AxisY.Maximum = 45
    NotInEpicorCHRT.ChartAreas(0).AxisY.Interval = 5

End Function

一個小警告:我對圖表沒有太多經驗,但其他東西應該沒問題。

重要的部分是:

 Dim logDates() As DateTime...

這聲明了一個 DateTime 數組。 當您打算遍歷值時,數組是一種存儲相同類型的多個值的簡單方法。 我還冒昧地使用 VB.Net DateTime 類型來顯式 state 年、月和日期值。 這種方法將使您和閱讀您的代碼的其他人更加清楚。

 For counter As Integer = 0 To logDates.Count - 1

數據庫命令執行 12 次,對數組中的每個條目執行一次。

 Using Command As New OleDbCommand(sql, connection) Command.Parameters.Add("MY_OF_LOG", OleDbType.Date).Value = logDates(counter) Dim returnValue = Command.ExecuteScalar() Dim count As Integer = Integer.Parse(returnValue.ToString) ' other points NotInEpicorCHRT.Series("Missed Part").Points.AddXY(counter + 1, count) End Using

然后使用您原來的索引將 ExecuteScalar 的返回值放入圖表系列


整個代碼建議如下:

    Public Sub CountMissedParts()
        Dim logDates() As DateTime = {New DateTime(2021, 1, 1),
                                      New DateTime(2021, 2, 1),
                                      New DateTime(2021, 3, 1),
                                      New DateTime(2021, 4, 1),
                                      New DateTime(2021, 5, 1),
                                      New DateTime(2021, 6, 1),
                                      New DateTime(2021, 7, 1),
                                      New DateTime(2021, 8, 1),
                                      New DateTime(2021, 9, 1),
                                      New DateTime(2021, 10, 1),
                                      New DateTime(2021, 11, 1),
                                      New DateTime(2021, 12, 1)}

        ' set 0,0
        NotInEpicorCHRT.Series("Missed Part").Points.AddXY(0, 0)

        Using connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb")
            connection.Open()

            For counter As Integer = 0 To logDates.Count - 1
                Dim sql = $"SELECT COUNT(*) FROM DataCollection WHERE [MISSED PART] = 'Missed Part' AND [M/Y OF LOG] = @MY_OF_LOG;"
                Using Command As New OleDbCommand(sql, connection)
                    Command.Parameters.Add("MY_OF_LOG", OleDbType.Date).Value = logDates(counter)
                    Dim returnValue = Command.ExecuteScalar()

                    Dim count As Integer = Integer.Parse(returnValue.ToString)

                    ' other points
                    NotInEpicorCHRT.Series("Missed Part").Points.AddXY(counter + 1, count)
                End Using
            Next
        End Using

        NotInEpicorCHRT.ChartAreas(0).AxisX.Minimum = 0.0
        NotInEpicorCHRT.ChartAreas(0).AxisX.Maximum = 12
        NotInEpicorCHRT.ChartAreas(0).AxisX.Interval = 1
        NotInEpicorCHRT.ChartAreas(0).AxisY.Minimum = 0.0
        NotInEpicorCHRT.ChartAreas(0).AxisY.Maximum = 45
        NotInEpicorCHRT.ChartAreas(0).AxisY.Interval = 5
    End Sub

由於您已經接受了答案,我認為您的問題已解決。 我的 function 看起來像這樣。

Private Function CountMissedParts() As DataTable
    Dim sql = "SELECT [M/Y OF LOG], COUNT([Missed Part]) As Total 
                FROM [Data Collection] 
                WHERE [MISSED PART] = 'MISSED PART' GROUP BY [M/Y OF LOG]  
                ORDER BY [M/Y OF LOG];"
    Using dt As New DataTable
        Using connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb"),
        command As New OleDbCommand(sql, connection)
            connection.Open()
            Using reader = command.ExecuteReader
                dt.Load(reader)
            End Using
        End Using
        Return dt
    End Using
End Function

用法。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt = CountMissedParts()
    'Add a grid to your form just to see what data was returned
    'If all is well delete grid and the following line
    DataGridView1.DataSource = dt
    'To show you how to access the data
    'Inside the For loop is where you would put the code to fill you graph
    For Each row As DataRow In dt.Rows
        Debug.Print($"{row("M/Y OF LOG")}  -  {row("Total")}")
    Next
End Sub

順便說一句,如果之前的答案不起作用,您可以再次單擊檢查並選擇另一個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM