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

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

我有一个搜索文本框,通过textBox1.Text搜索数据库中的某些列,并使用正常的SQL查询[ SELECT.. LIKE '% %' ]


我想要实现的目标: 我想在数据库中的所有位置搜索某些符号(例如+)之后的所有单词,因此它们不需要在完整的上下文中编写 (逐字逐句,因为它们存在于数据库中) )

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


示例:如果我尝试搜索“举证责任”的值,我将在之前的上下文中编写它,但对于用户来说,这将不适用。 所以我希望他在他愿意寻找的两个词之间放一个符号(即他应该搜索“负担+证据”)

图1: http : //i.imgur.com/sd5Y5B7.jpg ,图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"); } 

好。 所以你在这里得到了不同的答案。 将textbox.text拆分为其他文本框

你有这个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 Injection [^]漏洞。

如果用户搜索负担+证据,则生成的查询将如下所示:

 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%' */