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.SmallInt
或OleDbType.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 ExecuteNonQuery INSERT INTO - 对数据库没有影响