参数化查询'(@Physical_Address_Street varchar(50),@ Physical_Address_Local va'需要参数'@Physical_Address_Street'

时间:2013-04-18 16:11:18

标签: asp.net sql-server-2008

我是非常非常新的SQL服务器,我正在创建一个web服务,并且使用下面的代码我得到上面的错误,我想知道它是什么我做错了?

<WebMethod()> _
Public Function GetAddresses(ByVal skip As Integer, ByVal take As Integer) As FuelStop()
    Dim resultList = New List(Of FuelStop)()
    Using sqlCon As New SqlConnection()
        sqlCon.ConnectionString = "Data Source=(local);Initial Catalog=DEV_DB;User ID=*****;Password=**********"
        Dim command As New SqlCommand("SELECT * FROM Gas_Stations WHERE Location_Type = 1 AND [ Physical_Address_Street] = @Physical_Address_Street AND [ Physical_Address_Local] = @Physical_Address_Local AND [Physical_Address_State] = @Physical_Address_State AND [ Physical_Address_Zip] = @Physical_Address_Zip AND [ Phone_Number] = @Phone_Number")
        command.Parameters.Add("@Physical_Address_Street", SqlDbType.VarChar, 50, "Physical_Address_Street")
        command.Parameters.Add("@Physical_Address_Local", SqlDbType.VarChar, 50, "Physical_Address_Local")
        command.Parameters.Add("@Physical_Address_State", SqlDbType.VarChar, 50, "Physical_Address_State")
        command.Parameters.Add("@Physical_Address_Zip", SqlDbType.VarChar, 50, "Physical_Address_Zip")
        command.Parameters.Add("@Phone_Number", SqlDbType.VarChar, 50, "Phone_Number")

        command.Connection = sqlCon
        sqlCon.Open()

        Using reader = command.ExecuteReader()
            While reader.Read()
                Dim addr = New FuelStop()
                addr.Physical_Address_Street = reader.GetString(0)
                addr.Physical_Address_Local = reader.GetString(1)
                addr.Physical_Address_State = reader.GetString(2)
                addr.Physical_Address_Zip = reader.GetString(3)
                addr.Phone_Number = reader.GetString(4)

                resultList.Add(addr)
            End While
        End Using
    End Using
    Return resultList.Skip(skip).Take(take).ToArray()
End Function

我希望直接从数据库中提取查询中列出的列的值。我需要在Android应用程序中显示所有地址信息。这将是一个只读的情况。

2 个答案:

答案 0 :(得分:2)

数据库中的列名可能不以空格开头,所以......

Dim command As New SqlCommand("SELECT * FROM Gas_Stations WHERE Location_Type = 1 AND [Physical_Address_Street] = @Physical_Address_Street AND [Physical_Address_Local] = @Physical_Address_Local AND [Physical_Address_State] = @Physical_Address_State AND [Physical_Address_Zip] = @Physical_Address_Zip AND [Phone_Number] = @Phone_Number")

但是你可以通过利用VB.NET XML文字来更容易阅读:

Dim sql = <sql>
        SELECT
            [Physical_Address_Street]
            , [Physical_Address_Local]
            , [Physical_Address_State]
            , [Physical_Address_Zip]
            , [Phone_Number]
        FROM Gas_Stations
        WHERE Location_Type = 1
            AND [Physical_Address_Street] = @Physical_Address_Street
            AND [Physical_Address_Local] = @Physical_Address_Local
            AND [Physical_Address_State] = @Physical_Address_State
            AND [Physical_Address_Zip] = @Physical_Address_Zip
            AND [Phone_Number] = @Phone_Number
        </sql>

Dim command As New SqlCommand()
command.CommandText = CStr(sql)

请注意,我明确指出要选择的列。这是为了确保您想要的列是您获得的列以及您想要的列。

对于预期的参数错误消息,您尚未为任何参数指定值。你可以这样做:

command.Parameters.Add("@Physical_Address_Street", SqlDbType.VarChar, 50).Value = physAddrStreet

或者像这样:

command.Parameters.Add("@Physical_Address_Street", SqlDbType.VarChar, 50)
command.Parameters("@Physical_Address_Street").Value = physAddrStreet

编辑:因为您不需要所有这些参数,

Dim sql = <sql>
        SELECT
            [Physical_Address_Street]
            , [Physical_Address_Local]
            , [Physical_Address_State]
            , [Physical_Address_Zip]
            , [Phone_Number]
        FROM Gas_Stations
        WHERE Location_Type = 1
        </sql>

并且不要执行所有command.Parameters.Add(...)

答案 1 :(得分:1)

查看上面的查询,您似乎希望为固定位置类型显示一组动态属性(有时是Street,有时是Zip代码等)。

SQL Server中的参数化查询旨在处理输入参数,而不是您希望在结果中看到的列。

如果您真的希望在结果中设置动态列,请查看this question如何执行此操作。

相反,如果您正在寻找用户输入查询的地址,zip等,那么您的查询会略微向后。它应该是这样的:

Dim command As New SqlCommand
   ("SELECT * FROM Gas_Stations 
      WHERE Location_Type = 1
            AND
            Physical_Address_Street = @Physical_Address_Street 
            AND 
            Physical_Address_Local = @Physical_Address_Local 
            AND 
            Physical_Address_State = @Physical_Address_State
            AND
            Physical_Address_Zip = @Physical_Address_Zip
            AND 
            Phone_Number = @Phone_Number
    )

注意:您需要清理VB.Net上面的格式,我这样做是为了提高可读性。如果您想让这些字段可选择搜索

,那么还有other questions