我开发了一个搜索页面,其中包含用于输入数字的文本框控件和用于在Gridview中显示相应结果的按钮。该页面用于存储过程。当我手动输入数字时,sql查询返回通过SQL Server管理器运行时的预期结果,但在我的存储过程中使用时,我得到零结果。
这是按钮事件处理程序背后的代码:
Dim ds As New DataSet()
Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ShipperNotificationConnectionString1").ToString())
Using command As New SqlCommand()
command.CommandType = CommandType.StoredProcedure
command.CommandText = "getPON"
command.Connection = connection
command.Parameters.AddWithValue("@PON", txtPON.Text)
connection.Open()
Dim a As New SqlDataAdapter(command)
a.Fill(ds)
End Using
End Using
gvPON.DataSource = ds
gvPON.DataBind()
...以下是存储过程:
ALTER PROCEDURE [dbo].[getPON]
(
@PON varchar
)
AS
BEGIN
SELECT SupplierCompany.company_name, SupplierCompany.Address1, SupplierCompany.Address2, SupplierCompany.City, SupplierCompany.State,
SupplierCompany.Zip, Shipment_Po.PONumber, Shipment.TotalWeight, Shipment.NoOfPallets, Shipment.PalletIdentical
FROM SupplierCompany INNER JOIN
Shipment ON SupplierCompany.Company_guid = Shipment.Company_Guid INNER JOIN
Shipment_Po ON Shipment.Shipment_Guid = Shipment_Po.Shipment_guid
WHERE Shipment_Po.PONumber = '''+ @PON +'''
END
......有人可以提供一些方向吗?
答案 0 :(得分:1)
问题是存储过程。表达式:
WHERE Shipment_Po.PONumber = '''+ @PON +'''
没有做你的想法。它正在进行以下比较:
WHERE Shipment_Po.PONumber = '+@PON+'
或类似的东西。换句话说,您将动态SQL表达式与常规SQL混合使用。尝试做:
WHERE Shipment_Po.PONumber = @PON
如果您担心演员阵容为正确类型:
WHERE Shipment_Po.PONumber = (case when isnumeric(@PON) = 1 then cast(@PON as int) end)