【问题标题】:ASP.net simple delete query, pass in string valueASP.net 简单删除查询,传入字符串值
【发布时间】:2011-07-12 16:11:43
【问题描述】:
DELETE FROM tblArtworkApprovalUsers
WHERE     (userID NOT IN (@UserIDList)) AND (approvalID =
                          (SELECT     ID
                            FROM          tblArtworkApprovals
                            WHERE      (templateID = @TemplateID)))

这是在我的表适配器中。 @UserIDList 需要接受如下内容:

2,44,12,70

我怎样才能让这个查询接受那个字符串?

【问题讨论】:

    标签: asp.net sql data-access-layer tableadapter


    【解决方案1】:

    NOT IN <expr> 需要表达式而不是字符串。因此,如果您传递参数而不是动态构造 SQL,则无法做到这一点。

    另一种方法是动态创建 SQL(同时注意 SQL 注入):

    string commad = @"DELETE FROM tblArtworkApprovalUsers " +
                 "WHERE (userID NOT IN ({0})) AND (approvalID ="+
                              "(SELECT     ID " +
                                "FROM          tblArtworkApprovals " +
                                "WHERE      (templateID = {1})))";
    
    command = string.Format(command, userIDList, templateID);
    

    更新

    Craig 在这里指出了一个更好的解决方案,它并没有提供更好的性能(因为参数是可变的,并且查询计划不会被缓存,除非它完全相同)但有助于 SQL 注入攻击Parameterize an SQL IN clause

    【讨论】:

    【解决方案2】:

    你有几个选择...

    1. 动态创建整个 SQL 字符串并执行(如 Aliostad 建议的那样)。
    2. 编写一个接受字符串的存储过程,将其解析为临时表,然后针对该临时表运行查询。快速搜索将提供许多方法来做到这一点(here 就是其中之一)。

    【讨论】:

      【解决方案3】:

      您可能需要查看Arrays in SQL2005Arrays in SQL2008,具体取决于您的 SQL 服务器的版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多