【问题标题】:SQL DataSource using WHERE IN clause使用 WHERE IN 子句的 SQL 数据源
【发布时间】:2013-03-08 14:19:12
【问题描述】:

在 DB2 UDB 9.7.5 中使用 Studio 2010 C#

我有一个从带有 WHERE IN 子句的 DataSource 填充的网格视图,如下所示:

<asp:SqlDataSource ID="LUWAccts" runat="server" onSelecting="gvGrid01_Selecting"
ConnectionString="<%$ ConnectionStrings:LUWHAConnect %>" 
ProviderName="<%$ ConnectionStrings:LUWHAConnect.ProviderName %>" 

SelectCommand="SELECT mycolumns FROM mytables WHERE GROUP_NAME IN ? ">
<SelectParameters>
  <asp:Parameter Name="grpList" Type="String" /> 
</SelectParameters>

硬编码 WHERE 子句可以正常工作 (即 WHERE GROUP_NAME IN ('GROUP1','GROUP2','GROUP3')

但我正在尝试在后面的代码中使用我的数据源的 onSelecting 事件来构建组列表,如下所示:

protected void gvGrid01_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
  string gpList = Get_SVCACCT_Auth_Groups(Session["ThisUser"].ToString());
              //This routine returns the string "('GROUP1','GROUP2','GROUP3')"
}

当我显示 grpList 字符串时,我确实有 ('GROUP1','GROUP2','GROUP3')。

但我没有显示任何数据。我已经搜索并尝试了各种技术来更改 SELECT 语句、使用 e.Command.Parameters.Add 修改参数列表、使用 ControlParemers 等。

我还阅读了一篇关于 WHERE IN 子句如何无法处理逗号分隔列表参数的文章,但 IN 关键字可以查询表。

我的 gpList 不是从另一个 SELECT 语句构建的 - 但我仍然尝试了一些这样的示例,但没有运气。作为一个新手 - 我似乎在围绕解决方案跳舞。

如果我错过了有助于回答此问题的帖子,请告诉我。任何帮助将不胜感激。

【问题讨论】:

  • 您尝试过在 C#/SQL Server 中运行 Select 查询吗?如果是这样,您是将值作为双引号值还是单引号值传递..?您可以将其作为字符串 {0} 参数传递,如“SELECT mycolumns FROM mytables WHERE GROUP_NAME IN {0}”在后面的代码中传递参数使用 stringFormat() 也许
  • 将 where 子句更改为 WHERE GROUP_NAME IN {0} 会给我一个 Invalid SQL Syntax 错误。我的 需要改变什么?
  • 选择参数它们当前设置在什么位置..?
  • 在 onSelecting 事件中,字符串 grpList 是 "'GROUP1','GROUP2','GROUP3'"(逗号分隔的组带单引号的名称)。我使用 e.Command.Parameters["@grpList"].Value = mygrouplist; 将值传递回我的数据源
  • 那么这应该可以工作,因为你已经有了值

标签: c# .net visual-studio-2010 sqldatasource where-in


【解决方案1】:

我还建议您执行用户 VisDev 之类的操作 String.Format("SELECT mycolumns FROM mytables WHERE GROUP_NAME IN ({0})", yourparamlist)

你的参数列表在哪里

“值1,值2,值3” 它只是一个提示,因此您可以根据您的要求实施它。

希望它能解决你的问题。

【讨论】:

    【解决方案2】:

    最后我决定使用 Like 并将它们与 OR 连接起来。所以我会迭代项目列表并添加类似过滤器并将它们附加到或类似这样的东西:

    string[] allStr = recieveFilter.Split(',');
    string filterRecieverItem = "";
    foreach (string recieveItem in allStr)
    {
       filterRecieverItem += "(sampleField like '%" + recieveItem.Trim() + "%') OR ";
    }
    filterRecieverItem = filterRecieverItem.Remove(filterRecieverItem.Length - 3, 3);
    ds_Sample.FilterExpression = filterStr;
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      你可以在你的 gvGrid01_Selecting 事件中试试这个

      LUWAccts.SelectCommand = 
      String.Format("SELECT mycolumns FROM mytables WHERE GROUP_NAME IN {0})",
      Get_SVCACCT_Auth_Groups(Session["ThisUser"].ToString()));
      

      Check this link

      【讨论】:

      • 格式化选择命令效果很好 - 显示 LUWAccts.SelectCommand.ToString() 给了我SELECT mycolumns FROM mytables WHERE GROUP_NAME IN ('GROUP1','GROUP2') 但仍然没有结果。我假设从这些示例中没有 在这里起作用 - 对吗?还是我也应该在这里传回 Command.Parameters?
      • 在同一事件中,添加'gvGrid01.DataBind();'。每当您更改数据源时 - (在您的情况下是选择命令),您必须重新绑定网格视图。
      • 将数据绑定放在 Selecting 事件中会给我一个无限循环
      • 但是 - 我将上面讨论的所有逻辑都移到了 gvGrid01.Databind() 并停止使用 SqlDataSource OnSelecting 事件。这一切都奏效了。这听起来像是一个公平的解决方案还是会带来任何问题?
      猜你喜欢
      • 2015-06-26
      • 2011-12-23
      • 2013-10-16
      • 1970-01-01
      • 2011-03-28
      • 2023-03-06
      • 1970-01-01
      • 2019-06-28
      • 2011-03-05
      相关资源
      最近更新 更多