我不確定我的問題措辭是否正確,但我將詳細說明。
我的代碼應該是將程式中計算的百分比值與Access資料庫中各自的成績界限進行比較。然后,它根據課程和年級界限輸出一個字母等級(例如,A*、A、B、C)。然而,我的sql查詢似乎并不奏效。
錯誤資訊。"從字串 "SELECT GradeLetter FROM tblGrade "到型別'Double'的轉換是無效的。"
我相信這是一個非常簡單的修復方法,但是到目前為止,我無法在任何地方找到正確的資訊,所以希望能得到任何幫助。
Private Sub txtDenominator_TextChanged(sender As Object, e As EventArgs) Handles txtDenominator. 文本變更
Dim Numerator As Integer。
Dim 分母 As Integer
Dim Percentage As Double[/span
Numerator = txtNumerator.Text[/span]。
分母 = txtDenominator.文本If (Numerator > 0) And (Denominator > 0) And (Numerator <= Denominator) Then
百分比=(分子/分母)*100
否則。
百分比=0
End If
MsgBox(百分比)
Dim con As New OleDb.OleDbConnection
con.ConnectionString = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source = G:/College Database.accdb"
con.Open()
sql = "SELECT GradeLetter FROM tblGrades WHERE
CourseId = '1' AND (GradeBoundaryLow <= " Percentage " )
AND (GradeBoundaryHigh >=" Percentage ")"。
MsgBox(sql)
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds2, "Grades")
con.Close()
End Sub
uj5u.com熱心網友回復:
正如我在評論中所說,你需要做的第一件事就是在專案屬性中為這個專案以及在Tools->Options->Projects and Solutions->VB Defaults中為以后的所有專案打開Option Strict。
您不能依賴用戶在TextBox中輸入您希望的內容。使用.TryParse方法來驗證。
總是使用引數來避免sql注入,并確保正確的型別被發送到資料庫中。我假設CourseId在資料庫中是一個數字型別。不要在數字周圍加上引號。
資料庫物件需要被處理掉。Using...End Using塊為我們處理這個問題。在這種情況下,連接和命令都包含在同一個Using塊中。請注意Using第一行末尾的逗號。
你可以將連接字串直接傳遞給連接的建構式,將CommandText和Connection傳遞給Command的建構式。
我們需要2個引數,盡管值是一樣的。OleDb只考慮引數的位置,而不是名稱。為了便于閱讀,我使用名字而不是"?"。引數在sql字串中的位置必須符合引數被添加到引數集合中的順序。
在.Execute...之前不要打開連接,并盡快用End Using關閉它。
由于你只是檢索一個單一的資料,你可以使用.ExecuteScalar。這將回傳一個Object,所以你必須呼叫.ToString來對GradeLetter進行分配。
Private Sub txtDenominator_TextChanged(sender As Object, e As EventArgs) Handles txtDenominator. 文本變更
Dim Numerator As Integer
Dim 分母 As Integer[/span
Dim 百分比 As Double
If Not Integer.TryParse(txtNumerator.Text, Numerator) Then
MessageBox.Show("請在Numerator中輸入一個有效數字")
Exit Sub
結束 If
If Not Integer.TryParse(txtDenominator.Text, Denominator) Then
MessageBox.Show("請輸入一個有效的分母")
Exit Sub
結束 If
If (Numerator > 0) And (Denominator > 0) And (Numerator <= Denominator) Then
百分比=(分子/分母)*100
Else
百分比=0
結束 If
Dim GradeLetter As String =""
Dim Sql = "SELECT GradeLetter FROM tblGrades
WHERE CourseId = 1
AND GradeBoundaryLow <= @Percentage
AND (GradeBoundaryHigh >= @Percentage2;"
使用con As New OleDb.OleDbConnection("PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source = G:/College Database.accdb")。)
cmd As New OleDbCommand(Sql, con)
cmd.Parameters.Add("@Percentage", OleDbType.Double).Value = Percentage
cmd.Parameters.Add("@Percentage2", OleDbType.Double).Value = Percentage
con.Open()
GradeLetter = cmd.ExecuteScalar.ToString
結束使用
MessageBox.Show($"{Percentage:N2}%的成績字母是{GradeLetter}")
End Sub
uj5u.com熱心網友回復:
你得到的錯誤資訊是因為sql是一個字串,`percentage是一個雙數。
您的快速解決方案是用percentage.tostring()將percentage轉換為字串。
uj5u.com熱心網友回復:
你有Option Strict Off,并使用 將物件 "添加 "到一起。 而Percentage是一個雙數,結合這三個事實,你的代碼是有效的:
sql = CDbl("SELECT GradeLetter FROM tblGrades WHERE
CourseId = '1' AND (GradeBoundaryLow <= ") Percentage
Cdbl(")
AND (GradeBoundaryHigh >=") Percentage CDbl(") ")
這當然是行不通的。 如果你把Option Strict打開,編譯器會告訴你這個問題,但你還是得自己解決。
最簡單的修復方法是使用&而不是 ,更正確的方法是使用字串插值或引數。 考慮到百分比是一個雙數(所以沒有sql注入的危險),我會使用字串插值,像這樣......
sql = $"SELECT GradeLetter
FROM tblGrades
WHERE CourseId = '1' AND (GradeBoundaryLow <= {Percentage})
AND (GradeBoundaryHigh >= {Percentage}"
PS除非你需要性能,否則我建議使用十進制來表示你的百分比。
uj5u.com熱心網友回復:
如果欄位是數字型別,不要用撇號包圍引數。可能需要用引號把每一行的部分都括起來的續行字符。試試BETWEEN AND語法。請考慮:
sql = "SELECT GradeLetter FROM tblGrades" & _
"WHERE CourseId = 1 AND " & Percentage & " BETWEEN GradeBoundaryLow AND GradeBoundaryHigh"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314444.html
標籤:
