ASPX VB.Net OleDb 将参数插入查询

Posted

技术标签:

【中文标题】ASPX VB.Net OleDb 将参数插入查询【英文标题】:ASPX VB.Net OleDb Insert Parameter into Query 【发布时间】: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 是在第一次失败后添加的,看看是否可以修复它。 您发布的代码显然是错误的。编辑您的问题并发布您认为应该是的代码,我们会处理。 【参考方案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 使用。

以上是关于ASPX VB.Net OleDb 将参数插入查询的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 指定选择查询OLEDB数据库

使用 OleDb 插入访问时出现语法错误

从 vb.net 将值插入 Access db

VB.Net OLEDB ExecuteNonQuery INSERT INTO - 对数据库没有影响

VB.NET 将 DataGridVIew 内容插入 SQL Server 表

更新查询在带有 MS Access 的 VB.NET 中不起作用