【问题标题】:ASPX VB.Net OleDb Insert Parameter into QueryASPX VB.Net OleDb 将参数插入查询
【发布时间】:2018-07-01 05:23:33
【问题描述】:

这是我第一次在 VB.Net 中编写 aspx 页面。

我遇到的问题是参数没有进入cmd.Parameters.Add 行的查询。

我得到的错误是

没有为一个或多个必需参数指定值。

上线

reader = cmd.ExecuteReader;

我试过了:

  • 像我展示的那样在查询顶部添加PARAMETERS
  • 在参数周围删除和添加[]
  • OleDbType.Integer 更改为OleDbType.SmallIntOleDbType.BigInt

我知道查询有效,因为我可以将它放入 MS Access 中,并且在我添加参数后运行。但当我在 Visual Studio 中运行它时不会。

Dim reader As OleDbDataReader
Dim cmd As OleDbCommand
Dim SQL As String = "PARAMETERS [@ID] Long; " &
                    "SELECT tblField.FieldName, " &
                           "tblField.FieldCaption, " &
                           "tblField.FieldMinCharNum, " &
                           "tblField.FieldMaxCharNum, " &
                           "tblField.FieldDefault, " &
                           "tblField.FieldSection, " &
                           "tblField.FirstQuestion, " &
                           "tblField.FieldDescription, " &
                           "tblField.FieldRegEx " &
                     "FROM tblField " &
                     "WHERE tblField.FieldID = [@ID];"

cmd = New OleDbCommand(SQL, Connection.Connection)
cmd.Parameters.Add("[@ID]", OleDbType.Integer).Value = ID

reader = cmd.ExecuteReader

我有一个解决方法,只需将参数预插入 SQL 字符串即可。但我想让这项工作适用于尚未编写的页面的其他区域。用户输入返回到数据库的位置,因此输入被清理。

谢谢大家。

【问题讨论】:

  • 去掉第一行的SQL代码。您所需要的只是SELECT 声明。还要去掉参数周围的括号。括号用于强制将某些内容解释为标识符,因此您只需将它们放在标识符周围,即使这样,仅当文本不会被解释为标识符时才需要它们,即它是保留字或包含空格或其他特殊字符。
  • 数据库中列的数据类型是什么?这决定了您用于参数的数据类型。这不是任意的,也没有必要猜测。如文档所述,BigInt 用于 64 位数字,Integer 用于 32 位数字,SmallInt 用于 16 位数字。
  • @jmcilhinney 该字段是一个访问自动编号,因此是 32 位的,这就是为什么我首先尝试了 Integer,但为了确保我没有犯错而对其进行了更改。
  • @jmcilhinney [] 围绕着最初不存在的变量,它没有任何区别。我添加了它们以确保。 PARAMETERS 是在第一次失败后添加的,看看是否可以修复它。
  • 您发布的代码显然是错误的。编辑您的问题并发布您认为应该是的代码,我们会处理。

标签: asp.net vb.net ms-access oledb query-parameters


【解决方案1】:

OLEDB 不使用@ 来标识参数。它用 ?并按照它们在 SQL 中出现的顺序分配参数,将您的代码修改为...

Dim reader As OleDbDataReader
Dim cmd As OleDbCommand
Dim SQL As String = "SELECT tblField.FieldName, " &
                           "tblField.FieldCaption, " &
                           "tblField.FieldMinCharNum, " &
                           "tblField.FieldMaxCharNum, " &
                           "tblField.FieldDefault, " &
                           "tblField.FieldSection, " &
                           "tblField.FirstQuestion, " &
                           "tblField.FieldDescription, " &
                           "tblField.FieldRegEx " &
                      "FROM tblField " &
                     "WHERE tblField.FieldID = ?"

cmd = New OleDbCommand(SQL, Connection.Connection)
cmd.Parameters.Add("?", OleDbType.Integer).Value = ID

reader = cmd.ExecuteReader

【讨论】:

    【解决方案2】:

    我不明白为什么你提到的 SQL 是从 SQL 查询中检索数据,还是要将数据插入表中。

    您使用Dim cmd As OleDbCommand 表示用于将输入值插入到数据库中,如以下示例代码所示。

           query = "INSERT INTO ds.students (ID,NAME,PIC)" & _
           "VALUES (@ID,@NAME,@PIC);"
            Dim cmd As OracleCommand = New OracleCommand(query, con)
            cmd.Parameters.Add("@ID", Convert.ToInt32(TextBox1.Text))
            cmd.Parameters.Add("@NAME", Convert.ToString(TextBox2.Text))
            cmd.Parameters.Add("@PIC", arrImage)
            con.Open()
            cmd.ExecuteNonQuery()
            con.Close()
    

    你也可以试试这个

    Using cn As OracleConnection = New OracleConnection(connectionString)
    
        cn.Open()
    
        Using cmd As OracleCommand = New OracleCommand()
    
            Const sql As String = "Insert into test_table (val1, val2) values (:var1, :var2)"
            cmd.Connection = cn
            cmd.Parameters.Add(New OracleParameter("var1", TxtField1.Text))
            cmd.Parameters.Add(New OracleParameter("var2", TxtField2.Text))
            cmd.CommandText = sql
            cmd.ExecuteNonQuery()
    
        End Using
    
    End Using
    

    如果您想将值插入数据库,请根据给定的示例更改您的代码。

    希望这会对你有所帮助。

    【讨论】:

    • 您的第一个示例不适用于 Oracle,因为它使用冒号来标识参数。 @ 由 SQL/Server 使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多