【发布时间】:2016-07-28 13:31:18
【问题描述】:
我有以下代码:
Dim SQLCon As New SqlConnection
Dim cmd As New SqlCommand
Dim ds As New DataSet
SQLCon.ConnectionString = ConfigurationSettings.AppSettings("myConnString")
SQLCon.Open()
cmd.CommandType = CommandType.StoredProcedure
'run the stored procedure based on the view selected
If rdolstView.Items(0).Selected Then
cmd = New SqlCommand("spCondensedView", SQLCon)
ElseIf rdolstView.Items(1).Selected Then
cmd = New SqlCommand("spExtendedView", SQLCon)
End If
'filter by what the user searched for
If ddlSearchBy.SelectedValue = "Member" Then
cmd.Parameters.AddWithValue("@MbrNum", txtSearchFor.Text)
ElseIf ddlSearchBy.SelectedValue = "Assistant" Then
cmd.Parameters.AddWithValue("@AssignedAsst", ddlUWAssistants.SelectedValue)
ElseIf ddlSearchBy.SelectedValue = "Rep" Then
cmd.Parameters.AddWithValue("@Rep", txtSearchFor.Text)
ElseIf ddlSearchBy.SelectedValue = "Dept Assistant" Then
cmd.Parameters.AddWithValue("@DeptAsst", txtSearchFor.Text)
ElseIf ddlSearchBy.SelectedValue = "Creator" Then
cmd.Parameters.AddWithValue("@Creator", txtSearchFor.Text)
End If
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds)
SQLCon.Close()
我的问题是参数似乎不起作用。两个存储过程都应该采用可选参数(@MbrNum、@AssignedAsst、@Rep、@DeptAsst 或 @Creator)并在其WHERE 子句中对其进行过滤。
当我在 SQL Server Management Studio 中手动运行存储过程时,我已经确认这可以正常工作。我还确认 If/ElseIf 语句正确验证为 true。所以我的代码肯定会在应该的时候达到AddWithValue() 语句。
然而,我返回的结果是未应用过滤器的完整数据集,就好像我在未指定参数的情况下运行存储过程一样。
任何帮助都会很棒。谢谢!
【问题讨论】:
-
尝试指定
Command.Type...例如:cmd.CommandType = CommandType.StoredProcedure... 默认情况下它设置为Text我相信...还将您的连接和命令包装在Using语句中所以它们在完成后会得到妥善处理......你在存储过程中的参数是否默认? -
你为什么要使用这样的替换?我怀疑这是问题所在。当您使用参数时,您不需要用双引号替换单引号。这具有最近未使用参数但现在使用的代码的外观。删除替换。使用 sql profiler 查看实际传递的内容。还要按照 zaggler 的建议更改命令类型。
-
你应该使用断点而不是抛出异常。但是,我认为这是因为您将 ' 替换为 ''。使用参数时不需要这样做。我假设您之前进行了连接,并决定稍后使用参数正确地进行连接。
-
你们对我所做的事情是正确的。我手动构建查询,然后它变得有点不守规矩,它被移到存储过程中。我只是忘了删除
Replace()。我已经纠正了这些问题,但它并没有解决我的问题。 -
我已经更新了上面的代码以反映更改。
标签: sql sql-server vb.net stored-procedures