所以我有一个连接到我的VBA登录界面的Acces数据库,它会引导你到学校假期的报名
我的vba代码中有一个特别奇怪的问题,因为它不能继续我的sql部分,无论我dp。 VBA认为从SQL获得的结果不正确或不利。
我已经在其中添加了一些带有字符串的SQL语句;
因为登录我的程序的学生的loginID只能在组合框中看到假期的具体位置,因为学生在某个班级,但是其他来自下层的学生必须看到他们自己的位置,但是其中一些被合并为两个班级。
不知怎的,我的SQL代码不对;
在数据库表BEHEER中有一个LoginID(代码中的leerlingnr)和一个密码(wachtwoord),他们的类名为Klas。为了方便起见:一名学生的ID为12,密码为1在Leerlingen(荷兰语学生)表中,他现在被分配到1级,但未来他将在A5A,但为了安全的代码崩溃,我做到了1。
Public Class frmInschrijven
Dim strSql As String = ""
Dim strConnectionString As String = ""
Private Sub frmInschrijven_Load() Handles MyBase.Load
'Declareer alle variabelen
Dim strUsername2 As String = ""
Dim strKlas As String = ""
'Bepaal CommandText (=SQL statement om records op te vragen:
strSql = "SELECT B.Leerlingnr, L.Leerlingnr, Wachtwoord, L.KLas, plaats FROM BEHEER B, LEERLINGEN L, Plaatsen P"
'Definieer de verbinding:
strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Werkweek.accdb"
'Maak connection aan op basis van de connectionstring en
'command op basis van de SQL opdracht en gemaakte connection:
Dim objConnection As New OleDb.OleDbConnection(strConnectionString)
Dim objCommand As New OleDb.OleDbCommand(strSql, objConnection)
'Open de verbinding:
objCommand.Connection.Open()
'Maak een DataReader aan op basis van de ingestelde command:
Dim objDataReader As OleDb.OleDbDataReader = objCommand.ExecuteReader(CommandBehavior.CloseConnection)
'Doorloop de Leerlingnr's om te zien in welke klas ze zitten
'Doorloop alle records in de tabel:
While objDataReader.Read
strUsername2 = frmInloggen.strUsername
'Nog zorgen dat ALLEEN data van 1 leerling beschikbaar is, dan pas kan strKlas
strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR")
If strKlas = "1" Then
MsgBox("Correct, you saved me!")
ElseIf strKlas Like "H4A" Then
With cboKeuze1
.Items.Add("apart")
End With
Else MsgBox("try again")
End If
End While
'Sluit de DataReader en de Connection:
objDataReader.Close()
objConnection.Close()
End Sub
BEHEER和LEERLINGEN都有学生证,在BEHEER中用作用户名。
如果你的消息框正确,你保存了我,那么代码应该可行,但是现在我无法通过这部分:
strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR")
有人可以帮帮我吗。 如果我必须包括我的整个.sln请求,我会提供给你。 提前谢谢。
答案 0 :(得分:2)
正如我在问题的评论中提到的,你必须使用参数化查询而不是连接字符串!这是SQL injection的常见原因。
正确的做法是:
Dim command As New OleDbCommand()
command.CommandText = _
"SELECT <ListOfColumns>" & vbCr _
"FROM YourTable WHERE Column1 = @Parameter1"
command.Parameters.AddWithValue("@Parameter1", rmInloggen.strUsername)
有关详细信息,请参阅:
OleDbCommand.Parameters Property
OleDbParameterCollection.AddWithValue Method (String, Object)
答案 1 :(得分:0)
检查最后一个语句=
strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr=""" & frmInloggen.strUsername & """AND B.LEERLINGNR=L.LEERLINGNR")
应该是
strKlas = objDataReader("Select Klas FROM LEERLINGEN L, BEHEER B WHERE L.Leerlingnr='" & frmInloggen.strUsername & "' AND B.LEERLINGNR='L.LEERLINGNR'")
答案 2 :(得分:0)
它应该读取 - 用空格:
strKlas = objDataReader("Select Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='" & frmInloggen.strUsername & "' AND B.LEERLINGNR=L.LEERLINGNR")