C# C、 访问、查询T/F条件并检索其他列字符串
晚上, 我试图循环浏览一个包含品牌名称列表的列表。在每次迭代中,它调用查询。查询试图检查以品牌名称命名的给定列是否为true。在这种情况下,添加第一列的模型字符串值 我能得到的最接近的结果是,它将正确地迭代所有品牌,但将所有型号添加到每个品牌。这是有道理的,因为从技术上讲,所有车型都有一个“真实”的品牌,但我不知道有一个干净、简单的方法来过滤它 我已经做了一个测试方法,在这个方法中,我没有迭代品牌列表中的参数值,而是将其硬编码到查询中,查询按预期工作,从而让我弄不明白为什么它不工作。参数值随每次迭代而正确更改C# C、 访问、查询T/F条件并检索其他列字符串,c#,ms-access,C#,Ms Access,晚上, 我试图循环浏览一个包含品牌名称列表的列表。在每次迭代中,它调用查询。查询试图检查以品牌名称命名的给定列是否为true。在这种情况下,添加第一列的模型字符串值 我能得到的最接近的结果是,它将正确地迭代所有品牌,但将所有型号添加到每个品牌。这是有道理的,因为从技术上讲,所有车型都有一个“真实”的品牌,但我不知道有一个干净、简单的方法来过滤它 我已经做了一个测试方法,在这个方法中,我没有迭代品牌列表中的参数值,而是将其硬编码到查询中,查询按预期工作,从而让我弄不明白为什么它不工作。参数值随每次
private static void SetAPDictionary()
{
if (AP_BRAND_DICTIONARY == null)
{
AP_BRAND_DICTIONARY = new Dictionary<string, List<string>>();
// For each Brand added into the Brand Catalog, iterate through and query for each brand and allocate accordingly into the Dictionary.
foreach (string brand in Root_Toolbox.BrandCatalog)
{
Console.WriteLine("NOW QUERYING FOR "+ brand);
//DemoCode(brand);
APQueryCaller(brand);
}
}
}
// TEST CODE; WORKS AS DESIRED.
private static void DemoCode(string brand)
{
using (OleDbCommand cmd = new OleDbCommand(@"SELECT [Model] FROM [Copy of AP_Brand] WHERE @p1 = -1", Connection_Controller.MasterDbConnection(true)))
{
cmd.Parameters.AddWithValue("@p1", brand);
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("DEMO ADDING " + reader.GetString(0) + " TO " + brand);
}
}
Connection_Controller.MasterDbConnection(false);
}
// END TEST
// TODO: FIX ME...
public static void APQueryCaller(string brand)
{
using (OleDbCommand cmd = new OleDbCommand(@"SELECT [Model] FROM [AP_Brand] WHERE @p1 = YES", Connection_Controller.MasterDbConnection(true)))
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@p1", brand);
// DEBUG
Console.WriteLine(cmd.CommandText);
foreach (OleDbParameter i in cmd.Parameters)
{
Console.WriteLine("@p1 IS NOW: " + i.Value);
}
// END DEBUG
OleDbDataReader reader = cmd.ExecuteReader();
if (!AP_BRAND_DICTIONARY.ContainsKey(brand))
{
Console.WriteLine("ADDING " + brand);
AP_BRAND_DICTIONARY.Add(brand, new List<string>());
}
while (reader.Read())
{
// If the column with the brand name is checked (true) add to the dictionary.
}
}
Connection_Controller.MasterDbConnection(false);
}
至于数据库布局。MDU应该是唯一一个在其列表中获得型号的品牌
就像伊戈尔在评论中指出的。。。您没有在where子句中使用列名。我不能评论声誉还不够好 在我看来,品牌是一个字符串值?例如:MDU 以下是您现在拥有的:
SELECT [Model] FROM [AP_Brand] WHERE @p1 = YES
--Are you expecting this to turn into
SELECT [Model] FROM [AP_Brand] WHERE MDU = YES
我的建议是:
@"SELECT [Model] FROM [AP_Brand] WHERE " + brand + " = @p1";
cmd.Parameters.AddWithValue("@p1", -1);
这现在输出:
SELECT [Model] FROM [AP_Brand] WHERE MDU = -1
注意:连接上面的字符串对于SQL注入是开放的,请确保在构建SQL语句之前删除brand变量。您的意思是@p1='YES'?使用单引号时,您通常会过滤列,而不是传入的参数值,类似于[table]。[column]=@p1没有意识到这个问题是从2018年开始的。。。要想办法建立那些声望点!:祝你好运,皮特……对文化要有耐心……这是一条学习曲线。@ChrisCatignani:如果有人发现它有用,那么时间和努力可能不会白费。我真的是指建立声誉点……但对于迟到的回答……回答永远不会太晚。所以它就像一个大的参考指南。很多时候,我会研究这个问题,然后回来再给出另一个答案。