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%'
*/
我正在开发一个基于 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%'
*/