查询Access数据库

Posted

技术标签:

【中文标题】查询Access数据库【英文标题】:Querying an Access Database 【发布时间】:2013-07-22 15:49:20 【问题描述】:

我正在尝试从 Access 数据库的两个不同表中获取匹配值。我想知道是否有可能从单元格以“SN”开头的列中获取值,并保留所有其余数据。这是我目前所拥有的。

        String filePath = textBox1.Text;

        con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath);
        con3 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath);



        if ((string)comboBox1.SelectedItem == "CGA0112")
        
            try
            
                string end = "ENDDATE";
                string qual = "CGA0112";
                string start = "START";

                ad.SelectCommand = new OleDbCommand("SELECT* FROM [AC_ECONOMIC] Where KEYWORD = '" + end + "'AND QUALIFIER = '" + qual + "' AND EXPRESSION = '", con); // ISSUE AFTER EXPRESSION= 


                ds.Clear();
                ad.Fill(ds);

                con.Open();
                ad.SelectCommand.ExecuteNonQuery();
                con.Close();

                ad3.SelectCommand = new OleDbCommand("SELECT* FROM [AC_ECONOMIC] Where KEYWORD = '" + start + "'AND QUALIFIER = '" + qual + "'", con3);
                ds3.Clear();
                ad3.Fill(ds3);

                ds.Merge(ds3); //merges the two datasets together


                win1.frm1 = this;
                win1.Show();

                con3.Open();
                ad3.SelectCommand.ExecuteNonQuery();
                con3.Close();

            

我想我只是想在 EXPRESSION 区域之后添加一些代码,但我不太确定从哪里开始。我只是想让它读起来像 AND EXPRESSION = startswith("SN")。任何帮助将不胜感激。

【问题讨论】:

不是我想提出一种全新的思维方式,而是你听说过EntityFramework吗? @gunr2171 其实我没有 AND EXPRESSION LIKE 'SN%'(可能是* 而不是% - 不记得了)(你也可以重复使用单个连接...) 并不是说这真的能很快解决你的问题,但我建议你看看它。它在大约 1 行中解决了您的问题,并消除了 SQL 注入(您的代码很容易出现这种情况)。 你想使用子字符串我想只搜索前 2 个字母 【参考方案1】:

您应该使用like,如下所示:

"SELECT * FROM [AC_ECONOMIC] Where KEYWORD = '" + end + 
"' AND QUALIFIER = '" + qual + "' AND EXPRESSION LIKE 'SN*'"

但是,正如 cmets 中有人提到的那样,我认为您绝对应该研究一个框架,也许像 Dapper 这样的框架,非常棒。还有一些库扩展了 Dapper 以使其更容易上手,例如 this one。

编辑:参见 cmets - 'SN%' 应与 OleDb 一起使用,而不是 'SN*'

【讨论】:

我知道这段代码有效,但它是SQL Injection 的一个很好的例子。如果end 等于'; drop table AC_ECONOMIC -- 会发生什么? 如果 endqual 来自用户输入,我同意你的观点,但在这种情况下,它们是由查询上方的 user2607468 定义的。也就是说,有更好的方法来构造查询,例如通过SelectCommand.Parameters.Add() 添加参数。 少数人一直试图将“SN*”编辑为“SN%”。但是,* 是 MsAccess 的通配符,而不是 %。 对于 OleDb,通配符必须是 %,而不是 *。 MS Access 的这个问题已在 SO 上多次讨论过。这里有 2 个例子:***.com/questions/3193350/… 和 ***.com/questions/5166907/…

以上是关于查询Access数据库的主要内容,如果未能解决你的问题,请参考以下文章