使用多个过滤器搜索 SQL 个数据库
Search SQL database with multiple filters
我有以下代码:
List<string> L1 = new List<string>();
int Id = 1;
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "...";
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM categories WHERE category_id = @Id";
cmd.Parameters.Add(new SqlParameter("@Id", Id));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
category = reader.GetString(1);
L1.Add(category);
}
}
这给出了“category_id”等于 1 的行。
我现在想要 SELECT 语句到 return 行,其中“category_id”等于我给它的值之一。
所以一个简单的 SELECT 语句看起来像这样
SELECT * FROM categories WHERE category_id = 1 or category_id = 2
//returns all rows where "category_id" is equal to 1 or 2
问题是在设置 SELECT 语句时我不知道要搜索的值。
我会将值放在字符串、列表或类似的东西中。
我尝试使用 foreach 循环来更改“Id”的值
cmd.Parameters.Add(new SqlParameter("@Id", typeof(int)));
foreach (int val in Values)
{
cmd.Parameters["@Id"].Value = val;
}
但这只是 return 行,其中“category_id”等于数组“Values”中的最后一个值。
我尝试使用 IN 运算符,但出现错误
cmd.CommandText = "SELECT * FROM categories WHERE category_id IN (@Id)";
cmd.Parameters.Add(new SqlParameter("@Id", Values));
我的最后一个想法是使用循环从值中创建一个字符串。
string ValueString = "0";
foreach (int val in Values)
{
ValueString += ",";
ValueString += Convert.ToString(val);
}
我还没有尝试过,但我预计它会给出一个错误,因为列“category_id”的数据类型为“int”。
是否有任何方法可以使用 array/list 作为参数搜索 SQL 数据库,因此它会给出等于 array/list 中的值之一的每一行。
您可以为您的命令使用“IN”关键字:
SELECT * FROM categories WHERE category_id IN (1,2)
您的 CommandText 需要如下所示:
cmd.CommandText = "SELECT * FROM categories WHERE IN (@Id)";
您可以像这样设置参数@ID:
cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));
在运行它之前,您只需将“1”和“2”添加到您的 L1-List 即可。
cmd.CommandText = "SELECT * 来自类别(@Id)";
cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));
我发现最好的方法是用 array/list.
中的值创建一个连接字符串
string L1Joined = string.Join(",", L1);
//(L1: name of the array/list)
然后使用“IN”关键字并使 CommandText 成为格式化字符串。
所以 CommandText 看起来像这样:
cmd.CommandText = $"SELECT * FROM categories WHERE category_id IN ({L1Joined})";
不确定这是否是最有效的方法,但它适用于我的特定问题。
我有以下代码:
List<string> L1 = new List<string>();
int Id = 1;
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = "...";
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM categories WHERE category_id = @Id";
cmd.Parameters.Add(new SqlParameter("@Id", Id));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
category = reader.GetString(1);
L1.Add(category);
}
}
这给出了“category_id”等于 1 的行。
我现在想要 SELECT 语句到 return 行,其中“category_id”等于我给它的值之一。
所以一个简单的 SELECT 语句看起来像这样
SELECT * FROM categories WHERE category_id = 1 or category_id = 2
//returns all rows where "category_id" is equal to 1 or 2
问题是在设置 SELECT 语句时我不知道要搜索的值。 我会将值放在字符串、列表或类似的东西中。
我尝试使用 foreach 循环来更改“Id”的值
cmd.Parameters.Add(new SqlParameter("@Id", typeof(int)));
foreach (int val in Values)
{
cmd.Parameters["@Id"].Value = val;
}
但这只是 return 行,其中“category_id”等于数组“Values”中的最后一个值。
我尝试使用 IN 运算符,但出现错误
cmd.CommandText = "SELECT * FROM categories WHERE category_id IN (@Id)";
cmd.Parameters.Add(new SqlParameter("@Id", Values));
我的最后一个想法是使用循环从值中创建一个字符串。
string ValueString = "0";
foreach (int val in Values)
{
ValueString += ",";
ValueString += Convert.ToString(val);
}
我还没有尝试过,但我预计它会给出一个错误,因为列“category_id”的数据类型为“int”。
是否有任何方法可以使用 array/list 作为参数搜索 SQL 数据库,因此它会给出等于 array/list 中的值之一的每一行。
您可以为您的命令使用“IN”关键字:
SELECT * FROM categories WHERE category_id IN (1,2)
您的 CommandText 需要如下所示:
cmd.CommandText = "SELECT * FROM categories WHERE IN (@Id)";
您可以像这样设置参数@ID:
cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));
在运行它之前,您只需将“1”和“2”添加到您的 L1-List 即可。
cmd.CommandText = "SELECT * 来自类别(@Id)";
cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));
我发现最好的方法是用 array/list.
中的值创建一个连接字符串string L1Joined = string.Join(",", L1);
//(L1: name of the array/list)
然后使用“IN”关键字并使 CommandText 成为格式化字符串。
所以 CommandText 看起来像这样:
cmd.CommandText = $"SELECT * FROM categories WHERE category_id IN ({L1Joined})";
不确定这是否是最有效的方法,但它适用于我的特定问题。