SQL代码中存在字符串变量的困难

时间:2017-06-23 19:34:22

标签: sql vb.net ms-access

所以我有一个连接到我的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请求,我会提供给你。 提前谢谢。

3 个答案:

答案 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")