查询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 --
会发生什么?
如果 end
和 qual
来自用户输入,我同意你的观点,但在这种情况下,它们是由查询上方的 user2607468 定义的。也就是说,有更好的方法来构造查询,例如通过SelectCommand.Parameters.Add()
添加参数。
少数人一直试图将“SN*”编辑为“SN%”。但是,* 是 MsAccess 的通配符,而不是 %。
对于 OleDb,通配符必须是 %
,而不是 *
。 MS Access 的这个问题已在 SO 上多次讨论过。这里有 2 个例子:***.com/questions/3193350/… 和 ***.com/questions/5166907/…以上是关于查询Access数据库的主要内容,如果未能解决你的问题,请参考以下文章