【问题标题】:Select column values not existing in string array [closed]选择字符串数组中不存在的列值[关闭]
【发布时间】:2016-04-06 20:04:01
【问题描述】:

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

详细来说,我有一个名为 Notifications 的表,其中包含 2 列,“文本”和“日期”。我也有一个字符串数组。

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

谢谢大家

【问题讨论】:

  • 你能提供一些代码吗?
  • 你用什么来连接你的 SQL 服务器? SqlConnection 并传递查询?实体框架?在任何情况下,您都可以在查询中传递值列表(类似于WHERE [Text] NOT IN ('value1', 'value2', 'value3')),或者您可以获取所有行,然后过滤掉代码中具有匹配值的行。哪个“更好”取决于许多因素。
  • 这是方法: public string GetNotifications(string[] texts) { SqlCommand cmd = new SqlCommand("SELECT Text, Date From Notifications WHERE @text != Text", con); ... } } 我需要获取所有值而不仅仅是其中一个

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


【解决方案1】:

您首先需要将字符串数组转换为可以传递到查询中的逗号分隔列表。然后让您的查询过滤我们的任何记录,其中 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 中的任何字符串包含单引号,这将失败。您需要将任何 single 单引号替换为 two 单引号。我已经更新了上面的示例,方法是在 texts 中的每个字符串上调用 Replace("'", "''"),然后将其添加到逗号分隔的列表/字符串中。

【讨论】:

  • tnx 为您提供快速有用的答案
【解决方案2】:

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

如果使用 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()

【讨论】:

  • 谢谢你。你帮了我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2012-02-26
  • 2021-10-27
  • 1970-01-01
  • 2018-03-20
  • 2022-06-16
相关资源
最近更新 更多