C# & SQL Server CE:在搜索中将定义符号(+ 或 and)之后的词视为单独的词

C# & SQL Server CE : treat words after defined symbols (+ or &) as a seperate word in search

我正在开发一个基于 C# 和 SQL Server CE 3.5 的简单翻译应用程序

我有一个搜索文本框,它通过 textBox1.Text 使用正常 SQL 查询 [SELECT.. LIKE '% %']

搜索数据库中的某些列

我想达到的目标: 我想在数据库中的所有位置搜索某些符号(例如 +)之后的所有单词,因此不需要在完整上下文中写入它们(一个接一个的单词作为它们存在于数据库中)

换句话说: 我想在某些符号后拆分单词,以便程序独立搜索每个单词(分别搜索符号前的单词和符号后的每个单词)


示例: 如果我尝试搜索值 "burden of proof" ,我必须在之前的上下文中编写它,但对于用户来说这将不适用。所以我想让他在他愿意搜索的两个词之间放一个符号(即他应该搜索 "burden+proof")

图片1:http://i.imgur.com/sd5Y5B7.jpg , Picture 2 : http://i.imgur.com/gVj41xP.jpg


编辑 - 我的搜索按钮代码:

sqlcmd = new SqlCeCommand
                ("SELECT * FROM T1 WHERE EnglishWord like '%" + textBox1.Text + "%' OR EnglishDesc like '%" + textBox1.Text + "%' OR ArabicWord like '%" + textBox1.Text + "%' OR ArabicDesc like '%" + textBox1.Text + "%' ", sqlcon);

            try
            {
                listView1.Items.Clear();
                sqldr = sqlcmd.ExecuteReader();

                while (sqldr.Read())
                {

                    ListViewItem item = new ListViewItem(sqldr["ID"].ToString());
                    item.SubItems.Add(sqldr["EnglishWord"].ToString());
                    item.SubItems.Add(sqldr["EnglishDesc"].ToString());
                    item.SubItems.Add(sqldr["ArabicDesc"].ToString());
                    item.SubItems.Add(sqldr["ArabicWord"].ToString());
                    item.SubItems.Add(sqldr["Subject"].ToString());

                    listView1.Items.Add(item);
                }
                listView1.Enabled = true;
                label7.Text = listView1.Items.Count.ToString();
            }
            catch (SqlCeException ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Something wrong");
            }

好的。所以你从这里的答案中得到了不同的词。

你有这个 string[] result 你知道长度是否为 1 而不是它根本没有分裂。如果它大于 1,则原始文本用 + 或其他方式拆分。

我不确定你到底想达到什么目的,但你可以做到这一点。

if(result.Length == 1)
{
   //Select * from database where column = result[0]
}
else
{
  foreach(string s in result)
  {
   //Select * from database where column like '%'+s+'%' (better if you do with parameters)
  }
}

回答者:Richard Deeming@CodeProject


假设您要查找每个单词至少出现在四列中的一列中的所有记录,这样的事情应该可行:

sqlcmd = sqlcon.CreateCommand();

string[] words = textBox1.Text.Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries);
StringBuilder query = new StringBuilder("SELECT * FROM T1 WHERE 1 = 1");

for (int index = 0; index < words.Length; index++)
{
    string wordToFind = words[index];
    string parameterName = "@word" + index;
    sqlcmd.Parameters.AddWithValue(parameterName, "%" + wordToFind + "%");
    query.AppendFormat(" AND (EnglishWord Like {0} OR EnglishDesc Like {0} OR ArabicWord Like {0} OR ArabicDesc Like {0})", parameterName);
}

sqlcmd.CommandText = query.ToString();

这还将修复代码中的 SQL 注入[^] 漏洞。

如果用户搜索 burden+proof,结果查询将如下所示:

SELECT
    *
FROM
    T1
WHERE
    1 = 1
And
    (
        EnglishWord Like @word0 
    Or 
        EnglishDesc Like @word0 
    Or 
        ArabicWord Like @word0 
    Or 
        ArabicDesc Like @word0
    )
And
    (
        EnglishWord Like @word1 
    Or 
        EnglishDesc Like @word1 
    Or 
        ArabicWord Like @word1 
    Or 
        ArabicDesc Like @word1
    )

/*
Parameters:
- @word0 = '%burden%'
- @word1 = '%proof%'
*/