我希望在C#中的访问数据库中搜索多个列。 数据按行构建,每列保存相关数据或" *"作为通配符。
粗略的例子:
如果我有数据(表示新单元格) 福特,嘉年华,*,1998 如果我有价值......
Ford,Fiesta,Petrol,1998
它会找到并显示数据行。
目前我正在尝试:
string sql = "SELECT * FROM [mydatabase]
WHERE Manufacturer ='" + textBox1.Text +
"' OR Manufacturer='*' AND Model ='" + textBox2.Text +
"' OR Model='*' AND Fuel ='" + textBox3.Text +
"' OR Fuel='*' AND Year='" + textBox4.Text + "' OR Year='*'";
但这会提升所有价值而不是过滤掉它们。有没有办法在查询中使用if和else而不是OR?
答案 0 :(得分:1)
您可以使用Manufacturer ='" + textBox1.Text + "' OR Manufacturer='*'
,而不是coalesce
,而不是if/else
:
string sql = "... Manufacturer = coalesce('" + textBox1.Text + "', '*') ...";
这样,您只需要and
个,而不是or
。这可能现在给出了问题,因为or
导致and
无法被评估。
您还可以在and
周围添加括号,因此or
仅应用于括号内:
string sql = "... where (Manufacturer ='" + textBox1.Text + "' OR Manufacturer='*') and ...";
注意你应该使用parameterized queries ,所以你会得到这样的结果:
command.CommandText = "select * from ... where Manufacturer = coalesce(@mgr, '*') and ...";
command.Parameters.Add(new SqlParameter("mgr", textBox1.Text));
答案 1 :(得分:1)
如果您想使用外卡,我会将其从where子句中排除。
或者,如果要将所有列搜索为一个字符串,可以将它们全部添加到选择列表中的新列。
例如:
public void GetCars(string manufacturer, string model, string fuel, DateTime? year, string searchString)
{
string query = @"
SELECT *,
ISNULL([Manufacturer],'') + ' ' + ISNULL([Model],'') + ' ' ISNULL([Fuel],'') + ' ' ISNULL('Year', '') AS [SearchString]
FROM [MyDatabase]
WHERE [Manufacturer]=@Manufacturer ";
if (!String.IsNullOrEmpty(model))
query += @"AND [Model]=@Model ";
if (!String.IsNullOrEmpty(fuel))
query += "AND [Fuel]=@Fuel ";
if (year.HasValue)
query += "AND [Year]=@Year ";
if (!String.IsNullOrEmpty(searchString))
query += @"AND [SearchString] Like '%@SearchString%' ";
using (SqlCommand sqlCommand = new SqlCommand(query))
{
sqlCommand.Parameters.AddWithValue("@Manufacturer", manufacturer);
if (!String.IsNullOrEmpty(model))
sqlCommand.Parameters.AddWithValue("@Model", model);
if (!String.IsNullOrEmpty(fuel))
sqlCommand.Parameters.AddWithValue("@Fuel", fuel);
if (year.HasValue)
sqlCommand.Parameters.AddWithValue("@Year", year.Value);
if (!String.IsNullOrEmpty(searchString))
sqlCommand.Parameters.AddWithValue("@SearchString", searchString);
//Execute to data table etc
}
}