Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C、 访问、查询T/F条件并检索其他列字符串_C#_Ms Access - Fatal编程技术网

C# C、 访问、查询T/F条件并检索其他列字符串

C# C、 访问、查询T/F条件并检索其他列字符串,c#,ms-access,C#,Ms Access,晚上, 我试图循环浏览一个包含品牌名称列表的列表。在每次迭代中,它调用查询。查询试图检查以品牌名称命名的给定列是否为true。在这种情况下,添加第一列的模型字符串值 我能得到的最接近的结果是,它将正确地迭代所有品牌,但将所有型号添加到每个品牌。这是有道理的,因为从技术上讲,所有车型都有一个“真实”的品牌,但我不知道有一个干净、简单的方法来过滤它 我已经做了一个测试方法,在这个方法中,我没有迭代品牌列表中的参数值,而是将其硬编码到查询中,查询按预期工作,从而让我弄不明白为什么它不工作。参数值随每次

晚上,

我试图循环浏览一个包含品牌名称列表的列表。在每次迭代中,它调用查询。查询试图检查以品牌名称命名的给定列是否为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:如果有人发现它有用,那么时间和努力可能不会白费。我真的是指建立声誉点……但对于迟到的回答……回答永远不会太晚。所以它就像一个大的参考指南。很多时候,我会研究这个问题,然后回来再给出另一个答案。