Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 转换varchar值时转换失败';[]和#x27;到数据类型int_Asp.net_Sql_Sql Server_Vb.net_Search - Fatal编程技术网

Asp.net 转换varchar值时转换失败';[]和#x27;到数据类型int

Asp.net 转换varchar值时转换失败';[]和#x27;到数据类型int,asp.net,sql,sql-server,vb.net,search,Asp.net,Sql,Sql Server,Vb.net,Search,我正在尝试创建一个搜索函数,它使用一个文本框和两个下拉列表从我的MSSQL数据库返回条目。我设置它的方法是通过QueryString将搜索查询传递到单独页面上的GridView。以下是我的搜索功能: Partial Class Includes_LeftCol Inherits System.Web.UI.UserControl Public Sub btnSearch_Click(sender As Object, e As System.EventArgs) Handles bt

我正在尝试创建一个搜索函数,它使用一个文本框和两个下拉列表从我的MSSQL数据库返回条目。我设置它的方法是通过QueryString将搜索查询传递到单独页面上的GridView。以下是我的搜索功能:


Partial Class Includes_LeftCol
  Inherits System.Web.UI.UserControl

  Public Sub btnSearch_Click(sender As Object, e As System.EventArgs) Handles btnSearch.Click

    Dim SelectURLRangePrice As String

    If tbxSearch.Text.Length = 0 And ddlRangeName.SelectedValue = "" And ddlPriceRange.SelectedValue = "" Then

      SelectURLRangePrice = "SearchResults.aspx"
      Response.Redirect(SelectURLRangePrice)

    ElseIf tbxSearch.Text.Length = 0 And ddlRangeName.SelectedValue = "" And ddlPriceRange.SelectedValue.Length > 0 Then

      SelectURLRangePrice = "SearchResults.aspx?price=" & ddlPriceRange.Text
      Response.Redirect(SelectURLRangePrice)

    ElseIf tbxSearch.Text.Length = 0 And ddlRangeName.SelectedValue.Length > 0 And ddlPriceRange.SelectedValue.Length > 0 Then

      SelectURLRangePrice = "SearchResults.aspx?range=" & ddlRangeName.Text & "&price=" & ddlPriceRange.Text
      Response.Redirect(SelectURLRangePrice)

    End If

    Dim SelectURLRange As String

    If tbxSearch.Text.Length = 0 And ddlRangeName.SelectedValue.Length = 0 Then

      SelectURLRange = "SearchResults.aspx"
      Response.Redirect(SelectURLRange)

    ElseIf tbxSearch.Text.Length = 0 And ddlRangeName.SelectedValue.Length > 0 Then

      SelectURLRange = "SearchResults.aspx?range=" & ddlRangeName.Text
      Response.Redirect(SelectURLRange)

    End If

    Dim SelectURL As String

    If tbxSearch.Text.Length = 0 Then

      SelectURL = "SearchResults.aspx"
      Response.Redirect(SelectURL)

    ElseIf tbxSearch.Text.Length > 0 Then

      SelectURL = "SearchResults.aspx?search=" & tbxSearch.Text
      Response.Redirect(SelectURL)

    End If

  End Sub

End Class
下面是我的SQL语句:



    SELECT        Product_Rental, Product_ID, Range_Name, Model_Name, Product_Name, Product_Year, Product_Code, Product_Active, Product_DateAdded
    FROM            Products
    WHERE        (Range_Name LIKE '%' + @Range_Name + '%') OR
                             (Model_Name LIKE '%' + @Model_Name + '%') OR
                             (Product_Name LIKE '%' + @Product_Name + '%') OR
                             (Product_Code LIKE '%' + @Product_Code + '%') OR
                             (Product_Year LIKE '%' + @Product_Year + '%') OR
                             (Product_Rental BETWEEN @Product_Rental AND @Product_Rental + 50)

提交后,我会出现以下错误:

将varchar值“[例如209.35]”转换为int数据类型时,转换失败。

我是这方面的新手,所以如果这是愚蠢的事情,我会道歉,我在发帖之前已经尽力了,但我就是无法克服这一点


提前感谢。

SQL类型INT表示整数(1,2,3)。FLOAT可以支持小数。像[和]这样的文本字符肯定不能与INT列一起使用

根据评论编辑:

由于Product_Rental字段为VarChar,请尝试更改为该字段(如果您不想更改表上的类型,我建议您这样做):

问题在于:

Product_Rental BETWEEN @Product_Rental AND @Product_Rental + 50
Product_Rental BETWEEN @Product_Rental AND @Product_Rental + 50
这里有多种类型的操作数。其中一个是整数。SQL Server正在尝试将所有内容都转换为整数,以便可以对它们进行有意义的比较(为什么选择整数?优先级规则)。在这种情况下,它不能这样做,因为在SQL中,不能隐式地将带有小数点的varchar转换为整数。信息会在那里丢失,所以它不会自动为您丢失信息。如果您确实需要所有整数,则必须将其转换为浮点,然后隐式地将浮点截断为整数。最好将这里的所有内容都转换为一个浮点数,因为您确实希望在这里比较浮点数。如果您这样做,SQL Server就不会在猜测您需要什么样的数据类型时左右为难

因此,如果varchar值有小数点,您将得到一个类似于您给我们的错误,但其中没有方括号。(请不要在错误消息中插入随机字符,并告诉人们SQL Server给了您什么,如果不是的话)

试试这个:

convert(float,Product_Rental) 
  BETWEEN convert(float,@Product_Rental) 
      AND convert(float,@Product_Rental) + 50
这就是为什么您应该在表和变量中使用正确的数据类型。两者都应该一直是十进制或浮点

如果变量中或其中任何一个字段中的实际值为
'[例如209.35]'
,则无论如何都无法转换为float

问题在于:

Product_Rental BETWEEN @Product_Rental AND @Product_Rental + 50
Product_Rental BETWEEN @Product_Rental AND @Product_Rental + 50
因为您正在使用
+50
启动。文件规定:

当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定优先级较低的数据类型转换为优先级较高的数据类型。如果转换不是受支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算结果具有该数据类型

因此,SQL Server在内部尝试将
@Product\u rent
转换为int(因为50是int,而int的优先级高于varchar)。因此,只要这可以简单地再现:

DECLARE @Var VARCHAR(6) = '50';
SELECT   *
FROM    (VALUES (1)) T (A)
WHERE   A < @Var + 50;

我建议,如果您的列
Product\u rent
包含十进制数据,那么它应该是十进制类型,用于筛选该列的任何参数也应该是十进制类型。

Product\u rent字段是什么类型,以及其中包含什么?变量@Product\U RETANCE是什么类型的,其中包含什么?该错误消息告诉您,有问题的varchar值有两个方括号和缩写
'e.g.
。它告诉你那些记号之间的所有东西都是它无法转换的值。检查您的输入。看起来您在输入中有一个“cue”占位符值作为实际文本,您在提交时没有检查它是否有效。Product\u rent字段是VARCHAR,@Product\u rent变量是字符串。这些内容是价格,因此最多可以有2位小数。很抱歉,我在错误消息中以[]为例。由于SQL声称它是INT,因此似乎有些不符,但无论如何,如果Product_Rental是prices,则我建议您的SQL DB类型为FLOAT、DECIMAL或MONEY。感谢您的回复。好的,这是有道理的,但我不确定转换为INT的尝试在哪里发生。问题中的数据库列是VARCHAR,我使用的SQL参数都是字符串类型。虽然您的答案基本上是正确的,因为发生了am无效转换,但“BETWEEN将尝试将VARCHAR操作数隐式转换为int”的概念不是,转换与
BETWEEN
运算符无关,这是因为在同一个表达式中组合了不同的数据类型。谢谢!他很有魅力。对于SQL错误中的[]表示歉意。谢谢。这是非常有益的。我将按照您的建议更改Product_Rental列类型。
A < @Var + 50
A < CONVERT(INT, @Var) + 50;
SELECT  CONVERT(INT, '50.0');