0

我有一个 DataTable,其中可能有一列中的值看起来像x:1 x:2 a:1 a:2etc...但它们也可能看起来像x*or a*

在我的代码中,我得到了一个完整的值来搜索(例如x:1),但行本身可以包含x*该列中的值。我可以以某种方式使用 Select 方法来搜索行吗?

现在它看起来像这样:

strSelect = string.Format("[{0}]='{1}'", colName, ValueToSearch);
rows = tempTable.Select(strSelect);

但当然,我会得到的唯一行是那些看起来与表格中的一模一样的行。这意味着在搜索时x:1,我不会得到与x*

4

2 回答 2

1

代码strSelect = string.Format("[{0}]='{1}'", colName, ValueToSearch);将选择相同的值。如果要搜索子集,则必须使用 LIKE 运算符:

strSelect = string.Format("[{0}] LIKE '{1}'", colName, ValueToSearch.Replace("*", "%");
于 2012-08-01T11:18:46.260 回答
0

我暂时假设您的数据库包含 4 行,在您要查询的给定列中具有以下值:

  • x:1
  • x:2
  • X*
  • 一个:1
  • a2
  • 一个*

您声明您正在获得一个值,例如您需要在查询中使用的 'x:1',但您暗示查询最终应该返回前三个记录 - 值为 'x: 1'、'x:2' 和'x*'。换句话说,虽然你得到的是'x:1',但你实际上想要搜索任何值以'x'开头的记录。

如果是这种情况,您最好在发出查询之前修改 C# 代码中的值。如果您的搜索值确实是“x:1”形式,您可以在将其交给 SQL 查询之前将最后两个字符截掉:

string searchValue = "x:1"; // this presumably actually comes from user input
searchValue = searchValue.Substring(0, searchValue.Length - 2);
// Now searchValue is just "x", so go ahead and create your SQL query using the 'LIKE' operator

我觉得这只是对您的实际数据的简化,这使得它很难精确并且也使得提供包含错误检查的示例变得更加困难。

对于一个稍微复杂一点的例子,也许用户给你的搜索值可以是一串字母,或者是一串字母,后跟冒号,后跟更多字母。在这种情况下,您需要检查给定的字符串是否包含冒号,如果包含冒号,则需要将冒号及其后面的任何内容剪掉:

string searchValue = "abc:def";
if (searchValue.Contains(":"))
    searchValue = searchValue.Substring(0, searchValue.IndexOf(":"));
// Having stripped off ":def", you're left with "abc"

现在您可以继续使用 LIKE 运算符发出查询,正如 TcKs 在他的回答中已经显示的那样。例如,您可以修改已有的查询代码,如下所示:

strSelect = string.Format("[{0}] LIKE '{1}'", colName, ValueToSearch);
rows = tempTable.Select(strSelect);

通过使用 LIKE 运算符,您现在正在查找任何具有以“abc”开头的值的记录。

于 2012-08-02T15:50:21.280 回答