【问题标题】:Visual Basic.Net 2010 Exception Error meaningVisual Basic.Net 2010 Exception 错误含义
【发布时间】:2014-06-10 16:07:23
【问题描述】:

谁能帮我弄清楚这个错误语句的含义。我不断收到这个错误语句:-

索引(从零开始)必须大于或等于零且小于参数列表的大小

下面是我的代码

Imports System.Data.OleDb
Public Class form2


    Dim Mycn As OleDbConnection
    Dim Command As OleDbCommand
    Dim icount As Integer
    Dim SQLstr As String

    Private Sub Button1_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Try
            Mycn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\lenovo\Documents\Final year stuff\BookStoreDb.mdb;")
            Mycn.Open()

            SQLstr = String.Format("INSERT INTO login VALUES('{0}','{1}','{2}','{3}','{4}')", TextBox1.Text, TextBox2.Text)
            Command = New OleDbCommand(SQLstr, Mycn)


            icount = Command.ExecuteNonQuery
            MessageBox.Show(icount)


        Catch ex As Exception
            MessageBox.Show(ex.Message & " - " & ex.Source)
            Mycn.Close()
        End Try
    End Sub



    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Me.Close()

    End Sub

End Class

【问题讨论】:

  • 您没有在调用 String.Format 时填写所有参数。
  • String.Format 有 5 个占位符,但只有 2 个值。那个 SQL 对 SQL 注入攻击是开放的,你应该使用参数,这两个问题都会消失。此外,SQL 字符串中的记号 (` ' `) 将所有值强制为字符串,这可能是您想要的,也可能不是您想要的,具体取决于表。
  • 我需要把所有的字段都放在登录表中还是我要插入数据的字段?
  • 如果您只提供一些表值,您需要更改 SQL 以告诉它您希望插入哪些列,然后您可以只提供这些值:"INSERT INTO Login ([User], [Password]) VALUES ('{0}','{1}')"。但最大的问题是SQL injection。参数将消除 SQL 中的刻度问题和问题

标签: vb.net visual-studio-2010 ms-access-2007


【解决方案1】:

按照 Plutonix 的建议,只需指定两个字段。

您可以将它与参数结合起来,这样您也可以免受注入攻击。

尝试以下方法:

SQLstr = String.Format("INSERT INTO Login (User, Password) VALUES ('{0}','{1}')", TextBox1.Text, TextBox2.Text)
Command = New OleDbCommand(SQLstr, Mycn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 2023-03-26
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多