【问题标题】:difficulties with SQL code with string variable in it带有字符串变量的 SQL 代码的困难
【发布时间】:2017-06-23 19:34:21
【问题描述】:

所以我有一个连接到我的 VBA 登录框架的访问数据库,它会将您引导到学校假期的注册框架

我的 vba 代码中有一个特别奇怪的问题,因为无论我使用什么 dp,它都无法继续使用我的 sql 部分。 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,请提出要求,我会将其提供给您。 提前致谢。

【问题讨论】:

标签: sql vb.net ms-access


【解决方案1】:

正如我在问题的评论中提到的,您必须使用参数化查询而不是连接字符串!这就是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)

【讨论】:

  • 对不起,我没有对此做出反应,但我也不明白,我会尝试这个和其他人的建议。非常感谢
  • 我应该如何将它插入到组合框中?
  • 您可以使用例如DataTable 对象。 Dim oRdr As OleDbReader = command.ExecuteReader() Dim oDt As DataTable = New DataTable dt.Load(oRdr) 现在,使用 Combobox1.DataSource = dt
  • 对了,我还是不太懂你的代码怎么实现,vba我不是很擅长
  • 这不是 VBA!这是一个 VB.NET!
【解决方案2】:

检查最后一条语句 =

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'")

【讨论】:

  • 对我来说没有任何改变。唯一的区别是,taht OP 使用双引号,而您使用的是单引号。这意味着相同。
  • 我不是提问者。
  • 让他试试看:)
  • 我应该给你一个 Dropbox 链接吗?
  • 没有。我们可以聊天,我可以帮你调试。正如您所提到的,您收到错误 `Select Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='' AND B.LEERLINGNR=L.LEERLINGNR' 额外的双引号困扰着您。你应该小心字符串连接。
【解决方案3】:

它应该是 - 有一个空格:

strKlas = objDataReader("Select Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='" & frmInloggen.strUsername & "' AND B.LEERLINGNR=L.LEERLINGNR")

【讨论】:

  • 对不起,这是我回来的,但我还没有尝试过@Maciej 他的解决方案,因为我不太明白。得到这个: System.Data.dll 中发生了“System.IndexOutOfRangeException”类型的未处理异常附加信息:选择 Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='' AND B.LEERLINGNR=L.LEERLINGNR跨度>
  • 如果你得到Select Klas FROM LEERLINGEN As L, BEHEER As B WHERE L.Leerlingnr='' AND B.LEERLINGNR=L.LEERLINGNR 那么frmInloggen.strUsername 是空的。
  • @Gustav 是的,经过片刻的思考,我得出了这个结论,但是如何从另一个表单中创建一个变量以保持其值,直到整个程序停止
  • 创建一个名为 LaatsteLeerlingnr 的类 frmInschrijven 的公共变量或属性。在关闭表单之前设置它。将 SQL 调整为:.. WHERE L.Leerlingnr='" &amp; LaatsteLeerlingnr &amp; "' AND ...
  • 好吧,我已经通过将登录表单中的字符串转换为另一种形式的标签来完成它,然后我将 lbl.text 作为变量,但我得出的结论是 datareader 没有给出一个值。我应该像这样制作数据阅读器吗? objDatareader.getstring("SQL 代码")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2017-10-04
  • 2015-07-18
相关资源
最近更新 更多