[英]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.