使用参数化查询会导致数据类型不匹配。有任何想法吗?

时间:2014-11-26 21:30:38

标签: asp.net vb.net ms-access-2010

我有一个控件ID为HourlyCharter的dropdownList。

然后在codebehind上,我试图从数据库中查询每小时等于HourlyCharter值的记录。

如果我使用此代码:

    StrSQL = "select h.fare, h.tip, h.total from hourlyQRY h "
    StrSQL += " Where h.Hourly = " & HourlyCharter.SelectedValue

' Initialize Database Connection
Dim connStr As String = ConfigurationManager.ConnectionStrings("ALSConnectionString").ConnectionString
Dim conn As New OleDbConnection(connStr)
Dim cmd As New OleDbCommand(StrSQL, conn)

有效。

如果我使用参数化查询,例如:

    StrSQL = "select h.fare, h.tip, h.total from hourlyQRY h "
    StrSQL += " Where h.Hourly = @hourly"

' Initialize Database Connection
Dim connStr As String = ConfigurationManager.ConnectionStrings("ALSConnectionString").ConnectionString
Dim conn As New OleDbConnection(connStr)
Dim cmd As New OleDbCommand(StrSQL, conn)

'We use parametized query to prevent sql injection attack
Dim p1 As New OleDbParameter("@hourly", HourlyCharter.SelectedValue)

cmd.Parameters.Add(P1)

我收到以下错误:

条件表达式中的数据类型不匹配

每小时是数字数据类型,我们正在使用Access 2010数据库。

有任何想法如何解决这个问题?

    'open recordset to receive db values
rs = cmd.ExecuteReader()

' This acts like the (Not RecordSource.Eof) in ASP 3.0 to loop and retrieve records.
While rs.Read()
    '    If rs("city") <> "" Then
    Dim tipValue As Decimal = rs("tip")
    Dim totValue = rs("total")
    '   Else
    '   End If
    Dim tp As String = [String].Format("{0:C}", tipValue)
    Dim tot As String = [String].Format("{0:C}", totValue)
    lblTip.Text = tp
    lblTotal.Text = tot

End While

3 个答案:

答案 0 :(得分:1)

您需要确保放在参数中的对象也是数字类型。 SelectedValue是一个字符串。

Dim p1 As New OleDbParameter("@hourly", Decimal.Parse(HourlyCharter.SelectedValue))

发生数据类型不匹配的地方 - 它期待一个数字,但它会得到一个字符串。

答案 1 :(得分:0)

尝试指定参数的数据类型。您可以在创建后执行此操作:

p1.OleDbType = OleDb.OleDbType.Numeric

您也可以在构造函数上执行此操作,但它需要更多参数,我不确定您是否拥有所有这些参数,也不知道它们是做什么的。

答案 2 :(得分:0)

而不是

Dim p1 As New OleDbParameter("@hourly", HourlyCharter.SelectedValue)
cmd.Parameters.Add(p1)

你可以尝试

cmd.Parameters.AddWithValue("@hourly", HourlyCharter.SelectedValue)