选择字符串数组中不存在的列值

时间:2016-04-06 20:04:01

标签: c# asp.net arrays sql-server string

我正在 Asp.net c#中编写代码,以从 SQL Server 数据库中选择一些值。 我想获取表中不包含字符串数组项的所有值。

详细地说,我有一个名为Notifications的表,其中包含2列,'Text'和'Date'。我也有一个字符串数组。

我想获得字符串数组中不存在的所有文本和日期

感谢大家

2 个答案:

答案 0 :(得分:0)

首先,您需要将字符串数组转换为可以传递到查询中的逗号分隔列表。然后让您的查询过滤我的任何记录,其中Text列的值在该列表中:

public string GetNotifications(string[] texts)
{
    // Create a single string with all values from the texts array.
    // Ex: 'value1','value2','value3'
    // There are many ways to do this; here's one way using string.Join and LINQ:
    var textsAsSingleString = string.Join(",", texts
        .Select(x => "'" + x.Replace("'", "''") + "'")
        .ToArray());

    // Create your query with a WHERE clause that checks against your list
    var query = "SELECT Text, Date " + 
                "FROM Notifications " + 
                "WHERE Text NOT IN (" + textsAsSingleString + ")";

    // Execute the query
    SqlCommand cmd = new SqlCommand(query, con);
    ...
}

现在,这应该适用于texts数组中的一些值,但如果该数组变得非常大(多大程度取决于许多环境因素),性能可能会开始降低。但是,除非你告诉我,否则我会认为这个清单不是很长。

编辑:如果texts中的任何字符串包含单引号,则会失败。您需要使用两个单引号替换任何单个单引号。我已经更新了上面的示例,通过在Replace("'", "''")中的每个字符串上调用texts,然后将其添加到逗号分隔的列表/字符串中来执行此操作。

答案 1 :(得分:0)

我不确定您连接到数据库的方式,但您可以随时使用:

如果使用Linq:

string sParms = String.Join(",", saParams.Select(str => "'" + str + "'").ToArray());

然后您可以在where子句中使用sParms

如果不使用Linq:

            string[] saParams = new string[3] { "String1", "String2", "String3" };
            StringBuilder sbParams = new StringBuilder();
            foreach(string sStr in saParams)
            {
                if (sbParams.Length > 0)
                    sbParams.Append(",");
                sbParams.Append("'" + sStr + "'");
            }

然后您可以在where子句中使用sbParams.ToString()