我是非常非常新的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应用程序中显示所有地址信息。这将是一个只读的情况。
答案 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