当您在 Microsoft Access 应用程序本身 (MSACCESS.EXE) 中创建“参数查询”时,即 SQL 代码如下所示......
PARAMETERS ... ; SELECT ... FROM ...
...它被 ACE/Jet DAO(数据访问对象)视为“查询”,这是 MSACCESS 用于与 Access 数据库引擎(ACE 或 Jet)进行通信的技术。您可以在 Access 中运行查询并收到输入参数值的提示,也可以在 VBA 中使用 DAO QueryDef 对象并将参数值传递到该 QueryDef 对象的 .Parameters 集合。
.NET 项目中的“数据集”数据源的行为有所不同,因为它们使用 System.Data.OleDb,并且 ACE/Jet OLEDB 提供程序不会将这些查询分类为“视图”。相反,它将它们分类为“[存储]过程”。因此,如果您要打开 OleDbConnection 并执行以下操作
DataTable dtViews = con.GetSchema("Views")
那么查询将不会显示在结果列表中。这就是为什么您无法在 Visual Studio 数据源向导的“视图”下看到它。
但是,如果您这样做,它确实会显示
DataTable dtProcedures = con.GetSchema("Procedures")
因此,您可以使用现有的 Access“参数查询”,将其视为 .NET 代码中的存储过程,例如,
using (var cmd = new OleDbCommand())
{
cmd.Connection = con; // an open OleDbConnection to the database
cmd.CommandText = "vw_CustomerOrderYear";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("OrderYear", OleDbType.Integer).Value = 2014;
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
Console.WriteLine(rdr[0]);
}
}
}